diff --git a/packages/filterparser/src/parseFilter.ts b/packages/filterparser/src/parseFilter.ts index d5ccd2909..fbc224280 100644 --- a/packages/filterparser/src/parseFilter.ts +++ b/packages/filterparser/src/parseFilter.ts @@ -52,6 +52,18 @@ const binaryCondition = }; }; +const simpleEqualCondition = () => value => ({ + conditionType: 'binary', + operator: '=', + left: { + exprType: 'placeholder', + }, + right: { + exprType: 'value', + value, + }, +}); + const likeCondition = (conditionType, likeString) => value => ({ conditionType, left: { @@ -348,6 +360,8 @@ const createParser = (filterBehaviour: FilterBehaviour) => { objectid: () => token(P.regexp(/ObjectId\(['"]?[0-9a-f]{24}['"]?\)/)).desc('ObjectId'), + objectidstr: () => token(P.regexp(/[0-9a-f]{24}/)).desc('ObjectId string'), + hexstring: () => token(P.regexp(/0x(([0-9a-fA-F][0-9a-fA-F])+)/, 1)) .map(x => ({ @@ -366,6 +380,7 @@ const createParser = (filterBehaviour: FilterBehaviour) => { value: r => P.alt(...allowedValues.map(x => r[x])), valueTestEq: r => r.value.map(binaryCondition('=')), hexTestEq: r => r.hexstring.map(binaryCondition('=')), + valueTestObjectIdStr: r => r.objectidstr.map(simpleEqualCondition()), valueTestStr: r => r.value.map(likeCondition('like', '%#VALUE#%')), valueTestNum: r => r.number.map(numberTestCondition()), valueTestObjectId: r => r.objectid.map(objectIdTestCondition()), @@ -546,12 +561,13 @@ const createParser = (filterBehaviour: FilterBehaviour) => { } } - if (filterBehaviour.allowNumberDualTesting) { - allowedElements.push('valueTestNum'); + if (filterBehaviour.allowObjectIdTesting) { + allowedElements.push('valueTestObjectIdStr'); + allowedElements.push('valueTestObjectId'); } - if (filterBehaviour.allowObjectIdTesting) { - allowedElements.push('valueTestObjectId'); + if (filterBehaviour.allowNumberDualTesting) { + allowedElements.push('valueTestNum'); } // must be last diff --git a/plugins/dbgate-plugin-mongo/src/frontend/convertToMongoCondition.js b/plugins/dbgate-plugin-mongo/src/frontend/convertToMongoCondition.js index f197152ad..5de7c3ef4 100644 --- a/plugins/dbgate-plugin-mongo/src/frontend/convertToMongoCondition.js +++ b/plugins/dbgate-plugin-mongo/src/frontend/convertToMongoCondition.js @@ -11,6 +11,21 @@ function convertRightOperandToMongoValue(right) { throw new Error(`Unknown right operand type ${right.exprType}`); } +function convertRightEqualOperandToMongoCondition(right) { + if (right.exprType != 'value') { + throw new Error(`Unknown right operand type ${right.exprType}`); + } + const { value } = right; + if (/^[0-9a-fA-F]{24}$/.test(value)) { + return { + $in: [value, { $oid: value }], + }; + } + return { + $eq: value, + }; +} + function convertToMongoCondition(filter) { if (!filter) { return null; @@ -28,9 +43,7 @@ function convertToMongoCondition(filter) { switch (filter.operator) { case '=': return { - [convertLeftOperandToMongoColumn(filter.left)]: { - $eq: convertRightOperandToMongoValue(filter.right), - }, + [convertLeftOperandToMongoColumn(filter.left)]: convertRightEqualOperandToMongoCondition(filter.right), }; case '!=': case '<>':