From 0b6daa34549a4dd7ee8c9d814b459e6ca901b7cf Mon Sep 17 00:00:00 2001
From: Cal Herries <39073188+calherries@users.noreply.github.com>
Date: Mon, 29 May 2023 11:50:01 +0300
Subject: [PATCH] Rank models over non-models in autocomplete (#31064)

---
 src/metabase/api/database.clj       |  3 ++-
 test/metabase/api/database_test.clj | 33 +++++++++++++++++------------
 2 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/src/metabase/api/database.clj b/src/metabase/api/database.clj
index c9ae3a58120..e3a1838319c 100644
--- a/src/metabase/api/database.clj
+++ b/src/metabase/api/database.clj
@@ -518,7 +518,8 @@
                              (and (empty? search-id) (not-empty search-name))
                              [:like [:lower :report_card.name] (str "%" search-name "%")])]
                 :left-join [[:collection :collection] [:= :collection.id :report_card.collection_id]]
-                :order-by [[:report_card.id :desc]]
+                :order-by [[:dataset :desc]         ; prioritize models
+                           [:report_card.id :desc]] ; then most recently created
                 :limit    50})))
 
 (defn- autocomplete-fields [db-id search-string limit]
diff --git a/test/metabase/api/database_test.clj b/test/metabase/api/database_test.clj
index e326316a4ef..14eeda46a29 100644
--- a/test/metabase/api/database_test.clj
+++ b/test/metabase/api/database_test.clj
@@ -523,26 +523,31 @@
 (deftest card-autocomplete-suggestions-test
   (testing "GET /api/database/:id/card_autocomplete_suggestions"
     (mt/with-temp* [Collection [collection {:name "Maz Analytics"}]
-                    Card       [card-1 (card-with-native-query "Maz Quote Views Per Month")]
-                    Card       [card-2 (card-with-native-query "Maz Quote Views Per Day" :collection_id (:id collection))]]
-      (let [card->result {card-1 (assoc (select-keys card-1 [:id :name :dataset]) :collection_name nil)
-                          card-2 (assoc (select-keys card-2 [:id :name :dataset]) :collection_name (:name collection))}]
+                    Card       [card-1 (card-with-native-query "Maz Quote Views Per Month" :collection_id (:id collection))]
+                    Card       [card-2 (card-with-native-query "Maz Quote Views Per Day" :dataset true)]
+                    Card       [card-3 (card-with-native-query "Maz Quote Views Per Day")]]
+      (let [card->result {card-1 (assoc (select-keys card-1 [:id :name :dataset]) :collection_name (:name collection))
+                          card-2 (assoc (select-keys card-2 [:id :name :dataset]) :collection_name nil)
+                          card-3 (assoc (select-keys card-3 [:id :name :dataset]) :collection_name nil)}]
         (testing "exclude cards without perms"
           (mt/with-non-admin-groups-no-root-collection-perms
-            (is (= [(card->result card-2)]
+            (is (= [(card->result card-1)]
                    (mt/user-http-request :rasta :get 200
                                          (format "database/%d/card_autocomplete_suggestions" (mt/id))
                                          :query "maz"))))
           (testing "cards should match the query"
-            (doseq [[query expected-cards] {"QUOTE-views"              [card-2 card-1]
-                                            "per-day"                  [card-2]
-                                            (str (:id card-1))         [card-1]
-                                            (str (:id card-2) "-maz")  [card-2]
-                                            (str (:id card-2) "-kyle") []}]
-              (is (= (map card->result expected-cards)
-                     (mt/user-http-request :rasta :get 200
-                                           (format "database/%d/card_autocomplete_suggestions" (mt/id))
-                                           :query query)))))))
+            (doseq [[query expected-cards] [; in all these queries, card-2 should be first because it's a model,
+                                            ; followed by card-3 because it's created more recently than card-1
+                                            ["QUOTE-views" [card-2 card-3 card-1]]
+                                            ["per-day" [card-2 card-3]]
+                                            [(str (:id card-1)) [card-1]]
+                                            [(str (:id card-2) "-maz") [card-2]]
+                                            [(str (:id card-2) "-kyle") []]]]
+              (testing (format "query = %s" query)
+                (is (= (map card->result expected-cards)
+                       (mt/user-http-request :rasta :get 200
+                                             (format "database/%d/card_autocomplete_suggestions" (mt/id))
+                                             :query query))))))))
       (testing "should reject requests for databases for which the user has no perms"
         (mt/with-temp* [Database [{database-id :id}]
                         Card     [_ (card-with-native-query "Maz Quote Views Per Month" :database_id database-id)]]
-- 
GitLab