diff --git a/lib/MySQL/translator.js b/lib/MySQL/translator.js index b67361f..18acdf0 100644 --- a/lib/MySQL/translator.js +++ b/lib/MySQL/translator.js @@ -402,15 +402,27 @@ class MySqlTranslator extends sqlTranslator_1.SqlTranslator { else if (attr2 === '$length') { // json length const length = o[attr2]; - (0, assert_1.default)(typeof length == 'number'); if (stmt2) { stmt2 += ' and '; } - if (p) { - stmt2 += `(JSON_LENGTH(${alias}.${attr}->>"$${p}") = ${length})`; + if (typeof length === 'number') { + if (p) { + stmt2 += `(JSON_LENGTH(${alias}.${attr}->>"$${p}") = ${length})`; + } + else { + stmt2 += `(JSON_LENGTH(${alias}.${attr}) = ${length})`; + } } else { - stmt2 += `(JSON_LENGTH(${alias}.${attr})= ${length})`; + (0, assert_1.default)(typeof length === 'object'); + const op = Object.keys(length)[0]; + (0, assert_1.default)(op.startsWith('$')); + if (p) { + stmt2 += `(JSON_LENGTH(${alias}.${attr}->>"$${p}") ${this.translatePredicate(op, length[op])})`; + } + else { + stmt2 += `(JSON_LENGTH(${alias}.${attr}) ${this.translatePredicate(op, length[op])})`; + } } } else if (attr2.startsWith('$')) { diff --git a/src/MySQL/translator.ts b/src/MySQL/translator.ts index cb9a38d..f830af3 100644 --- a/src/MySQL/translator.ts +++ b/src/MySQL/translator.ts @@ -437,7 +437,7 @@ export class MySqlTranslator extends Sql stmt2 += `(JSON_CONTAINS(${alias}.${attr}->>"$${p}", CAST('${value}' AS JSON)))`; } else { - stmt2 += `(JSON_CONTAINS(${alias}.${attr}, CAST('${value}' AS JSON)))`; + stmt2 += `(JSON_CONTAINS(${alias}.${attr}, CAST('${value}' AS JSON)))`; } } else if (attr2 === '$overlaps') { @@ -450,21 +450,33 @@ export class MySqlTranslator extends Sql stmt2 += `(JSON_OVERLAPS(${alias}.${attr}->>"$${p}", CAST('${value}' AS JSON)))`; } else { - stmt2 += `(JSON_OVERLAPS(${alias}.${attr}, CAST('${value}' AS JSON)))`; + stmt2 += `(JSON_OVERLAPS(${alias}.${attr}, CAST('${value}' AS JSON)))`; } } else if (attr2 === '$length') { // json length const length = o[attr2]; - assert (typeof length == 'number'); if (stmt2) { stmt2 += ' and '; } - if (p) { - stmt2 += `(JSON_LENGTH(${alias}.${attr}->>"$${p}") = ${length})`; + if (typeof length === 'number') { + if (p) { + stmt2 += `(JSON_LENGTH(${alias}.${attr}->>"$${p}") = ${length})`; + } + else { + stmt2 += `(JSON_LENGTH(${alias}.${attr}) = ${length})`; + } } else { - stmt2 += `(JSON_LENGTH(${alias}.${attr})= ${length})`; + assert (typeof length === 'object'); + const op = Object.keys(length)[0]; + assert(op.startsWith('$')); + if (p) { + stmt2 += `(JSON_LENGTH(${alias}.${attr}->>"$${p}") ${this.translatePredicate(op, length[op])})`; + } + else { + stmt2 += `(JSON_LENGTH(${alias}.${attr}) ${this.translatePredicate(op, length[op])})`; + } } } else if (attr2.startsWith('$')) { diff --git a/test/testMySQLStore.ts b/test/testMySQLStore.ts index c5c8dff..e76e705 100644 --- a/test/testMySQLStore.ts +++ b/test/testMySQLStore.ts @@ -1887,6 +1887,25 @@ describe('test mysqlstore', function () { } } }, context, {}); + + const row10 = await store.select('oper', { + data: { + id: 1, + data: { + name: 1, + price: 1, + }, + }, + filter: { + data: { + price: { + $length: { + $gt: 3, + }, + }, + } + } + }, context, {}); await context.commit(); assert(row.length === 1); @@ -1898,6 +1917,7 @@ describe('test mysqlstore', function () { assert(row7.length === 1); assert(row8.length === 1); assert(row9.length === 1); + assert(row10.length === 0); // console.log(JSON.stringify(row7)); });