From 93e33121f27f221b75aec5cc1695fc09e70fc1cb Mon Sep 17 00:00:00 2001 From: Janos Erdos Date: Thu, 7 May 2026 18:24:32 +0200 Subject: [PATCH 1/2] Replace <= with compare<= for key comparisons --- src/erdos/algo/leapfrog/triejoin.clj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/erdos/algo/leapfrog/triejoin.clj b/src/erdos/algo/leapfrog/triejoin.clj index adeeb15..caaafa0 100644 --- a/src/erdos/algo/leapfrog/triejoin.clj +++ b/src/erdos/algo/leapfrog/triejoin.clj @@ -118,7 +118,7 @@ (->next [_] (ctor (leapfrog-next iterators))) (get-key [_] (get-key (first iterators))) (->seek [this k] - (assert (<= (get-key this) k)) + (assert (compare<= (get-key this) k)) (ctor (leapfrog-seek iterators k))) (deref [_] iterators) (toString [_] "")))) @@ -143,9 +143,9 @@ (let [min-key (get-key this)] (ctor (keep (fn [i] (if (= min-key (get-key i)) (->next i) i)) iterators)))) (->seek [this k] - (assert (<= (get-key this) k)) + (assert (compare<= (get-key this) k)) (ctor (keep (fn [i] (if (compare<= k (get-key i)) i (->seek i k))) iterators))) - (get-key [_] (reduce min (map get-key iterators))) + (get-key [_] (reduce (fn [a b] (if (compare<= a b) a b)) (map get-key iterators))) (trie-open [this] (let [min-key (get-key this) min-vec (filterv (fn [i] (= (get-key i) min-key)) iterators)] From f1d272dc56f184e32dcbc21e9a221a0c940ca48b Mon Sep 17 00:00:00 2001 From: Janos Erdos Date: Thu, 7 May 2026 18:25:06 +0200 Subject: [PATCH 2/2] Enhance tests for leapfrog-join and union iterators Add tests for leapfrog-join with keyword-keyed iterators and union over keyword-keyed tries. --- test/erdos/algo/leapfrog/triejoin_test.clj | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/erdos/algo/leapfrog/triejoin_test.clj b/test/erdos/algo/leapfrog/triejoin_test.clj index b326e13..4652485 100644 --- a/test/erdos/algo/leapfrog/triejoin_test.clj +++ b/test/erdos/algo/leapfrog/triejoin_test.clj @@ -36,7 +36,16 @@ (is (= [2 8] (vec (leapfrog-join [rel-1 rel-3])))) (is (= [2 8] (vec (leapfrog-join [rel-1 rel-2 rel-3])))) (is (= nil (leapfrog-join [rel-1 (sorted-iter (sorted-set -1))]))) - #_(is (map? (meta (leapfrog-join [rel-1 rel-2])))))) + #_(is (map? (meta (leapfrog-join [rel-1 rel-2]))))) + + (testing "leapfrog-join over keyword-keyed iterators, including ->seek" + (let [a (sorted-iter (sorted-set :Esau :Isaac :Jacob :Joseph)) + b (sorted-iter (sorted-set :Hank :Isaac :Jacob :Levi)) + j (leapfrog-join [a b])] + (is (= [:Isaac :Jacob] (vec j))) + (is (= :Isaac (get-key (->seek j :Isaac)))) + (is (= :Jacob (get-key (->seek j :Jacob)))) + (is (nil? (->seek j :Zara)))))) (deftest trie-iterator-tests (let [rels (sorted-set [1 3 4] [1 3 5] [1 4 6] [1 4 8] [1 4 9] [1 5 2] [3 5 2]) @@ -173,6 +182,15 @@ (are [k val] (= val (some-> iter (->seek k) get-key)) 1 1, 4 4, 6 7, 6.5 7, 20 nil))) + (testing "Union over keyword-keyed tries" + (let [iter1 (test-trie-iter [:a] [[:Isaac] [:Jacob]]) + iter2 (test-trie-iter [:a] [[:Esau] [:Jacob]]) + u (union-iterator [iter1 iter2])] + (is (= [:Esau :Isaac :Jacob] (vec u))) + (is (= :Isaac (get-key (->seek u :Hank)))) + (is (= :Jacob (get-key (->seek u :Jacob)))) + (is (nil? (->seek u :Zara))))) + #_(testing "All iterators exhausted" (let [iter1 (sorted-iter (sorted-set 1 2)) iter2 (sorted-iter (sorted-set 1 2))