From e29b238161559f7376af7501e7261b276243fa8c Mon Sep 17 00:00:00 2001 From: misch334 <259832695+misch334@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:38:40 +0100 Subject: [PATCH] fix orderby in combination with parentheses / increased expression level --- .../services/search/services/parse.spec.ts | 26 +++++++++++++++++++ .../src/services/search/services/parse.ts | 4 +-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/apps/server/src/services/search/services/parse.spec.ts b/apps/server/src/services/search/services/parse.spec.ts index 3988d620c5..cd59ce7f09 100644 --- a/apps/server/src/services/search/services/parse.spec.ts +++ b/apps/server/src/services/search/services/parse.spec.ts @@ -234,6 +234,32 @@ describe("Parser", () => { expect(rootExp.limit).toBe(2); expect(rootExp.subExpression).toBeInstanceOf(AndExp); }); + + describe("orderBy with level > 0", () => { + it("and grouping parentheses should parse without error", () => { + const searchContext = new SearchContext(); + const rootExp = parseInternal( + { + fulltextTokens: [], + expressionTokens: tokens(["#foo", "and" , ["#bar", "or", "#baz", ], "orderby", "#priority", "desc"]), + searchContext + } + ); + expect(searchContext.error).toBeNull(); + }); + + it("and not() should parse without error", () => { + const searchContext = new SearchContext(); + const rootExp = parseInternal( + { + fulltextTokens: [], + expressionTokens: tokens(["#foo", "and" , "not", [ "#bar", "=", "baz" ], "orderby", "#priority", "desc"]) , + searchContext + } + ); + expect(searchContext.error).toBeNull(); + }); + }); }); describe("Invalid expressions", () => { diff --git a/apps/server/src/services/search/services/parse.ts b/apps/server/src/services/search/services/parse.ts index e6381af308..f2ddf31647 100644 --- a/apps/server/src/services/search/services/parse.ts +++ b/apps/server/src/services/search/services/parse.ts @@ -361,7 +361,7 @@ function getExpression(tokens: TokenData[], searchContext: SearchContext, level for (i = 0; i < tokens.length; i++) { if (Array.isArray(tokens[i])) { - const expression = getExpression(tokens[i] as unknown as TokenData[], searchContext, level++); + const expression = getExpression(tokens[i] as unknown as TokenData[], searchContext, level + 1); if (expression) { expressions.push(expression); } @@ -402,7 +402,7 @@ function getExpression(tokens: TokenData[], searchContext: SearchContext, level } const tokenArray = tokens[i] as unknown as TokenData[]; - const expression = getExpression(tokenArray, searchContext, level++); + const expression = getExpression(tokenArray, searchContext, level + 1); if (!expression) { return; }