diff --git a/spec/search/parser.spec.ts b/spec/search/parser.spec.ts index cf5d3315d..7774a8d1e 100644 --- a/spec/search/parser.spec.ts +++ b/spec/search/parser.spec.ts @@ -3,6 +3,7 @@ // but we access properties like "subExpressions" which is not defined in the "Expression" class. import Expression from "../../src/services/search/expressions/expression.js"; +import OrderByAndLimitExp from "../../src/services/search/expressions/order_by_and_limit.js"; import SearchContext from "../../src/services/search/search_context.js"; import parse from "../../src/services/search/services/parse.js"; @@ -244,6 +245,21 @@ describe("Parser", () => { expect(thirdSub.constructor.name).toEqual("AttributeExistsExp"); expect(thirdSub.attributeName).toEqual("fourth"); }); + + it("parses limit without order by", () => { + const rootExp = parse({ + fulltextTokens: tokens(["hello", "hi"]), + expressionTokens: [], + searchContext: new SearchContext({ + excludeArchived: true, + limit: 2 + }) + }); + + expect(rootExp).toBeInstanceOf(OrderByAndLimitExp); + expect(rootExp.limit).toBe(2); + expect(rootExp.subExpression).toBeInstanceOf(AndExp); + }); }); describe("Invalid expressions", () => { diff --git a/src/services/search/services/parse.ts b/src/services/search/services/parse.ts index 25ff8395a..1a0fcce23 100644 --- a/src/services/search/services/parse.ts +++ b/src/services/search/services/parse.ts @@ -441,6 +441,12 @@ function parse({ fulltextTokens, expressionTokens, searchContext }: { fulltextTo expression ]); + if (searchContext.limit && !searchContext.orderBy) { + const filterExp = exp; + exp = new OrderByAndLimitExp([], searchContext.limit || undefined ); + (exp as any).subExpression = filterExp; + } + if (searchContext.orderBy && searchContext.orderBy !== "relevancy") { const filterExp = exp;