diff --git a/src/adl/to_hugsql_queries.clj b/src/adl/to_hugsql_queries.clj index a5f4a16..eca40d9 100644 --- a/src/adl/to_hugsql_queries.clj +++ b/src/adl/to_hugsql_queries.clj @@ -38,7 +38,7 @@ (str "WHERE " entity-name "." (s/join - (str " AND\n\t" entity-name ".") + (str "\n\tAND " entity-name ".") (map #(let [target (keyword (-> % :attrs :name))] (str @@ -63,9 +63,15 @@ "ORDER BY " entity-name "." (s/join (str ",\n\t" entity-name ".") - (doall (flatten (cons preferred (filter - #(not (#{"all", "user"} %)) - (key-names entity-map))))))))) + (doall + (flatten + (cons + preferred + (map + #(-> % :attrs :name) + (filter + #(not (#{"all", "user"} (-> % :attrs :distinct))) + (key-properties entity-map)))))))))) (defn insert-query [entity-map] diff --git a/test/adl/to_hugsql_queries_test.clj b/test/adl/to_hugsql_queries_test.clj index 1815f24..c4c2311 100644 --- a/test/adl/to_hugsql_queries_test.clj +++ b/test/adl/to_hugsql_queries_test.clj @@ -46,7 +46,10 @@ {:distinct "user", :size "12", :type "string", :name "postcode"}, :content nil}]}] (testing "user distinct properties should provide the default ordering" - (let [expected "ORDER BY address.street,\n\taddress.postcode,\n\taddress.id" + (let [expected + "ORDER BY address.street, + address.postcode, + address.id" actual (order-by-clause xml)] (is (string-equal-ignore-whitespace actual expected)))) (testing "keys name extraction" @@ -62,7 +65,15 @@ actual (has-non-key-properties? xml)] (is (string-equal-ignore-whitespace actual expected)))) (testing "insert query generation" - (let [expected "-- :name create-addres! :! :n\n-- :doc creates a new addres record\nINSERT INTO address (street,\n\ttown,\n\tpostcode)\nVALUES (':street',\n\t':town',\n\t':postcode')\nreturning id\n\n" + (let [expected "-- :name create-addres! :! :n + -- :doc creates a new addres record + INSERT INTO address (street, + town, + postcode) + VALUES (':street', + ':town', + ':postcode') + returning id\n\n" actual (:query (first (vals (insert-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "insert query signature" @@ -70,7 +81,12 @@ actual (:signature (first (vals (insert-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "update query generation" - (let [expected "-- :name update-addres! :! :n\n-- :doc updates an existing addres record\nUPDATE address\nSET street = :street,\n\ttown = :town,\n\tpostcode = :postcode\nWHERE address.id = :id\n\n" + (let [expected "-- :name update-addres! :! :n + -- :doc updates an existing addres record + UPDATE address\nSET street = :street, + town = :town, + postcode = :postcode + WHERE address.id = :id\n\n" actual (:query (first (vals (update-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "update query signature" @@ -78,7 +94,17 @@ actual (:signature (first (vals (update-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "search query generation" - (let [expected "-- :name search-strings-addres :? :1\n-- :doc selects existing address records having any string field matching `:pattern` by substring match\nSELECT * FROM address\nWHERE street LIKE '%:pattern%'\n\tOR town LIKE '%:pattern%'\n\tOR postcode LIKE '%:pattern%'\nORDER BY address.street,\n\taddress.postcode,\n\taddress.id\n--~ (if (:offset params) \"OFFSET :offset \") \n--~ (if (:limit params) \"LIMIT :limit\" \"LIMIT 100\")\n\n" + (let [expected "-- :name search-strings-addres :? :1 + -- :doc selects existing address records having any string field matching `:pattern` by substring match + SELECT * FROM address + WHERE street LIKE '%:pattern%' + OR town LIKE '%:pattern%' + OR postcode LIKE '%:pattern%' + ORDER BY address.street, + address.postcode, + address.id + --~ (if (:offset params) \"OFFSET :offset \") + --~ (if (:limit params) \"LIMIT :limit\" \"LIMIT 100\")\n\n" actual (:query (first (vals (search-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "search query signature" @@ -86,7 +112,10 @@ actual (:signature (first (vals (search-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "select query generation" - (let [expected "-- :name get-addres :? :1\n-- :doc selects an existing addres record\nSELECT * FROM address\nWHERE address.id = :id\n\n" + (let [expected "-- :name get-addres :? :1 + -- :doc selects an existing addres record + SELECT * FROM address + WHERE address.id = :id\n\n" actual (:query (first (vals (select-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "select query signature" @@ -94,7 +123,14 @@ actual (:signature (first (vals (select-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "list query generation" - (let [expected "-- :name list-address :? :*\n-- :doc lists all existing addres records\nSELECT * FROM address\nORDER BY address.street,\n\taddress.postcode,\n\taddress.id\n--~ (if (:offset params) \"OFFSET :offset \") \n--~ (if (:limit params) \"LIMIT :limit\" \"LIMIT 100\")\n\n" + (let [expected "-- :name list-address :? :* + -- :doc lists all existing addres records + SELECT * FROM address + ORDER BY address.street, + address.postcode, + address.id + --~ (if (:offset params) \"OFFSET :offset \") + --~ (if (:limit params) \"LIMIT :limit\" \"LIMIT 100\")\n\n" actual (:query (first (vals (list-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "list query signature" @@ -102,7 +138,10 @@ actual (:signature (first (vals (list-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "delete query generation" - (let [expected "-- :name delete-addres! :! :n\n-- :doc updates an existing addres record\nDELETE FROM address\nWHERE address.id = :id\n\n" + (let [expected "-- :name delete-addres! :! :n + -- :doc updates an existing addres record + DELETE FROM address + WHERE address.id = :id\n\n" actual (:query (first (vals (delete-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "delete query signature" @@ -148,20 +187,59 @@ :attrs {:size "64", :type "string", :name "town"}, :content nil} ]}] + (testing "user distinct properties should provide the default ordering" + (let [expected "ORDER BY address.street, + address.postcode, + address.id" + actual (order-by-clause xml)] + (is (string-equal-ignore-whitespace actual expected)))) + (testing "keys name extraction" + (let [expected '("id" "postcode") + actual (key-names xml)] + (is (string-equal-ignore-whitespace actual expected)))) (testing "insert query generation - compound key, non system generated field in key" - (let [expected "-- :name create-addres! :! :n\n-- :doc creates a new addres record\nINSERT INTO address (street,\n\ttown,\n\tpostcode)\nVALUES (':street',\n\t':town',\n\t':postcode')\nreturning id,\n\tpostcode\n\n" + (let [expected "-- :name create-addres! :! :n + -- :doc creates a new addres record + INSERT INTO address (street, + town, + postcode) + VALUES (':street', + ':town', + ':postcode') + returning id, + postcode\n\n" actual (:query (first (vals (insert-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "update query generation - compound key" - (let [expected "-- :name update-addres! :! :n\n-- :doc updates an existing addres record\nUPDATE address\nSET street = :street,\n\ttown = :town\nWHERE address.id = :id AND\n\taddress.postcode = ':postcode'\n\n" + (let [expected "-- :name update-addres! :! :n + -- :doc updates an existing addres record + UPDATE address + SET street = :street, + town = :town + WHERE address.id = :id + AND address.postcode = ':postcode'\n\n" actual (:query (first (vals (update-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "search query generation - user-distinct field in key" - (let [expected "-- :name search-strings-addres :? :1\n-- :doc selects existing address records having any string field matching `:pattern` by substring match\nSELECT * FROM address\nWHERE street LIKE '%:pattern%'\n\tOR town LIKE '%:pattern%'\n\tOR postcode LIKE '%:pattern%'\nORDER BY address.street,\n\taddress.postcode,\n\taddress.id,\n\taddress.postcode\n--~ (if (:offset params) \"OFFSET :offset \") \n--~ (if (:limit params) \"LIMIT :limit\" \"LIMIT 100\")\n\n" + (let [expected "-- :name search-strings-addres :? :1 + -- :doc selects existing address records having any string field matching `:pattern` by substring match + SELECT * FROM address + WHERE street LIKE '%:pattern%' + OR town LIKE '%:pattern%' + OR postcode LIKE '%:pattern%' + ORDER BY address.street, + address.postcode, + address.id + --~ (if (:offset params) \"OFFSET :offset \") + --~ (if (:limit params) \"LIMIT :limit\" \"LIMIT 100\")\n\n" actual (:query (first (vals (search-query xml))))] (is (string-equal-ignore-whitespace actual expected)))) (testing "delete query generation - compound key" - (let [expected "-- :name delete-addres! :! :n\n-- :doc updates an existing addres record\nDELETE FROM address\nWHERE address.id = :id AND\n\taddress.postcode = ':postcode'\n\n" + (let [expected "-- :name delete-addres! :! :n + -- :doc updates an existing addres record + DELETE FROM address + WHERE address.id = :id + AND address.postcode = ':postcode'\n\n" actual (:query (first (vals (delete-query xml))))] (is (string-equal-ignore-whitespace actual expected))))))