Skip to content
Snippets Groups Projects
Commit fb266e0a authored by Cam Saül's avatar Cam Saül
Browse files

New POST /api/card/:id/query/csv endpoint :yum:

parent 3761a9df
Branches
Tags
No related merge requests found
......@@ -262,17 +262,24 @@
;;; ------------------------------------------------------------ Running a Query ------------------------------------------------------------
(defn- run-query-for-card [card-id parameters]
(let [card (read-check Card card-id)
query (assoc (:dataset_query card)
:parameters parameters
:constraints dataset-api/query-constraints)
options {:executed-by *current-user-id*
:card-id card-id}]
(qp/dataset-query query options)))
(defendpoint POST "/:card-id/query"
"Run the query associated with a Card."
[card-id :as {{:keys [parameters timeout]} :body}]
(let [card (read-check Card card-id)
query (assoc (:dataset_query card)
:parameters parameters
:constraints dataset-api/query-constraints)]
;; Now run the query!
(let [options {:executed-by *current-user-id*
:card-id card-id}]
(qp/dataset-query query options))))
[card-id :as {{:keys [parameters]} :body}]
(run-query-for-card card-id parameters))
(defendpoint POST "/:card-id/query/csv"
"Run the query associated with a Card, and return its results as CSV."
[card-id :as {{:keys [parameters]} :body}]
(dataset-api/as-csv (run-query-for-card card-id parameters)))
(define-routes)
......@@ -48,26 +48,32 @@
(float (/ (reduce + running-times)
(count running-times))))}))
(defn as-csv
"Return a CSV response containing the RESULTS of a query."
{:arglists '([results])}
[{{:keys [columns rows]} :data, :keys [status], :as response}]
(if (= status :completed)
;; successful query, send CSV file
{:status 200
:body (with-out-str
;; turn keywords into strings, otherwise we get colons in our output
(csv/write-csv *out* (into [(mapv name columns)] rows)))
:headers {"Content-Type" "text/csv; charset=utf-8"
"Content-Disposition" (str "attachment; filename=\"query_result_" (u/date->iso-8601) ".csv\"")}}
;; failed query, send error message
{:status 500
:body (:error response)}))
(defendpoint POST "/csv"
"Execute an MQL query and download the result data as a CSV file."
"Execute a query and download the result data as a CSV file."
[query]
{query [Required String->Dict]}
(read-check Database (:database query))
(let [{{:keys [columns rows]} :data :keys [status] :as response} (qp/dataset-query query {:executed-by *current-user-id*})
columns (map name columns)] ; turn keywords into strings, otherwise we get colons in our output
(if (= status :completed)
;; successful query, send CSV file
{:status 200
:body (with-out-str
(csv/write-csv *out* (into [columns] rows)))
:headers {"Content-Type" "text/csv; charset=utf-8"
"Content-Disposition" (str "attachment; filename=\"query_result_" (u/date->iso-8601) ".csv\"")}}
;; failed query, send error message
{:status 500
:body (:error response)})))
(as-csv (qp/dataset-query query {:executed-by *current-user-id*})))
;; TODO - AFAIK this endpoint is no longer used. Remove it? </3
;; (We have POST /api/card/:id/query now which is used instead)
(defendpoint GET "/card/:id"
"Execute the MQL query for a given `Card` and retrieve both the `Card` and the execution results as JSON.
This is a convenience endpoint which simplifies the normal 2 api calls to fetch the `Card` then execute its query."
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment