| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  | const SearchContext = require("../../src/services/search/search_context.js"); | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  | const parse = require('../../src/services/search/services/parse.js'); | 
					
						
							| 
									
										
										
										
											2020-05-20 00:03:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  | function tokens(toks, cur = 0) { | 
					
						
							|  |  |  |     return toks.map(arg => { | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  |         if (Array.isArray(arg)) { | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             return tokens(arg, cur); | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             cur += arg.length; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  |             return { | 
					
						
							|  |  |  |                 token: arg, | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |                 inQuotes: false, | 
					
						
							|  |  |  |                 startIndex: cur - arg.length, | 
					
						
							|  |  |  |                 endIndex: cur - 1 | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  |             }; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  | function assertIsArchived(exp) { | 
					
						
							|  |  |  |     expect(exp.constructor.name).toEqual("PropertyComparisonExp"); | 
					
						
							|  |  |  |     expect(exp.propertyName).toEqual("isArchived"); | 
					
						
							|  |  |  |     expect(exp.operator).toEqual("="); | 
					
						
							|  |  |  |     expect(exp.comparedValue).toEqual("false"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-20 00:03:33 +02:00
										 |  |  | describe("Parser", () => { | 
					
						
							|  |  |  |     it("fulltext parser without content", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             fulltextTokens: tokens(["hello", "hi"]), | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |             expressionTokens: [], | 
					
						
							| 
									
										
										
										
											2020-09-23 21:05:26 +02:00
										 |  |  |             searchContext: new SearchContext({includeNoteContent: false, excludeArchived: true}) | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-05-20 00:03:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-20 00:15:08 +02:00
										 |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							| 
									
										
										
										
											2020-09-23 21:05:26 +02:00
										 |  |  |         expect(rootExp.subExpressions[0].constructor.name).toEqual("PropertyComparisonExp"); | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("OrExp"); | 
					
						
							| 
									
										
										
										
											2021-04-16 23:00:08 +02:00
										 |  |  |         expect(rootExp.subExpressions[1].subExpressions[0].constructor.name).toEqual("BeccaFlatTextExp"); | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.subExpressions[1].subExpressions[0].tokens).toEqual(["hello", "hi"]); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("fulltext parser with content", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             fulltextTokens: tokens(["hello", "hi"]), | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |             expressionTokens: [], | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext({includeNoteContent: true}) | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("OrExp"); | 
					
						
							| 
									
										
										
										
											2020-08-20 00:15:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         const subs = rootExp.subExpressions[1].subExpressions; | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-16 23:00:08 +02:00
										 |  |  |         expect(subs[0].constructor.name).toEqual("BeccaFlatTextExp"); | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |         expect(subs[0].tokens).toEqual(["hello", "hi"]); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |         expect(subs[1].constructor.name).toEqual("NoteContentProtectedFulltextExp"); | 
					
						
							|  |  |  |         expect(subs[1].tokens).toEqual(["hello", "hi"]); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |         expect(subs[2].constructor.name).toEqual("NoteContentUnprotectedFulltextExp"); | 
					
						
							|  |  |  |         expect(subs[2].tokens).toEqual(["hello", "hi"]); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("simple label comparison", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#mylabel", "=", "text"]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext() | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].attributeType).toEqual("label"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].attributeName).toEqual("mylabel"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].comparator).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |     it("simple attribute negation", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         let rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#!mylabel"]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext() | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("NotExp"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].subExpression.constructor.name).toEqual("AttributeExistsExp"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].subExpression.attributeType).toEqual("label"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].subExpression.attributeName).toEqual("mylabel"); | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["~!myrelation"]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext() | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("NotExp"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].subExpression.constructor.name).toEqual("AttributeExistsExp"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].subExpression.attributeType).toEqual("relation"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].subExpression.attributeName).toEqual("myrelation"); | 
					
						
							| 
									
										
										
										
											2020-07-19 15:25:24 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |     it("simple label AND", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#first", "=", "text", "and", "#second", "=", "text"]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext(true) | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         const [firstSub, secondSub] = rootExp.subExpressions[1].subExpressions; | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(firstSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(firstSub.attributeName).toEqual("first"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(secondSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(secondSub.attributeName).toEqual("second"); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("simple label AND without explicit AND", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#first", "=", "text", "#second", "=", "text"]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext() | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         const [firstSub, secondSub] = rootExp.subExpressions[1].subExpressions; | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(firstSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(firstSub.attributeName).toEqual("first"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(secondSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(secondSub.attributeName).toEqual("second"); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("simple label OR", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#first", "=", "text", "or", "#second", "=", "text"]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext() | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("OrExp"); | 
					
						
							|  |  |  |         const [firstSub, secondSub] = rootExp.subExpressions[1].subExpressions; | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(firstSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(firstSub.attributeName).toEqual("first"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(secondSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(secondSub.attributeName).toEqual("second"); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("fulltext and simple label", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             fulltextTokens: tokens(["hello"]), | 
					
						
							|  |  |  |             expressionTokens: tokens(["#mylabel", "=", "text"]), | 
					
						
							| 
									
										
										
										
											2020-09-23 21:05:26 +02:00
										 |  |  |             searchContext: new SearchContext({excludeArchived: true}) | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							| 
									
										
										
										
											2020-09-23 21:05:26 +02:00
										 |  |  |         const [firstSub, secondSub, thirdSub] = rootExp.subExpressions; | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-23 21:05:26 +02:00
										 |  |  |         expect(firstSub.constructor.name).toEqual("PropertyComparisonExp"); | 
					
						
							|  |  |  |         expect(firstSub.propertyName).toEqual('isArchived'); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(secondSub.constructor.name).toEqual("OrExp"); | 
					
						
							| 
									
										
										
										
											2021-04-16 23:00:08 +02:00
										 |  |  |         expect(secondSub.subExpressions[0].constructor.name).toEqual("BeccaFlatTextExp"); | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(secondSub.subExpressions[0].tokens).toEqual(["hello"]); | 
					
						
							| 
									
										
										
										
											2020-09-23 21:05:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(thirdSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							|  |  |  |         expect(thirdSub.attributeName).toEqual("mylabel"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it("label sub-expression", () => { | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#first", "=", "text", "or", ["#second", "=", "text", "and", "#third", "=", "text"]]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext() | 
					
						
							| 
									
										
										
										
											2020-05-21 11:18:15 +02:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("OrExp"); | 
					
						
							|  |  |  |         const [firstSub, secondSub] = rootExp.subExpressions[1].subExpressions; | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(firstSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(firstSub.attributeName).toEqual("first"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(secondSub.constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         const [firstSubSub, secondSubSub] = secondSub.subExpressions; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(firstSubSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(firstSubSub.attributeName).toEqual("second"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 10:25:22 +02:00
										 |  |  |         expect(secondSubSub.constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							| 
									
										
										
										
											2020-05-20 23:20:39 +02:00
										 |  |  |         expect(secondSubSub.attributeName).toEqual("third"); | 
					
						
							| 
									
										
										
										
											2020-05-20 00:03:33 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  | describe("Invalid expressions", () => { | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  |     it("incomplete comparison", () => { | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |         const searchContext = new SearchContext(); | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         parse({ | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#first", "="]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |         expect(searchContext.error).toEqual('Misplaced or incomplete expression "="') | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it("comparison between labels is impossible", () => { | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |         let searchContext = new SearchContext(); | 
					
						
							|  |  |  |         searchContext.originalQuery = "#first = #second"; | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         parse({ | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#first", "=", "#second"]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |         expect(searchContext.error).toEqual(`Error near token "#second" in "#first = #second", it's possible to compare with constant only.`); | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |         searchContext = new SearchContext(); | 
					
						
							|  |  |  |         searchContext.originalQuery = "#first = note.relations.second"; | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         parse({ | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							| 
									
										
										
										
											2020-07-22 22:52:15 +02:00
										 |  |  |             expressionTokens: tokens(["#first", "=", "note", ".", "relations", "second"]), | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |         expect(searchContext.error).toEqual(`Error near token "note" in "#first = note.relations.second", it's possible to compare with constant only.`); | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 00:01:07 +02:00
										 |  |  |         const rootExp = parse({ | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  |             fulltextTokens: [], | 
					
						
							|  |  |  |             expressionTokens: [ | 
					
						
							|  |  |  |                 { token: "#first", inQuotes: false }, | 
					
						
							|  |  |  |                 { token: "=", inQuotes: false }, | 
					
						
							|  |  |  |                 { token: "#second", inQuotes: true }, | 
					
						
							|  |  |  |             ], | 
					
						
							| 
									
										
										
										
											2020-09-08 21:47:37 +02:00
										 |  |  |             searchContext: new SearchContext() | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 22:44:22 +02:00
										 |  |  |         expect(rootExp.constructor.name).toEqual("AndExp"); | 
					
						
							|  |  |  |         assertIsArchived(rootExp.subExpressions[0]); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].constructor.name).toEqual("LabelComparisonExp"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].attributeType).toEqual("label"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].attributeName).toEqual("first"); | 
					
						
							|  |  |  |         expect(rootExp.subExpressions[1].comparator).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2020-07-20 23:27:30 +02:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-09-23 21:05:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it("searching by relation without note property", () => { | 
					
						
							|  |  |  |         const searchContext = new SearchContext(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         parse({ | 
					
						
							|  |  |  |             fulltextTokens: [], | 
					
						
							|  |  |  |             expressionTokens: tokens(["~first", "=", "text", "-", "abc"]), | 
					
						
							|  |  |  |             searchContext | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 22:45:22 +01:00
										 |  |  |         expect(searchContext.error).toEqual('Relation can be compared only with property, e.g. ~relation.title=hello in ""') | 
					
						
							| 
									
										
										
										
											2020-09-23 21:05:26 +02:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-07-19 23:19:45 +02:00
										 |  |  | }); |