[elephant-devel] Start of 0.6.1 Beta Cycle

Henrik Hjelte henrik at evahjelte.com
Wed Mar 21 17:58:14 UTC 2007


Great work.
It seems that one of my changes yesterday introduced a bug, so Ian fixed
that bug and my change disappeared in the process. It suits me right,
because I really should have made a testcase showing the bug before
fixing it. Better later than never though.

I modify the test indexing-basic in testindexing.lisp:
(get-instances-by-value 'idx-one 'slot1 nil) should return zero
instances, right? Now it returns three which is wrong.

I had to modify the map-index method in collections.lisp some more to
get this right without breaking other tests. Get-instances-by-value
calls collections with start equal to end, so I do a special check for
this, and that also makes it possible to use the cursor-pset function
instead of cursor-pset-range which could be a speedup at least in
theory.

/Henrik Hjelte

Changes:
{
hunk ./tests/testindexing.lisp 101
-               (length (get-instances-by-range 'idx-one 'slot1 n (+ 1
n))))
+               (length (get-instances-by-range 'idx-one 'slot1 n (+ 1
n)))
+                (length (get-instances-by-value 'idx-one 'slot1 nil)))
hunk ./tests/testindexing.lisp 104
-  3 2 1 t 3)
+  3 2 1 t 3 0)
hunk ./src/elephant/collections.lisp 377
-                          (next-range))))))
+                          (next-range)))))
+                 (same-start-and-end ()
+                   (when (and start-supplied-p end-supplied-p)
+                     (or (and (null start) (null end))
+                         (and start end (lisp-compare<= start end)
(lisp-compare<= end start))))))
hunk ./src/elephant/collections.lisp 384
-             (if (and start-supplied-p (not (null start)))
-                 (cursor-pset-range cur start)
-                 (cursor-pfirst cur))
+              (cond
+                ((same-start-and-end)
+                 (cursor-pset cur start))
+                ((and start-supplied-p (not (null start)))
+                 (cursor-pset-range cur start))
+                (t (cursor-pfirst cur)))
}

The whole new map-index method:

(defmethod map-index (fn (index btree-index) &rest args &key (start nil
start-supplied-p) (end nil end-supplied-p))
  "Like map-btree, but takes a function of three arguments key, value
and primary key
   if you want to get at the primary key value, otherwise use map-btree"
  (declare (dynamic-extent args)
	   (ignorable args))
  (let ((sc (get-con index)))
    (ensure-transaction (:store-controller sc)
      (with-btree-cursor (cur index)
	(labels ((next-range ()
		   (multiple-value-bind (exists? skey val pkey) (cursor-pnext-nodup
cur)
		     (if (and exists? 
			      (or (not end-supplied-p)
				  (null end)
				  (lisp-compare<= skey end)))
		       (progn
			 (funcall fn skey val pkey)
			 (next-in-range skey))
		       (return-from map-index nil))))
		 (next-in-range (key)
		   (multiple-value-bind (exists? skey val pkey) (cursor-pnext-dup cur)
		     (if exists?
			 (progn
			   (funcall fn skey val pkey)
			   (next-in-range key))
			 (progn
			   (cursor-pset-range cur key)
			   (next-range)))))
                 (same-start-and-end ()
                   (when (and start-supplied-p end-supplied-p)
                     (or (and (null start) (null end))
                         (and start end (lisp-compare<= start end)
(lisp-compare<= end start))))))
	  (declare (dynamic-extent next-range next-in-range))
	  (multiple-value-bind (exists? skey val pkey)
              (cond
                ((same-start-and-end)
                 (cursor-pset cur start))
                ((and start-supplied-p (not (null start)))
                 (cursor-pset-range cur start))
                (t (cursor-pfirst cur)))
	    (if (and exists? 
		     (or (not end-supplied-p)
			 (null end)
			 (lisp-compare<= skey end)))
		(progn
		  (funcall fn skey val pkey)
		  (next-in-range skey))
		nil)))))))






More information about the elephant-devel mailing list