diff --git a/src/metabase/query_processor/resolve.clj b/src/metabase/query_processor/resolve.clj index c63b78a6dc7e3116018bc187ed27a0ac4e90dcf1..59b2ce95a4e14616cd4e98c7112518f6386db9da 100644 --- a/src/metabase/query_processor/resolve.clj +++ b/src/metabase/query_processor/resolve.clj @@ -216,8 +216,8 @@ [(db/entity->table-name Table) :target-table] [:= :target-pk.table_id :target-table.id]] :where [:and [:in :source-fk.id (set fk-field-ids)] - [:= :source-fk.table_id source-table-id] - [:= :source-fk.special_type "fk"]]}))) + [:= :source-fk.table_id source-table-id] + [:= :source-fk.special_type "fk"]]}))) (defn- fk-field-ids->joined-tables "Fetch info for PK/FK `Fields` for the JOIN-TABLES referenced in a Query." diff --git a/test/metabase/query_processor/expand_resolve_test.clj b/test/metabase/query_processor/expand_resolve_test.clj index 77a10352c53645ff95281c30c47ca7223953f838..8d35fcc88090acf39578100d6b79b34b13657c7b 100644 --- a/test/metabase/query_processor/expand_resolve_test.clj +++ b/test/metabase/query_processor/expand_resolve_test.clj @@ -42,6 +42,7 @@ :id (id :venues)} :filter {:filter-type :> :field {:field-id (id :venues :price) + :fk-field-id nil :field-name "PRICE" :field-display-name "Price" :base-type :IntegerField @@ -56,6 +57,7 @@ :parent nil} :value {:value 1 :field {:field-id (id :venues :price) + :fk-field-id nil :field-name "PRICE" :field-display-name "Price" :base-type :IntegerField @@ -99,28 +101,30 @@ :id (id :venues)} :filter {:filter-type := :field {:field-id (id :categories :name) + :fk-field-id (id :venues :category_id) :field-name "NAME" :field-display-name "Name" :base-type :TextField :special-type :name :visibility-type :normal :table-id (id :categories) - :schema-name "PUBLIC" - :table-name "CATEGORIES" + :schema-name nil + :table-name "CATEGORIES__via__CATEGORY_ID" :position nil :description nil :parent-id nil :parent nil} :value {:value "abc" :field {:field-id (id :categories :name) + :fk-field-id (id :venues :category_id) :field-name "NAME" :field-display-name "Name" :base-type :TextField :special-type :name :visibility-type :normal :table-id (id :categories) - :schema-name "PUBLIC" - :table-name "CATEGORIES" + :schema-name nil + :table-name "CATEGORIES__via__CATEGORY_ID" :position nil :description nil :parent-id nil @@ -131,7 +135,8 @@ :field-name "ID"} :table-id (id :categories) :table-name "CATEGORIES" - :schema "PUBLIC"}]} + :schema "PUBLIC" + :join-alias "CATEGORIES__via__CATEGORY_ID"}]} :fk-field-ids #{(id :venues :category_id)} :table-ids #{(id :categories)}}] (let [expanded-form (ql/expand (wrap-inner-query (query venues @@ -163,14 +168,15 @@ :id (id :checkins)} :filter {:filter-type :> :field {:field {:field-id (id :users :last_login) + :fk-field-id (id :checkins :user_id) :field-name "LAST_LOGIN" :field-display-name "Last Login" :base-type :DateTimeField :special-type nil :visibility-type :normal :table-id (id :users) - :schema-name "PUBLIC" - :table-name "USERS" + :schema-name nil + :table-name "USERS__via__USER_ID" :position nil :description nil :parent-id nil @@ -178,14 +184,15 @@ :unit :year} :value {:value (u/->Timestamp "1980-01-01") :field {:field {:field-id (id :users :last_login) + :fk-field-id (id :checkins :user_id) :field-name "LAST_LOGIN" :field-display-name "Last Login" :base-type :DateTimeField :special-type nil :visibility-type :normal :table-id (id :users) - :schema-name "PUBLIC" - :table-name "USERS" + :schema-name nil + :table-name "USERS__via__USER_ID" :position nil :description nil :parent-id nil @@ -197,7 +204,8 @@ :field-name "ID"} :table-id (id :users) :table-name "USERS" - :schema "PUBLIC"}]} + :schema "PUBLIC" + :join-alias "USERS__via__USER_ID"}]} :fk-field-ids #{(id :checkins :user_id)} :table-ids #{(id :users)}}] (let [expanded-form (ql/expand (wrap-inner-query (query checkins @@ -238,8 +246,9 @@ :visibility-type :normal :position nil :field-id (id :venues :price) - :table-name "VENUES" - :schema-name "PUBLIC"}} + :fk-field-id (id :checkins :venue_id) + :table-name "VENUES__via__VENUE_ID" + :schema-name nil}} :breakout [{:field {:description nil :base-type :DateField :parent nil @@ -251,6 +260,7 @@ :visibility-type :normal :position nil :field-id (id :checkins :date) + :fk-field-id nil :table-name "CHECKINS" :schema-name "PUBLIC"} :unit :day-of-week}] @@ -260,7 +270,8 @@ :field-name "ID"} :table-id (id :venues) :table-name "VENUES" - :schema "PUBLIC"}]} + :schema "PUBLIC" + :join-alias "VENUES__via__VENUE_ID"}]} :fk-field-ids #{(id :checkins :venue_id)} :table-ids #{(id :venues) (id :checkins)}}] (let [expanded-form (ql/expand (wrap-inner-query (query checkins diff --git a/test/metabase/query_processor_test.clj b/test/metabase/query_processor_test.clj index f780f199070c2c2e0ede572bae2774fd161575ac..5d59382b7c53863c3dd5e7872e25879f27720b9f 100644 --- a/test/metabase/query_processor_test.clj +++ b/test/metabase/query_processor_test.clj @@ -24,11 +24,6 @@ (def ^:private ^:const timeseries-engines #{:druid}) (def ^:private ^:const non-timeseries-engines (set/difference datasets/all-valid-engines timeseries-engines)) -;; Make sure the driver test extension namespaces are loaded. This is needed because otherwise `lein test metabase.query-processor-test` won't work -(doseq [engine non-timeseries-engines - :let [driver-test-ns (symbol (str "metabase.test.data." (name engine)))]] - (require driver-test-ns :reload)) - (defn- engines-that-support [feature] (set (for [engine non-timeseries-engines :when (contains? (driver/features (driver/engine->driver engine)) feature)] diff --git a/test/metabase/test_setup.clj b/test/metabase/test_setup.clj index 9986a3936e2368fdac3affe91c061e038e51d2e1..b1825909fea3d4bfe6b3ac0556c3b20f92d9f25d 100644 --- a/test/metabase/test_setup.clj +++ b/test/metabase/test_setup.clj @@ -4,7 +4,6 @@ [clojure.java.io :as io] [clojure.set :as set] [clojure.tools.logging :as log] - [colorize.core :as color] [expectations :refer :all] (metabase [core :as core] [db :as db] @@ -67,8 +66,7 @@ ;; # ------------------------------ FUNCTIONS THAT GET RUN ON TEST SUITE START / STOP ------------------------------ -;; this is a little odd, but our normal `test-startup` function won't work for loading the drivers because -;; they need to be available at evaluation time for some of the unit tests work work properly, so we put this here +;; `test-startup` function won't work for loading the drivers because they need to be available at evaluation time for some of the unit tests work work properly (driver/find-and-load-drivers!) (defn test-startup @@ -83,6 +81,14 @@ (db/setup-db :auto-migrate true) (setting/set :site-name "Metabase Test") (core/initialization-complete!) + + ;; make sure the driver test extensions are loaded before running the tests. :reload them because otherwise we get wacky 'method in protocol not implemented' errors + ;; when running tests against an individual namespace + (doseq [engine (keys (driver/available-drivers)) + :let [driver-test-ns (symbol (str "metabase.test.data." (name engine)))]] + (u/ignore-exceptions + (require driver-test-ns :reload))) + ;; If test setup fails exit right away (catch Throwable e (log/error (u/format-color 'red "Test setup failed: %s\n%s" e (u/pprint-to-str (vec (.getStackTrace e)))))