From 7d58da3dc578ea200abde77678a643799f3f3a60 Mon Sep 17 00:00:00 2001 From: Xc Date: Wed, 11 Jan 2023 16:14:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=BE=E5=BC=80=E4=BA=86filter=E4=B9=8B?= =?UTF-8?q?=E9=97=B4=E9=80=BB=E8=BE=91=E5=85=B3=E7=B3=BB=E7=9A=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/store/filter.js | 56 ++++++++++++++++++++++++--------------------- src/store/filter.ts | 56 ++++++++++++++++++++++++--------------------- test/testFilter.ts | 20 +++++++++++++--- 3 files changed, 77 insertions(+), 55 deletions(-) diff --git a/lib/store/filter.js b/lib/store/filter.js index cf1b2c7..29d90f2 100644 --- a/lib/store/filter.js +++ b/lib/store/filter.js @@ -502,7 +502,7 @@ function judgeFilter2ValueRelation(entity, schema, attr, filter, conditionalFilt var logicQueries = filter[attr2]; var results = logicQueries.map(function (logicQuery) { return judgeFilter2ValueRelation(entity, schema, attr, logicQuery, conditionalFilterAttrValue, contained); }); // 如果filter的多个算子是and关系,则只要有一个包含此条件就是包含,只要有一个与此条件相斥就是相斥 - // 如果filter的多个算子是or关系,则必须所有的条件都包含此条件才是包含,必须所有的条件都与此条件相斥才是相斥 + // 如果filter的多个算子是or关系,则必须所有的条件都包含此条件才是包含,必须所有的条件都与此条件相斥才是相斥 if (attr2 === '$and') { if (results.includes(true)) { return true; @@ -520,25 +520,17 @@ function judgeFilter2ValueRelation(entity, schema, attr, filter, conditionalFilt } case '$not': { /* - * 若filter的not条件被conditionalFilterAttrValue包容,则说明两者互斥 - * 若filter的not条件被conditionalFilterAttrValue的not条件所包容,则说明此条件包容conditionalFilterAttrValue - * 但两条规则都没法应用,会无限递归 + * 若filter的not条件被conditionalFilterAttrValue条件包容,则说明两者互斥 + * filter包容conditionalFilterAttrValue条件暂时无法由其not条件推论出来 */ var logicQuery = filter[attr2]; - /* if (contained && judgeFilterRelation(entity, schema, { - [attr2]: { - $not: conditionalFilterAttrValue - } - }, logicQuery, contained)) { - return true; - } */ - if (!contained && judgeFilterRelation(entity, schema, (_a = {}, _a[attr2] = conditionalFilterAttrValue, _a), logicQuery, contained)) { + if (!contained && judgeFilterRelation(entity, schema, logicQuery, (_a = {}, _a[attr] = conditionalFilterAttrValue, _a), true)) { return true; } break; } default: { - break; + (0, assert_1.default)(false); } } } @@ -566,6 +558,7 @@ function judgeFilter2ValueRelation(entity, schema, attr, filter, conditionalFilt } } } + // 到这里说明无法判断相容或者相斥,安全起见全返回false return false; } /** @@ -584,13 +577,15 @@ function judgeFilterRelation(entity, schema, filter, conditionalFilter, containe var logicQueries = conditionalFilter[attr]; var results = logicQueries.map(function (logicQuery) { return judgeFilterRelation(entity, schema, filter, logicQuery, contained); }); if (contained) { - // 如果是包容关系,and只需要一个被包容,or需要全部被包容 - return (attr === '$and' && results.includes(true) || attr === '$or' && !results.includes(false)); + // 如果是包容关系,or和and需要全部被包容 + if (results.includes(false)) { + return false; + } } else if (!contained) { - // 如果是相斥关系,则无论and还是or,conditionalFilter中的任何一个查询条件都应当与filter所相斥 - if (!results.includes(true)) { - return false; + // 如果是相斥关系,and只需要和一个相斥,or需要和全部相斥 + if (attr === '$and' && results.includes(true) || attr === '$or' && !results.includes(false)) { + return true; } } else { @@ -600,12 +595,21 @@ function judgeFilterRelation(entity, schema, filter, conditionalFilter, containe } case '$not': { /** - * 若filter与conditionalFilter not所定义的部分相斥,则filter与conditionalFilter一定不相容 - * (一定相容的判断比较麻烦,先不写了) - * 若filter被conditionalFilter not所定义的部分包容,则filter与conditionalFilter相斥 + * 若filter与conditionalFilter not所定义的部分相斥,则filter与conditionalFilter相容 + * 若filter将conditionalFilter not所定义的部分包容,则filter与conditionalFilter相斥 */ var logicQuery = conditionalFilter[attr]; - return (!contained && judgeFilterRelation(entity, schema, logicQuery, filter, contained) || false); + if (contained) { + if (!judgeFilterRelation(entity, schema, filter, logicQuery, false)) { + return false; + } + } + else { + if (judgeFilterRelation(entity, schema, filter, logicQuery, true)) { + return true; + } + } + break; } default: { throw new Error("\u6682\u4E0D\u652F\u6301\u7684\u903B\u8F91\u7B97\u5B50".concat(attr)); @@ -651,8 +655,8 @@ function judgeFilterRelation(entity, schema, filter, conditionalFilter, containe * @returns */ function contains(entity, schema, filter, conditionalFilter) { - // return judgeFilterRelation(entity, schema, filter, conditionalFilter, true); - return false; + return judgeFilterRelation(entity, schema, filter, conditionalFilter, true); + // return false; } exports.contains = contains; /** @@ -671,8 +675,8 @@ exports.contains = contains; */ function repel(entity, schema, filter1, filter2) { // todo - // judgeFilterRelation(entity, schema, filter1, filter2, false); - return false; + return judgeFilterRelation(entity, schema, filter1, filter2, false); + // return false; } exports.repel = repel; /** diff --git a/src/store/filter.ts b/src/store/filter.ts index 70ea495..0874f73 100644 --- a/src/store/filter.ts +++ b/src/store/filter.ts @@ -515,7 +515,7 @@ function judgeFilter2ValueRelation( (logicQuery) => judgeFilter2ValueRelation(entity, schema, attr, logicQuery, conditionalFilterAttrValue, contained) ); // 如果filter的多个算子是and关系,则只要有一个包含此条件就是包含,只要有一个与此条件相斥就是相斥 - // 如果filter的多个算子是or关系,则必须所有的条件都包含此条件才是包含,必须所有的条件都与此条件相斥才是相斥 + // 如果filter的多个算子是or关系,则必须所有的条件都包含此条件才是包含,必须所有的条件都与此条件相斥才是相斥 if (attr2 === '$and') { if (results.includes(true)) { return true; @@ -533,26 +533,18 @@ function judgeFilter2ValueRelation( } case '$not': { /* - * 若filter的not条件被conditionalFilterAttrValue包容,则说明两者互斥 - * 若filter的not条件被conditionalFilterAttrValue的not条件所包容,则说明此条件包容conditionalFilterAttrValue - * 但两条规则都没法应用,会无限递归 + * 若filter的not条件被conditionalFilterAttrValue条件包容,则说明两者互斥 + * filter包容conditionalFilterAttrValue条件暂时无法由其not条件推论出来 */ const logicQuery = filter[attr2] as ED[T]['Selection']['filter']; - /* if (contained && judgeFilterRelation(entity, schema, { - [attr2]: { - $not: conditionalFilterAttrValue - } - }, logicQuery, contained)) { - return true; - } */ - if (!contained && judgeFilterRelation(entity, schema, { [attr2]: conditionalFilterAttrValue }, logicQuery, contained)) { + if (!contained && judgeFilterRelation(entity, schema, logicQuery, { [attr]: conditionalFilterAttrValue }, true)) { return true; } break; } default: { - break; + assert(false); } } } @@ -581,6 +573,7 @@ function judgeFilter2ValueRelation( } } + // 到这里说明无法判断相容或者相斥,安全起见全返回false return false; } /** @@ -606,13 +599,15 @@ function judgeFilterRelation( (logicQuery) => judgeFilterRelation(entity, schema, filter, logicQuery, contained) ); if (contained) { - // 如果是包容关系,and只需要一个被包容,or需要全部被包容 - return (attr === '$and' && results.includes(true) || attr === '$or' && !results.includes(false)); + // 如果是包容关系,or和and需要全部被包容 + if(results.includes(false)) { + return false; + } } else if (!contained) { - // 如果是相斥关系,则无论and还是or,conditionalFilter中的任何一个查询条件都应当与filter所相斥 - if (!results.includes(true)) { - return false; + // 如果是相斥关系,and只需要和一个相斥,or需要和全部相斥 + if (attr === '$and' && results.includes(true) || attr === '$or' && !results.includes(false)) { + return true; } } else { @@ -622,12 +617,21 @@ function judgeFilterRelation( } case '$not': { /** - * 若filter与conditionalFilter not所定义的部分相斥,则filter与conditionalFilter一定不相容 - * (一定相容的判断比较麻烦,先不写了) - * 若filter被conditionalFilter not所定义的部分包容,则filter与conditionalFilter相斥 + * 若filter与conditionalFilter not所定义的部分相斥,则filter与conditionalFilter相容 + * 若filter将conditionalFilter not所定义的部分包容,则filter与conditionalFilter相斥 */ const logicQuery = conditionalFilter[attr] as ED[T]['Selection']['filter']; - return (!contained && judgeFilterRelation(entity, schema, logicQuery, filter, contained) || false); + if (contained) { + if (!judgeFilterRelation(entity, schema, filter, logicQuery, false)) { + return false; + } + } + else { + if (judgeFilterRelation(entity, schema, filter, logicQuery, true)) { + return true; + } + } + break; } default: { throw new Error(`暂不支持的逻辑算子${attr}`); @@ -678,8 +682,8 @@ export function contains( schema: StorageSchema, filter: ED[T]['Selection']['filter'], conditionalFilter: ED[T]['Selection']['filter']) { - // return judgeFilterRelation(entity, schema, filter, conditionalFilter, true); - return false; + return judgeFilterRelation(entity, schema, filter, conditionalFilter, true); + // return false; } /** @@ -702,8 +706,8 @@ export function repel( filter1: ED[T]['Selection']['filter'], filter2: ED[T]['Selection']['filter']) { // todo - // judgeFilterRelation(entity, schema, filter1, filter2, false); - return false; + return judgeFilterRelation(entity, schema, filter1, filter2, false); + // return false; } /** diff --git a/test/testFilter.ts b/test/testFilter.ts index 264f289..5fb7d02 100644 --- a/test/testFilter.ts +++ b/test/testFilter.ts @@ -3,7 +3,7 @@ import { judgeValueRelation, contains, repel } from '../src/store/filter'; import { storageSchema } from '../src/base-app-domain'; -/* assert(judgeValueRelation({ $gte: 2 }, { $gt: 2 }, false) === false); +assert(judgeValueRelation({ $gte: 2 }, { $gt: 2 }, false) === false); assert(judgeValueRelation({ $gte: 'ddddd'}, { $lte: 'dddde'}, false) === false); assert(judgeValueRelation({ $eq: 2}, {$lt: 1}, true) === false); assert(judgeValueRelation({ $in: [1, 2, 3, 4]}, {$gt: 0}, true) === true); @@ -19,7 +19,7 @@ assert(judgeValueRelation({ $nin: [2, 3, 4]}, {$exists: false}, true) === false) assert(judgeValueRelation({ $nin: [2, 3, 4]}, {$exists: false}, false) === false); assert(judgeValueRelation({ $startsWith: 'xuchang'}, {$startsWith: 'xuc'}, true) === true); assert(judgeValueRelation({ $startsWith: 'xuchang'}, {$startsWith: 'xuchang2'}, true) === false); -assert(judgeValueRelation({ $startsWith: 'xuchang'}, {$startsWith: 'xu2c'}, false) === true); */ +assert(judgeValueRelation({ $startsWith: 'xuchang'}, {$startsWith: 'xu2c'}, false) === true); assert(contains('operEntity', storageSchema, { entity: 'ddd', @@ -122,4 +122,18 @@ assert(repel('modi', storageSchema, { }, }, { entity: 'ddd', -}) === true); \ No newline at end of file +}) === true); + + +assert(repel('modi', storageSchema, { + entityId: '888' +}, { + entity: 'ddd', +}) === false); + + +assert(contains('modi', storageSchema, { + entityId: '888' +}, { + entity: 'ddd', +}) === false); \ No newline at end of file