SQL → Datahike Datalog translator.
Parses SQL strings using JSqlParser and translates the AST into Datahike
Datalog queries that can be executed by datahike.api/q.
The core mapping: attribute namespace prefixes become virtual table names. :person/name → table 'person', column 'name' :person/age → table 'person', column 'age'
Main entry points: (parse-sql sql schema) → {:type :select :query {...} :args [...]} | {:type :insert :tx-data [...]} | {:type :system :result QueryResult} | {:type :error :message str}
SQL → Datahike Datalog translator.
Parses SQL strings using JSqlParser and translates the AST into Datahike
Datalog queries that can be executed by `datahike.api/q`.
The core mapping: attribute namespace prefixes become virtual table names.
:person/name → table 'person', column 'name'
:person/age → table 'person', column 'age'
Main entry points:
(parse-sql sql schema) → {:type :select :query {...} :args [...]}
| {:type :insert :tx-data [...]}
| {:type :system :result QueryResult}
| {:type :error :message str}Server-wide JSqlParser AST cache, keyed on the preprocessed SQL string. Tests can rebind to an isolated map; nil disables caching.
Server-wide JSqlParser AST cache, keyed on the preprocessed SQL string. Tests can rebind to an isolated map; nil disables caching.
Tests can rebind this to an isolated java.util.Map to keep their
data from polluting the global cache (or vice versa). Nil disables
caching entirely. Defaults to the server-wide cache.
Tests can rebind this to an isolated `java.util.Map` to keep their data from polluting the global cache (or vice versa). Nil disables caching entirely. Defaults to the server-wide cache.
Server-wide cache for parse-sql results. Tests can rebind to an isolated map; nil disables caching entirely.
Server-wide cache for parse-sql results. Tests can rebind to an isolated map; nil disables caching entirely.
(parse-sql sql schema)(parse-sql sql schema db)Parse a SQL statement and return a translation result.
Returns one of: {:type :select :query <datalog-map> :find-aliases [...] ...} {:type :insert :tx-data [...] :count N} {:type :update :table str :ns str :assignments [...] :where-expr expr} {:type :delete :table str :ns str :where-expr expr} {:type :ddl-create :tx-data [...]} {:type :system :system-type keyword} {:type :error :message str}
Optional db parameter enables subquery execution during translation.
Three cache levels stack:
*parse-cache*) — for SQL strings re-issued
verbatim (pgjdbc unnamed prepared statements, ORM select-by-id).INSERT INTO t [(cols)] VALUES (lit, …) shapes the literals are
captured, the SQL is normalised to (? , …), and the resulting
AST is reused across all rows of the same shape. Translation
still runs per row with *bound-params* bound so JdbcParameter
nodes resolve to concrete values inline (no ParamRef closure
captures).*ast-cache*) — covers everything else that
hits JSqlParser, repeated or not.Parse a SQL statement and return a translation result.
Returns one of:
{:type :select :query <datalog-map> :find-aliases [...] ...}
{:type :insert :tx-data [...] :count N}
{:type :update :table str :ns str :assignments [...] :where-expr expr}
{:type :delete :table str :ns str :where-expr expr}
{:type :ddl-create :tx-data [...]}
{:type :system :system-type keyword}
{:type :error :message str}
Optional db parameter enables subquery execution during translation.
Three cache levels stack:
- **Result cache** (`*parse-cache*`) — for SQL strings re-issued
verbatim (pgjdbc unnamed prepared statements, ORM select-by-id).
- **Lexical INSERT-VALUES templating** + AST cache — for `INSERT
INTO t [(cols)] VALUES (lit, …)` shapes the literals are
captured, the SQL is normalised to `(? , …)`, and the resulting
AST is reused across all rows of the same shape. Translation
still runs per row with `*bound-params*` bound so JdbcParameter
nodes resolve to concrete values inline (no ParamRef closure
captures).
- **AST cache** (`*ast-cache*`) — covers everything else that
hits JSqlParser, repeated or not.cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |