diff --git a/src/query/QueryEvaluator.test.ts b/src/query/QueryEvaluator.test.ts index 999103170..84716fa89 100644 --- a/src/query/QueryEvaluator.test.ts +++ b/src/query/QueryEvaluator.test.ts @@ -29,10 +29,9 @@ type scenario = { describe('QueryEvaluator', () => { const evaluator = new QueryEvaluator(); - it('throw on unknown literal', () => { + it('skip on unknown literal', () => { const parsedQuery = evaluator.parse('unknown @> "my-service"'); - - expect(() => {evaluator.evaluate(parsedQuery, {})}).toThrow('identifier unknown does not exist'); + expect(evaluator.evaluate(parsedQuery, {})).toBe(false) }); it('throw on unknown operator', () => { @@ -95,6 +94,21 @@ describe('QueryEvaluator', () => { { context: { tags: ['foo', 'baz'] }, expectedResult: true }, ], }, + { + query: 'folderTitle @> "foo"', + examples: [ + { context: { folderTitle: 'test' }, expectedResult: false }, + { context: { folderTitle: 'foobar' }, expectedResult: true }, + ] + }, + { + query: 'folderTitle @> "foo" && tags @> "bar"', + examples: [ + { context: { folderTitle: 'test' }, expectedResult: false }, + { context: { folderTitle: 'foobar' }, expectedResult: false }, + { context: { folderTitle: 'foobar', tags: ['foo', 'bar', 'baz'] }, expectedResult: true }, + ] + } ]; testCases.forEach(testCase => { diff --git a/src/query/QueryEvaluator.ts b/src/query/QueryEvaluator.ts index b9029cb31..748ddc1b3 100644 --- a/src/query/QueryEvaluator.ts +++ b/src/query/QueryEvaluator.ts @@ -18,13 +18,7 @@ import jsep from 'jsep'; export type EvaluationContext = Record; -const includes = (haystack: any, needle: any): boolean => { - if (!Array.isArray(haystack)) { - throw Error(`@> operator can only be used on an array`); - } - - return (haystack as any[]).includes(needle); -}; +const includes = (haystack: string | string[], needle: string): boolean => haystack.includes(needle); export class QueryEvaluator { constructor() { @@ -43,10 +37,7 @@ export class QueryEvaluator { case 'BinaryExpression': return this.evaluateBinaryExpression(root as jsep.BinaryExpression, context); case 'Identifier': - if (!context.hasOwnProperty((root as jsep.Identifier).name)) { - throw Error(`identifier ${(root as jsep.Identifier).name} does not exist`); - } - + if (!context.hasOwnProperty((root as jsep.Identifier).name)) return '' return context[(root as jsep.Identifier).name]; case 'Literal': return (root as jsep.Literal).value;