<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.3.2">
</HEAD>
<BODY>
Dear Aycan,<BR>
<BR>
    I will try to answer this more carefully tomorrow morning.<BR>
    <BR>
    For now just let me say that I have heard there is a bug about keys not being actually <BR>
removed; I will try to think about this when I have time tomorrow morning.<BR>
<BR>
    I am not sure what the problem is with the timestamps; but I have done things very similar<BR>
to what you are trying, so I assume we will be able to get it to work.<BR>
<BR>
<BR>
<BR>
On Sat, 2006-04-08 at 11:26 +0300, Aycan iRiCAN wrote:
<BLOCKQUOTE TYPE=CITE>
<PRE>
<FONT COLOR="#000000">Hi,</FONT>

<FONT COLOR="#000000">Firstly, I want to thank you again for this great project.</FONT>

<FONT COLOR="#000000">Let me ask some questions. What is the difference between using</FONT>
<FONT COLOR="#000000">get-instances-by-class and using cursors?</FONT>

<FONT COLOR="#000000">When I use get-instances-by-class I get every instance (including</FONT>
<FONT COLOR="#000000">deleted keys) of the class. But when I use cursors, I only get</FONT>
<FONT COLOR="#000000">existing keys.</FONT>

<FONT COLOR="#000000">HEDEE> (get-instances-by-class 'user)</FONT>
<FONT COLOR="#000000">(#<USER "test" 3353473039> #<USER "aycan" 3353182543>)</FONT>
<FONT COLOR="#000000">HEDEE> (remove-kv 5 *hedee-users*)</FONT>
<FONT COLOR="#000000">T</FONT>
<FONT COLOR="#000000">HEDEE> (get-instances-by-class 'user)</FONT>
<FONT COLOR="#000000">(#<USER "test" 3353473039> #<USER "aycan" 3353182543>)</FONT>
<FONT COLOR="#000000">HEDEE> (with-transaction ()</FONT>
<FONT COLOR="#000000">   (with-btree-cursor (c *hedee-users*)</FONT>
<FONT COLOR="#000000">     (loop</FONT>
<FONT COLOR="#000000">      for (m k v) = (multiple-value-list</FONT>
<FONT COLOR="#000000">                     (cursor-first c))</FONT>
<FONT COLOR="#000000">      then (multiple-value-list (cursor-next c))</FONT>
<FONT COLOR="#000000">      while m      </FONT>
<FONT COLOR="#000000">      collect v into users</FONT>
<FONT COLOR="#000000">      finally (return (nreverse users)))))</FONT>
<FONT COLOR="#000000">(#<USER "aycan" 3353182543>)</FONT>

<FONT COLOR="#000000">Is it possible to completely remove a key from a btree?</FONT>

<FONT COLOR="#000000">Say I have a class named user (used above):</FONT>

<FONT COLOR="#000000">(defclass user ()</FONT>
<FONT COLOR="#000000">  ((id :accessor id :initarg :id :type integer</FONT>
<FONT COLOR="#000000">       :initform (next-id)</FONT>
<FONT COLOR="#000000">       :index t)</FONT>
<FONT COLOR="#000000">   (name :accessor name :initarg :name</FONT>
<FONT COLOR="#000000">   :initform nil :index t)</FONT>
<FONT COLOR="#000000">   (epitaph :accessor epitaph :initarg :epitaph</FONT>
<FONT COLOR="#000000">      :initform nil)</FONT>
<FONT COLOR="#000000">   (image-type :accessor image-type :initarg :image-type :type string</FONT>
<FONT COLOR="#000000">         :initform nil)</FONT>
<FONT COLOR="#000000">   (timestamp :accessor timestamp :initarg :timestamp :type integer :index t</FONT>
<FONT COLOR="#000000">        :initform (get-universal-time)))</FONT>
<FONT COLOR="#000000">  (:metaclass persistent-metaclass))</FONT>

<FONT COLOR="#000000">and I created secondary indices via:</FONT>

<FONT COLOR="#000000">(defun add-indices ()</FONT>
<FONT COLOR="#000000">  (with-transaction ()</FONT>
<FONT COLOR="#000000">    (add-index *hedee-users*</FONT>
<FONT COLOR="#000000">         :index-name 'id :key-form '(lambda (s key value)</FONT>
<FONT COLOR="#000000">                                     (declare (ignore s key))</FONT>
<FONT COLOR="#000000">                                     (values t (id value))))</FONT>
<FONT COLOR="#000000">    (add-index *hedee-users*</FONT>
<FONT COLOR="#000000">         :index-name 'name :key-form '(lambda (s key value)</FONT>
<FONT COLOR="#000000">                                       (declare (ignore s key))</FONT>
<FONT COLOR="#000000">                                       (values t (name value))))</FONT>
<FONT COLOR="#000000">    (add-index *hedee-users*</FONT>
<FONT COLOR="#000000">         :index-name 'timestamp :key-form '(lambda (s key value)</FONT>
<FONT COLOR="#000000">                                            (declare (ignore s key))</FONT>
<FONT COLOR="#000000">                                            (values t (timestamp value))))))</FONT>

<FONT COLOR="#000000">I tried to get users with a timestamp around some delta (320000 in</FONT>
<FONT COLOR="#000000">below) via:</FONT>

<FONT COLOR="#000000">(get-instances-by-range 'user</FONT>
<FONT COLOR="#000000">                        (get-index *hedee-users* 'timestamp) </FONT>
<FONT COLOR="#000000">                        (get-universal-time) </FONT>
<FONT COLOR="#000000">                        (- (get-universal-time) 320000))</FONT>

<FONT COLOR="#000000">But I'm getting:</FONT>

<FONT COLOR="#000000">The value 3353473355 is not of type FIXNUM.</FONT>

<FONT COLOR="#000000">How can I query by range using a timestamp?</FONT>

<FONT COLOR="#000000">Best Regards,</FONT>

<FONT COLOR="#000000">_______________________________________________</FONT>
<FONT COLOR="#000000">elephant-devel site list</FONT>
<FONT COLOR="#000000"><A HREF="mailto:elephant-devel@common-lisp.net">elephant-devel@common-lisp.net</A></FONT>
<FONT COLOR="#000000"><A HREF="http://common-lisp.net/mailman/listinfo/elephant-devel">http://common-lisp.net/mailman/listinfo/elephant-devel</A></FONT>
</PRE>
</BLOCKQUOTE>
</BODY>
</HTML>