From 24b758ae7cb5e7127a4dfd71ca696de3c0b8a3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=96stlund?= Date: Thu, 19 Feb 2026 12:52:08 +0100 Subject: [PATCH 1/5] Validate cmp-quick vs cmp-replace for combinations of datoms --- src/datahike/datom.cljc | 4 ++-- test/datahike/test/datom_test.cljc | 34 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/datahike/datom.cljc b/src/datahike/datom.cljc index 397e3a732..d8a24828a 100644 --- a/src/datahike/datom.cljc +++ b/src/datahike/datom.cljc @@ -437,8 +437,8 @@ Used for replace operations in AVET index where value changes." [^Datom d1, ^Datom d2] (combine-cmp - (cmp-attr-quick (.-a d1) (.-a d2)) - (long-cmp (.-e d1) (.-e d2)))) + (cmp-attr-quick (.-a d1) (.-a d2)) + (long-cmp (.-e d1) (.-e d2)))) (defn index-type->cmp-replace "Get comparator for replace operations. diff --git a/test/datahike/test/datom_test.cljc b/test/datahike/test/datom_test.cljc index 7649ece3e..9aa6ed8da 100644 --- a/test/datahike/test/datom_test.cljc +++ b/test/datahike/test/datom_test.cljc @@ -42,3 +42,37 @@ (is (= d/cmp-datoms-eavt-prefix (d/index-type->cmp-prefix :eavt))) (is (= d/cmp-datoms-aevt-prefix (d/index-type->cmp-prefix :aevt))) (is (= d/cmp-datoms-avet-prefix (d/index-type->cmp-prefix :avet))))) + +(defn combinations [len items] + (if (= 0 len) + [[]] + (for [x (combinations (dec len) items) + i items] + (conj x i)))) + +(defn order [i] + (cond + (neg? i) '< + (pos? i) '> + :else '=)) + +(deftest combinatorial-comparator-test + (doseq [idx [:eavt ;; Works + :aevt ;; Works + ;;:avet ;; Broken + ] + :let [cmp-quick (d/index-type->cmp-quick idx) + cmp-replace (d/index-type->cmp-replace idx)] + [e0 a0 v0 t0 e1 a1 v1 t1] (combinations 8 [0 1 2]) + :let [datom0 (datom e0 a0 v0 t0) + datom1 (datom e1 a1 v1 t1)]] + ;; Whenever `cmp-quick` indicates strict inequality, we expect + ;; `cmp-replace` to indicate indicate either (i) the same inequality or (ii) equality. + ;; If `cmp-quick` indicates equality, `cmp-replace` must indicate equality too. + (is (contains? '#{[< <] + [< =] + [> >] + [> =] + [= =]} + [(order (cmp-quick datom0 datom1)) + (order (cmp-replace datom0 datom1))])))) From f1c3817264b0557ac2254ed65762674317ec5a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=96stlund?= Date: Thu, 19 Feb 2026 13:09:01 +0100 Subject: [PATCH 2/5] FIXUP restore datom --- src/datahike/datom.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/datahike/datom.cljc b/src/datahike/datom.cljc index d8a24828a..397e3a732 100644 --- a/src/datahike/datom.cljc +++ b/src/datahike/datom.cljc @@ -437,8 +437,8 @@ Used for replace operations in AVET index where value changes." [^Datom d1, ^Datom d2] (combine-cmp - (cmp-attr-quick (.-a d1) (.-a d2)) - (long-cmp (.-e d1) (.-e d2)))) + (cmp-attr-quick (.-a d1) (.-a d2)) + (long-cmp (.-e d1) (.-e d2)))) (defn index-type->cmp-replace "Get comparator for replace operations. From 1de46a284f1c4b46ae9748e0ca278193484748ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=96stlund?= Date: Thu, 19 Feb 2026 13:28:18 +0100 Subject: [PATCH 3/5] FIXUP additional tests --- test/datahike/test/datom_test.cljc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/datahike/test/datom_test.cljc b/test/datahike/test/datom_test.cljc index 9aa6ed8da..0073a599e 100644 --- a/test/datahike/test/datom_test.cljc +++ b/test/datahike/test/datom_test.cljc @@ -65,7 +65,10 @@ cmp-replace (d/index-type->cmp-replace idx)] [e0 a0 v0 t0 e1 a1 v1 t1] (combinations 8 [0 1 2]) :let [datom0 (datom e0 a0 v0 t0) - datom1 (datom e1 a1 v1 t1)]] + datom1 (datom e1 a1 v1 t1) + + cmp-quick-01 (order (cmp-quick datom0 datom1)) + cmp-replace-01 (order (cmp-replace datom0 datom1))]] ;; Whenever `cmp-quick` indicates strict inequality, we expect ;; `cmp-replace` to indicate indicate either (i) the same inequality or (ii) equality. ;; If `cmp-quick` indicates equality, `cmp-replace` must indicate equality too. @@ -74,5 +77,8 @@ [> >] [> =] [= =]} - [(order (cmp-quick datom0 datom1)) - (order (cmp-replace datom0 datom1))])))) + [cmp-quick-01 cmp-replace-01])) + + ;; Swapping the arguments swaps the relation. + (is (= cmp-quick-01 (order (- (cmp-quick datom1 datom0))))) + (is (= cmp-replace-01 (order (- (cmp-replace datom1 datom0))))))) From 55d9578399f360230aee1199c9dd5c499a50cd24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=96stlund?= Date: Thu, 19 Feb 2026 13:38:08 +0100 Subject: [PATCH 4/5] FIXUP test equality --- test/datahike/test/datom_test.cljc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/datahike/test/datom_test.cljc b/test/datahike/test/datom_test.cljc index 0073a599e..3fa54f080 100644 --- a/test/datahike/test/datom_test.cljc +++ b/test/datahike/test/datom_test.cljc @@ -79,6 +79,10 @@ [= =]} [cmp-quick-01 cmp-replace-01])) + ;; cmp-quick indicates equality iff the datoms are in fact equal. + (is (= (= cmp-quick-01 '=) + (= [e0 a0 v0 t0] [e1 a1 v1 t1]))) + ;; Swapping the arguments swaps the relation. (is (= cmp-quick-01 (order (- (cmp-quick datom1 datom0))))) (is (= cmp-replace-01 (order (- (cmp-replace datom1 datom0))))))) From f429e73c8ff14afec589a78b28cf4a00ed77727d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=96stlund?= Date: Thu, 19 Feb 2026 14:33:39 +0100 Subject: [PATCH 5/5] FIXUP format --- test/datahike/test/datom_test.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/datahike/test/datom_test.cljc b/test/datahike/test/datom_test.cljc index 3fa54f080..b659035dd 100644 --- a/test/datahike/test/datom_test.cljc +++ b/test/datahike/test/datom_test.cljc @@ -63,7 +63,7 @@ ] :let [cmp-quick (d/index-type->cmp-quick idx) cmp-replace (d/index-type->cmp-replace idx)] - [e0 a0 v0 t0 e1 a1 v1 t1] (combinations 8 [0 1 2]) + [e0 a0 v0 t0 e1 a1 v1 t1] (combinations 8 [0 1 2]) :let [datom0 (datom e0 a0 v0 t0) datom1 (datom e1 a1 v1 t1)