QueryExecution is a log of very time a query is executed, and other information such as the User who executed it, run time, context it was executed in, etc.

(ns metabase.models.query-execution
  (:require
   [malli.error :as me]
   [metabase.analytics.core :as analytics]
   [metabase.lib.schema.info :as lib.schema.info]
   [metabase.models.interface :as mi]
   [metabase.util :as u]
   [metabase.util.i18n :refer [tru]]
   [metabase.util.malli.registry :as mr]
   [methodical.core :as methodical]
   [toucan2.core :as t2]
   [toucan2.tools.disallow :as t2.disallow]))
(methodical/defmethod t2/table-name :model/QueryExecution [_model] :query_execution)
(derive :model/QueryExecution :metabase/model)
(derive :model/QueryExecution ::t2.disallow/update)
(t2/deftransforms :model/QueryExecution
  {:json_query mi/transform-json
   :status     mi/transform-keyword
   :context    mi/transform-keyword})
(defn- validate-context [context]
  (when-let [error (me/humanize (mr/explain ::lib.schema.info/context context))]
    (throw (ex-info (tru "Invalid query execution context: {0}" (pr-str error))
                    {:error error}))))
(t2/define-before-insert :model/QueryExecution
  [{context :context, :as query-execution}]
  (u/prog1 (analytics/include-sdk-info query-execution)
    (validate-context context)))
(t2/define-after-select :model/QueryExecution
  [{:keys [result_rows] :as query-execution}]
  ;; sadly we have 2 ways to reference the row count :(
  (assoc query-execution :row_count (or result_rows 0)))