(ns metabase-enterprise.search.scoring
  (:require
   [metabase.premium-features.core :as premium-features :refer [defenterprise]]
   [metabase.search.appdb.scoring :as appdb.scoring]
   [metabase.search.config :as search.config]
   [metabase.search.in-place.scoring :as scoring]))
(def ^:private enterprise-scorers
  {:official-collection {:expr (appdb.scoring/truthy :official_collection)
                         :pred #(premium-features/has-feature? :official-collections)}
   :verified            {:expr (appdb.scoring/truthy :verified)
                         :pred #(premium-features/has-feature? :content-verification)}})

Which additional scorers are active?

(defn- additional-scorers
  []
  (into {}
        (keep (fn [[k {:keys [expr pred]}]]
                (when (pred)
                  [k expr])))
        enterprise-scorers))

Return the select-item expressions used to calculate the score for each search result.

(defenterprise scorers
  :feature :none
  [search-ctx]
  (merge (appdb.scoring/base-scorers search-ctx) (additional-scorers)))

------------ LEGACY ----------

A scorer for items in official collections

(defn- official-collection-score
  [{:keys [collection_authority_level]}]
  (if (contains? #{"official"} collection_authority_level)
    1
    0))

A scorer for verified items.

(defn- verified-score
  [{:keys [moderated_status]}]
  (if (contains? #{"verified"} moderated_status)
    1
    0))
(def ^:private legacy-scorers
  {:official-collection official-collection-score
   :verified            verified-score})
(defn- legacy-name [k]
  (if (= k :official-collection)
    "official collection score"
    (name k)))
(defn- legacy-score-result [k result]
  {:name   (legacy-name k)
   :score  (let [f (get legacy-scorers k)]
             (f result))
   :weight (search.config/weight :default k)})

Scoring implementation that adds score for items in official collections.

(defenterprise score-result
  :feature :none
  [result]
  (into (scoring/weights-and-scores result)
        (map #(legacy-score-result % result))
        (keys (additional-scorers))))