incorporate feedback from @jarohen

Signed-off-by: Sean Corfield <sean@corfield.org>
This commit is contained in:
Sean Corfield 2024-12-12 11:07:30 -08:00
parent 30d177165d
commit 7a24fd0367
No known key found for this signature in database
2 changed files with 24 additions and 7 deletions

View file

@ -46,7 +46,7 @@ user=> (sql/format '{from foo where (= status "active")})
You can also `SELECT *` and then exclude columns and/or rename columns. You can also `SELECT *` and then exclude columns and/or rename columns.
```clojure ```clojure
user=> (sql/format '{select ((* {exclude _id rename ((title, name))}))}) user=> (sql/format {:select [[:* {:exclude :_id :rename [[:title, :name]]}]]})
["SELECT * EXCLUDE _id RENAME title AS name"] ["SELECT * EXCLUDE _id RENAME title AS name"]
user=> (sql/format '{select ((a.* {exclude _id}) user=> (sql/format '{select ((a.* {exclude _id})
(b.* {rename ((title, name))})) (b.* {rename ((title, name))}))
@ -55,6 +55,16 @@ user=> (sql/format '{select ((a.* {exclude _id})
["SELECT a.* EXCLUDE _id, b.* RENAME title AS name FROM foo AS a INNER JOIN bar AS b ON a._id = b.foo_id"] ["SELECT a.* EXCLUDE _id, b.* RENAME title AS name FROM foo AS a INNER JOIN bar AS b ON a._id = b.foo_id"]
``` ```
`:exclude` can accept a single column, or a sequence of columns.
`:rename` accepts a sequence of pairs (column name, new name).
```clojure
user=> (sql/format {:select [[:* {:exclude [:_id :upc]
:rename [[:title, :name]
[:price, :cost]]}]]})
["SELECT * EXCLUDE (_id, upc) RENAME (title AS name, price AS cost)"]
```
## Nested Sub-Queries ## Nested Sub-Queries
XTDB can produce structured results from `SELECT` queries containing XTDB can produce structured results from `SELECT` queries containing
@ -103,6 +113,13 @@ user=> (sql/format {:select [[[:record {:_id 1 :status "active"}]]]})
["SELECT RECORD (_id: 1, status: 'active')"] ["SELECT RECORD (_id: 1, status: 'active')"]
``` ```
A third option is to use `:inline` with a hash map:
```clojure
user=> (sql/format {:select [[[:inline {:_id 1 :status "active"}]]]})
["SELECT {_id: 1, status: 'active'}"]
```
## Object Navigation Expressions ## Object Navigation Expressions
In order to deal with nested documents, XTDB provides syntax to navigate In order to deal with nested documents, XTDB provides syntax to navigate
@ -144,9 +161,9 @@ See [XTDB's Top-level queries documentation](https://docs.xtdb.com/reference/mai
Here's one fairly complex example: Here's one fairly complex example:
```clojure ```clojure
user=> (sql/format {:setting [[:basis-to [:inline :DATE "2024-11-24"]] user=> (sql/format {:setting [[:snapshot-time :to [:inline :DATE "2024-11-24"]]
[:default :valid-time :to :between [:inline :DATE "2022"] :and [:inline :DATE "2023"]]]}) [:default :valid-time :to :between [:inline :DATE "2022"] :and [:inline :DATE "2023"]]]})
["SETTING BASIS TO DATE '2024-11-24', DEFAULT VALID_TIME TO BETWEEN DATE '2022' AND DATE '2023'"] ["SETTING SNAPSHOT_TIME TO DATE '2024-11-24', DEFAULT VALID_TIME TO BETWEEN DATE '2022' AND DATE '2023'"]
``` ```
Table references (e.g., in a `FROM` clause) can also have temporal qualifiers. Table references (e.g., in a `FROM` clause) can also have temporal qualifiers.

View file

@ -1403,15 +1403,15 @@ ORDER BY id = ? DESC
(testing "setting default time" (testing "setting default time"
(is (= ["SETTING DEFAULT SYSTEM_TIME AS OF DATE '2024-11-24'"] (is (= ["SETTING DEFAULT SYSTEM_TIME AS OF DATE '2024-11-24'"]
(sut/format {:setting [:default :system-time :as-of [:inline :DATE "2024-11-24"]]}))) (sut/format {:setting [:default :system-time :as-of [:inline :DATE "2024-11-24"]]})))
(is (= ["SETTING BASIS TO DATE '2024-11-24', DEFAULT VALID_TIME TO BETWEEN DATE '2022' AND DATE '2023'"] (is (= ["SETTING SNAPSHOT_TIME TO DATE '2024-11-24', DEFAULT VALID_TIME TO BETWEEN DATE '2022' AND DATE '2023'"]
(sut/format {:setting [[:basis-to [:inline :DATE "2024-11-24"]] (sut/format {:setting [[:snapshot-time :to [:inline :DATE "2024-11-24"]]
[:default :valid-time :to :between [:inline :DATE "2022"] :and [:inline :DATE "2023"]]]}))) [:default :valid-time :to :between [:inline :DATE "2022"] :and [:inline :DATE "2023"]]]})))
(is (= ["SETTING DEFAULT SYSTEM_TIME AS OF DATE '2024-11-24' SELECT * FROM table"] (is (= ["SETTING DEFAULT SYSTEM_TIME AS OF DATE '2024-11-24' SELECT * FROM table"]
(sut/format (-> (h/setting :default :system-time :as-of [:inline :DATE "2024-11-24"]) (sut/format (-> (h/setting :default :system-time :as-of [:inline :DATE "2024-11-24"])
(h/select :*) (h/select :*)
(h/from :table))))) (h/from :table)))))
(is (= ["SETTING BASIS TO DATE '2024-11-24', DEFAULT VALID_TIME TO BETWEEN DATE '2022' AND DATE '2023' SELECT * FROM table"] (is (= ["SETTING SNAPSHOT_TIME TO DATE '2024-11-24', DEFAULT VALID_TIME TO BETWEEN DATE '2022' AND DATE '2023' SELECT * FROM table"]
(sut/format (-> (h/setting [:basis-to [:inline :DATE "2024-11-24"]] (sut/format (-> (h/setting [:snapshot-time :to [:inline :DATE "2024-11-24"]]
[:default :valid-time :to :between [:inline :DATE "2022"] :and [:inline :DATE "2023"]]) [:default :valid-time :to :between [:inline :DATE "2022"] :and [:inline :DATE "2023"]])
(h/select :*) (h/select :*)
(h/from :table))))))) (h/from :table)))))))