   (dc/quick-check 10000 (self-join-prop 1))
   (dc/quick-check 10000 (self-join-prop 2))
   (dc/quick-check 10000 (self-join-prop 3))
+  (dc/quick-check 10000 (product-join-prop 1))
 
 
   (defn f []

       (when (false? end?)
         (.val iterator)))
  (maintain [this]
            (if (or (true? (.-end? iterator))
                    (not (key-lt (.key iterator) pinned-key)))
              (set! end? true)
              (do
                (set! end? false)
                (aset seek-key moving-key-ix (.key this))))) ;; is this needed?
  (next [this]
        (when (false? end?)
          (.seek iterator seek-key)
          (.maintain this)))
  (seek [this key]
        (when (false? end?)
          (aset seek-key moving-key-ix key)
          (.seek iterator seek-key)
          (.maintain this)))
  (down [this]
        (assert (false? end?))

      (recur (aget (.-children node) 0)))))

;; trie view of a tree
(deftype Trieterator [iterator ^:mutable seek-key ^:mutable pinned-key marked-seek-keys marked-pinned-keys ^:mutable moving-key-ix ^:mutable end? key-len]
  Object
  (key [this]
       (when (false? end?)
