Skip to content

Commit 69ac944

Browse files
committed
Fixed empty non-queried relation not affecting results (closes #385)
1 parent 82487ee commit 69ac944

4 files changed

Lines changed: 43 additions & 19 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# WIP
2+
3+
- Fixed empty non-queried relation not affecting results #385
4+
15
# 1.0.4
26

37
- Implement nav/datafy for entities #325 thx @IamDrowsy

script/watch.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
cd "`dirname $0`/.."
44

5-
clojure -A:test -m kaocha.runner --watch "$@"
5+
clojure -A:test -M -m kaocha.runner --watch "$@"

src/datascript/query.cljc

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -861,23 +861,33 @@
861861
(let [rels (:rels context)]
862862
(-collect [(da/make-array (count symbols))] rels symbols)))
863863
([acc rels symbols]
864-
(if-some [rel (first rels)]
865-
(let [keep-attrs (select-keys (:attrs rel) symbols)]
866-
(if (empty? keep-attrs)
867-
(recur acc (next rels) symbols)
868-
(let [copy-map (to-array (map #(get keep-attrs %) symbols))
869-
len (count symbols)]
870-
(recur (for [#?(:cljs t1
871-
:clj ^{:tag "[[Ljava.lang.Object;"} t1) acc
872-
t2 (:tuples rel)]
873-
(let [res (aclone t1)]
874-
(dotimes [i len]
875-
(when-some [idx (aget copy-map i)]
876-
(aset res i (#?(:cljs da/aget :clj get) t2 idx))))
877-
res))
878-
(next rels)
879-
symbols))))
880-
acc)))
864+
(cond+
865+
:let [rel (first rels)]
866+
867+
(nil? rel) acc
868+
869+
;; one empty rel means final set has to be empty
870+
(empty? (:tuples rel)) []
871+
872+
:let [keep-attrs (select-keys (:attrs rel) symbols)]
873+
874+
(empty? keep-attrs) (recur acc (next rels) symbols)
875+
876+
:let [copy-map (to-array (map #(get keep-attrs %) symbols))
877+
len (count symbols)]
878+
879+
:else
880+
(recur
881+
(for [#?(:cljs t1
882+
:clj ^{:tag "[[Ljava.lang.Object;"} t1) acc
883+
t2 (:tuples rel)]
884+
(let [res (aclone t1)]
885+
(dotimes [i len]
886+
(when-some [idx (aget copy-map i)]
887+
(aset res i (#?(:cljs da/aget :clj get) t2 idx))))
888+
res))
889+
(next rels)
890+
symbols))))
881891

882892
(defn collect [context symbols]
883893
(->> (-collect context symbols)

test/datascript/test/query.cljc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
(:import [clojure.lang ExceptionInfo])))
1010

1111

12-
1312
(deftest test-joins
1413
(let [db (-> (d/empty-db)
1514
(d/db-with [ { :db/id 1, :name "Ivan", :age 15 }
@@ -231,5 +230,16 @@
231230
"X")
232231
#{["abcX"] ["aXb"]})))
233232

233+
234+
(deftest ^{:doc "issue-385"} test-join-unrelated
235+
(is (= #{}
236+
(d/q '[:find ?name
237+
:in $ ?my-fn
238+
:where [?e :person/name ?name]
239+
[(?my-fn) ?result]
240+
[(< ?result 3)]]
241+
(d/db-with (d/empty-db) [{:person/name "Joe"}])
242+
(fn [] 5)))))
243+
234244
#_(require 'datascript.test.query :reload)
235245
#_(clojure.test/test-ns 'datascript.test.query)

0 commit comments

Comments
 (0)