From 858072cc10333e98bb7b2cfee293aaa299990c22 Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 4 Apr 2021 23:13:18 +0200 Subject: [PATCH] fix lexer to parse correctly quoted empty strings, #1825 --- spec/search/lexer.spec.js | 14 +++++++++++++- src/services/search/services/lex.js | 6 +++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/spec/search/lexer.spec.js b/spec/search/lexer.spec.js index d19d26994..854e785eb 100644 --- a/spec/search/lexer.spec.js +++ b/spec/search/lexer.spec.js @@ -87,14 +87,16 @@ describe("Lexer expression", () => { .toEqual(["#label", "*=*", "text"]); }); - it("simple label operator with in quotes and without", () => { + it("simple label operator with in quotes", () => { expect(lex("#label*=*'text'").expressionTokens) .toEqual([ {token: "#label", inQuotes: false, startIndex: 0, endIndex: 5}, {token: "*=*", inQuotes: false, startIndex: 6, endIndex: 8}, {token: "text", inQuotes: true, startIndex: 10, endIndex: 13} ]); + }); + it("simple label operator with param without quotes", () => { expect(lex("#label*=*text").expressionTokens) .toEqual([ {token: "#label", inQuotes: false, startIndex: 0, endIndex: 5}, @@ -103,6 +105,16 @@ describe("Lexer expression", () => { ]); }); + it("simple label operator with empty string param", () => { + expect(lex("#label = ''").expressionTokens) + .toEqual([ + {token: "#label", inQuotes: false, startIndex: 0, endIndex: 5}, + {token: "=", inQuotes: false, startIndex: 7, endIndex: 7}, + // weird case for empty strings which ends up with endIndex < startIndex :-( + {token: "", inQuotes: true, startIndex: 10, endIndex: 9} + ]); + }); + it("note. prefix also separates fulltext from expression", () => { expect(lex(`hello fulltext note.labels.capital = Prague`).expressionTokens.map(t => t.token)) .toEqual(["note", ".", "labels", ".", "capital", "=", "prague"]); diff --git a/src/services/search/services/lex.js b/src/services/search/services/lex.js index bb80876e5..5234900f7 100644 --- a/src/services/search/services/lex.js +++ b/src/services/search/services/lex.js @@ -21,8 +21,8 @@ function lex(str) { } } - function finishWord(endIndex) { - if (currentWord === '') { + function finishWord(endIndex, createAlsoForEmptyWords = false) { + if (currentWord === '' && !createAlsoForEmptyWords) { return; } @@ -71,7 +71,7 @@ function lex(str) { } } else if (quotes === chr) { - finishWord(i - 1); + finishWord(i - 1, true); quotes = false; }