Skip to content
Snippets Groups Projects
Unverified Commit d6bc5e93 authored by metamben's avatar metamben Committed by GitHub
Browse files

Recursively nest expressions (#24404)

parent 42a3f338
No related branches found
No related tags found
No related merge requests found
...@@ -22,7 +22,7 @@ const questionDetails = { ...@@ -22,7 +22,7 @@ const questionDetails = {
}, },
}; };
describe.skip("issue 23862", () => { describe("issue 23862", () => {
beforeEach(() => { beforeEach(() => {
restore(); restore();
cy.signInAsAdmin(); cy.signInAsAdmin();
......
...@@ -100,13 +100,14 @@ ...@@ -100,13 +100,14 @@
"Pushes the `:source-table`/`:source-query`, `:expressions`, and `:joins` in the top-level of the query into a "Pushes the `:source-table`/`:source-query`, `:expressions`, and `:joins` in the top-level of the query into a
`:source-query` and updates `:expression` references and `:field` clauses with `:join-alias`es accordingly. See `:source-query` and updates `:expression` references and `:field` clauses with `:join-alias`es accordingly. See
tests for examples. This is used by the SQL QP to make sure expressions happen in a subselect." tests for examples. This is used by the SQL QP to make sure expressions happen in a subselect."
[{:keys [expressions], :as query}] [query]
(if (empty? expressions) (let [{:keys [expressions], :as query} (m/update-existing query :source-query nest-expressions)]
query (if (empty? expressions)
(let [{:keys [source-query], :as query} (nest-source query) query
query (rewrite-fields-and-expressions query) (let [{:keys [source-query], :as query} (nest-source query)
source-query (assoc source-query :expressions expressions)] query (rewrite-fields-and-expressions query)
(-> query source-query (assoc source-query :expressions expressions)]
(dissoc :source-query :expressions) (-> query
(assoc :source-query source-query) (dissoc :source-query :expressions)
add/add-alias-info)))) (assoc :source-query source-query)
add/add-alias-info)))))
...@@ -347,14 +347,22 @@ ...@@ -347,14 +347,22 @@
source.LONGITUDE AS LONGITUDE source.LONGITUDE AS LONGITUDE
source.PRICE AS PRICE source.PRICE AS PRICE
source.double_id AS double_id] source.double_id AS double_id]
:from [{:select [VENUES.ID AS ID :from [{:select [source.ID AS ID
VENUES.NAME AS NAME source.NAME AS NAME
VENUES.CATEGORY_ID AS CATEGORY_ID source.CATEGORY_ID AS CATEGORY_ID
VENUES.LATITUDE AS LATITUDE source.LATITUDE AS LATITUDE
VENUES.LONGITUDE AS LONGITUDE source.LONGITUDE AS LONGITUDE
VENUES.PRICE AS PRICE source.PRICE AS PRICE
(VENUES.ID * 2) AS double_id] source.double_id AS double_id]
:from [VENUES]} :from [{:select [VENUES.ID AS ID
VENUES.NAME AS NAME
VENUES.CATEGORY_ID AS CATEGORY_ID
VENUES.LATITUDE AS LATITUDE
VENUES.LONGITUDE AS LONGITUDE
VENUES.PRICE AS PRICE
(VENUES.ID * 2) AS double_id]
:from [VENUES]}
source]}
source] source]
:limit [1]} :limit [1]}
(-> (mt/mbql-query venues (-> (mt/mbql-query venues
...@@ -843,19 +851,24 @@ ...@@ -843,19 +851,24 @@
Q1.CC AS Q1__CC] Q1.CC AS Q1__CC]
:from [{:select [source.CATEGORY AS CATEGORY :from [{:select [source.CATEGORY AS CATEGORY
source.count AS count source.count AS count
(1 + 1) AS CC] source.CC AS CC]
:from [{:select [PRODUCTS.CATEGORY AS CATEGORY :from [{:select [source.CATEGORY AS CATEGORY
count (*) AS count] source.count AS count
:from [PRODUCTS] (1 + 1) AS CC]
:group-by [PRODUCTS.CATEGORY] :from [{:select [PRODUCTS.CATEGORY AS CATEGORY
:order-by [PRODUCTS.CATEGORY ASC]} count (*) AS count]
source]} source] :from [PRODUCTS]
:group-by [PRODUCTS.CATEGORY]
:order-by [PRODUCTS.CATEGORY ASC]}
source]}
source]}
source]
:left-join [{:select [source.CATEGORY AS CATEGORY :left-join [{:select [source.CATEGORY AS CATEGORY
source.count AS count source.count AS count
source.CC AS CC] source.CC AS CC]
:from [{:select [source.CATEGORY AS CATEGORY :from [{:select [source.CATEGORY AS CATEGORY
source.count AS count source.count AS count
(1 + 1) AS CC] (1 + 1) AS CC]
:from [{:select [PRODUCTS.CATEGORY AS CATEGORY :from [{:select [PRODUCTS.CATEGORY AS CATEGORY
count (*) AS count] count (*) AS count]
:from [PRODUCTS] :from [PRODUCTS]
......
...@@ -214,41 +214,68 @@ ...@@ -214,41 +214,68 @@
:limit 1})] :limit 1})]
(mt/with-native-query-testing-context query (mt/with-native-query-testing-context query
(is (partial= (mt/$ids venues (is (partial= (mt/$ids venues
{:fields [[:field %id {::add/source-table ::add/source {:fields
::add/source-alias "ID" [[:field %id #::add{:source-table ::add/source
::add/desired-alias "ID" :source-alias "ID"
::add/position 0}] :desired-alias "ID"
[:field "x_2" {:base-type :type/Float :position 0}]
::add/source-table ::add/source [:field "x_2" {:base-type :type/Float
::add/source-alias "x_2" ::add/source-table ::add/source
::add/desired-alias "x_2" ::add/source-alias "x_2"
::add/position 1}]] ::add/desired-alias "x_2"
:source-query {:expressions {"x" [:* ::add/position 1}]]
[:field %price {::add/source-table ::add/source :source-query
::add/source-alias "PRICE"}] {:expressions
4]} {"x" [:*
:fields [[:field %id {::add/source-table ::add/source [:field %price #::add{:source-table ::add/source
::add/source-alias "ID" :source-alias "PRICE"}]
::add/desired-alias "ID" 4]}
::add/position 0}] :fields
[:field "x" {:base-type :type/Float [[:field %id #::add{:source-table ::add/source
::add/source-table ::add/source :source-alias "ID"
::add/source-alias "x" :desired-alias "ID"}]
::add/desired-alias "x" [:field "x" {:base-type :type/Float
::add/position 1}] ::add/source-table ::add/source
[:expression "x" {::add/desired-alias "x_2" ::add/source-alias "x"
::add/position 2}]] ::add/desired-alias "x"}]
:source-query {:source-table $$venues [:expression "x" #::add{:desired-alias "x_2"}]]
:expressions {"x" [:* :source-query
[:field %price {::add/source-table $$venues {:fields
::add/source-alias "PRICE"}] [[:field %id #::add{:source-table ::add/source
2]} :source-alias "ID"
:fields [[:field %id {::add/source-table $$venues :desired-alias "ID"}]
::add/source-alias "ID" [:field "x" {:base-type :type/Float
::add/desired-alias "ID" ::add/source-table ::add/source
::add/position 0}] ::add/source-alias "x"
[:expression "x" {::add/desired-alias "x" ::add/desired-alias "x"}]]
::add/position 1}]]}} :source-query
{:source-table $$venues
:expressions
{"x" [:*
[:field %price #::add{:source-table $$venues
:source-alias "PRICE"
:desired-alias "PRICE"}]
2]}
:fields
[[:field %id #::add{:source-table $$venues
:source-alias "ID"
:desired-alias "ID"}]
[:field %name #::add{:source-table $$venues
:source-alias "NAME"
:desired-alias "NAME"}]
[:field %category_id #::add{:source-table $$venues
:source-alias "CATEGORY_ID"
:desired-alias "CATEGORY_ID"}]
[:field %latitude #::add{:source-table $$venues
:source-alias "LATITUDE"
:desired-alias "LATITUDE"}]
[:field %longitude #::add{:source-table $$venues
:source-alias "LONGITUDE"
:desired-alias "LONGITUDE"}]
[:field %price #::add{:source-table $$venues
:source-alias "PRICE"
:desired-alias "PRICE"}]
[:expression "x" #::add{:desired-alias "x"}]]}}}
:limit 1}) :limit 1})
(nest-expressions query)))))) (nest-expressions query))))))
(testing "Ignores source-query from joins (#20809)" (testing "Ignores source-query from joins (#20809)"
......
...@@ -267,6 +267,20 @@ ...@@ -267,6 +267,20 @@
{:aggregation [:count] {:aggregation [:count]
:breakout [$price]})))))))))) :breakout [$price]}))))))))))
(deftest grouped-expression-in-card-test
(testing "Nested grouped expressions work (#23862)."
(mt/with-temp Card [card {:dataset_query
(mt/mbql-query venues
{:aggregation [[:count]]
:breakout [[:expression "Price level"]]
:expressions {"Price level" [:case [[[:> $price 2] "expensive"]] {:default "budget"}]}
:limit 2})}]
(is (= [["budget" 81]
["expensive" 19]]
(mt/rows
(qp/process-query
(query-with-source-card card))))))))
(deftest card-id-native-source-queries-test (deftest card-id-native-source-queries-test
(let [run-native-query (let [run-native-query
(fn [sql] (fn [sql]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment