diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index 974819d..fb772c2 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -17,6 +17,15 @@ (defn paren-wrap [x] (str "(" x ")")) +;; Checks if the first elemnet of the list is a `DISTINCT ON` statement, if yes +;; then return a string with an appended space at the end of the first and then +;; comma joining the rest else simply return a comma joined string +(defn construct-select [s] + (let [[fst & rst] s] + (if (re-find #"DISTINCT ON" fst) + (str fst " " (comma-join rst)) + (comma-join s)))) + (def ^:dynamic *clause* "During formatting, *clause* is bound to :select, :from, :where, etc." nil) @@ -403,7 +412,7 @@ (str (space-join (map (comp string/upper-case name) (:modifiers sql-map))) " ")) - (comma-join (map to-sql fields)))) + (construct-select (map to-sql fields)))) (defmethod format-clause :from [[_ tables] _] (str "FROM " (comma-join (map to-sql tables)))) diff --git a/test/honeysql/core_test.clj b/test/honeysql/core_test.clj index 61e720b..4f20d0b 100644 --- a/test/honeysql/core_test.clj +++ b/test/honeysql/core_test.clj @@ -174,3 +174,12 @@ (from :foo) (join :x [:= :foo.id :x.id] :y nil) sql/format))))) + +(deftest distinct-on + (testing "Distinct on query generation" + (is (= ["SELECT DISTINCT ON (name) name, created_by"] + (-> (select (sql/call :distinct-on :name) :name :created_by) + sql/format))) + (is (= ["SELECT DISTINCT ON (name, created_by) name, created_by"] + (-> (select (sql/call :distinct-on :name :created_by) :name :created_by) + sql/format)))))