Add tests and comments for clause ordering.
This commit is contained in:
parent
feaca75a74
commit
1ad67a03eb
2 changed files with 50 additions and 2 deletions
|
@ -101,8 +101,11 @@
|
|||
once will result in duplicate clauses."
|
||||
[cc]
|
||||
(impose-external-bindings
|
||||
(assoc cc :wheres (concat (bindings->where (:bindings cc))
|
||||
(:wheres cc)))))
|
||||
(assoc cc :wheres
|
||||
;; Note that the order of clauses here means that cross-pattern var bindings
|
||||
;; come first. That's OK: the SQL engine considers these altogether.
|
||||
(concat (bindings->where (:bindings cc))
|
||||
(:wheres cc)))))
|
||||
|
||||
;; Pattern building is recursive, so we need forward declarations.
|
||||
(declare Not->NotJoinClause not-join->where-fragment)
|
||||
|
|
|
@ -80,3 +80,48 @@
|
|||
[?page :page/starred true ?t]
|
||||
[?t :db/txInstant ?timestampMicros]
|
||||
(not [?page :foo/bar _])]))))
|
||||
|
||||
;; Note that clause ordering is not directly correlated to the output: cross-bindings end up
|
||||
;; at the front. The SQL engine will do its own analysis. See `clauses/expand-where-from-bindings`.
|
||||
(deftest test-not-clause-ordering-preserved
|
||||
(is (= {:select '([:datoms1.v :timestampMicros] [:datoms0.e :page]),
|
||||
:modifiers [:distinct],
|
||||
:from '[[:datoms datoms0]
|
||||
[:datoms datoms1]],
|
||||
:where (list
|
||||
:and
|
||||
[:= :datoms1.e :datoms0.tx]
|
||||
[:= :datoms0.a "page/starred"]
|
||||
[:= :datoms0.v 1]
|
||||
[:not
|
||||
(list :and (list :> :datoms0.tx (sql/param :latest)))]
|
||||
[:= :datoms1.a "db/txInstant"])}
|
||||
(expand
|
||||
'[:find ?timestampMicros ?page :in $ ?latest :where
|
||||
[?page :page/starred true ?t]
|
||||
(not [(> ?t ?latest)])
|
||||
[?t :db/txInstant ?timestampMicros]]))))
|
||||
|
||||
(deftest test-pattern-not-join-ordering-preserved
|
||||
(is (= '{:select ([:datoms2.v :timestampMicros] [:datoms0.e :page]),
|
||||
:modifiers [:distinct],
|
||||
:from [[:datoms datoms0]
|
||||
[:datoms datoms2]],
|
||||
:where (:and
|
||||
[:= :datoms2.e :datoms0.tx]
|
||||
[:= :datoms0.a "page/starred"]
|
||||
[:= :datoms0.v 1]
|
||||
[:not
|
||||
[:exists
|
||||
{:select [1],
|
||||
:from [[:datoms datoms1]],
|
||||
:where (:and
|
||||
[:= :datoms1.a "foo/bar"]
|
||||
[:= :datoms0.e :datoms1.e])}]]
|
||||
[:= :datoms2.a "db/txInstant"]
|
||||
)}
|
||||
(expand
|
||||
'[:find ?timestampMicros ?page :in $ ?latest :where
|
||||
[?page :page/starred true ?t]
|
||||
(not [?page :foo/bar _])
|
||||
[?t :db/txInstant ?timestampMicros]]))))
|
||||
|
|
Loading…
Reference in a new issue