diff --git a/frontend/src/metabase/lib/expressions/resolver.js b/frontend/src/metabase/lib/expressions/resolver.js index 23eb802c6b28460e5442093f22ae80ca29d8578a..8793240417364920bc6afb3c07a855c3037ce887 100644 --- a/frontend/src/metabase/lib/expressions/resolver.js +++ b/frontend/src/metabase/lib/expressions/resolver.js @@ -48,6 +48,9 @@ const isCompatible = (a, b) => { if (a === "aggregation" && b === "number") { return true; } + if (a === "number" && b === "aggregation") { + return true; + } return false; }; diff --git a/frontend/test/metabase/lib/expressions/recursive-parser.unit.spec.js b/frontend/test/metabase/lib/expressions/recursive-parser.unit.spec.js index e252469790ef76e7a046f2b556f0543001024dcb..6aa6b6fc4375b45cd6486de1840e887cdd7ba164 100644 --- a/frontend/test/metabase/lib/expressions/recursive-parser.unit.spec.js +++ b/frontend/test/metabase/lib/expressions/recursive-parser.unit.spec.js @@ -201,6 +201,20 @@ describe("metabase/lib/expressions/recursive-parser", () => { expect(aggregation("1+CumulativeCount")).toEqual(["+", 1, ["cum-count"]]); }); + it("should handle aggregation with another function", () => { + const type = "aggregation"; + const aggregation = expr => resolve(parse(expr), type, mockResolve); + + const A = ["dimension", "A"]; + const B = ["dimension", "B"]; + + expect(aggregation("floor(Sum(A))")).toEqual(["floor", ["sum", A]]); + expect(aggregation("round(Distinct(B)/2)")).toEqual([ + "round", + ["/", ["distinct", B], 2], + ]); + }); + it("should prioritize existing metrics over functions", () => { const mockResolve = (kind, name) => { if (name === "Count" || "ABC".indexOf(name) >= 0) {