[elephant-devel] get-instances-by-range oddity

Kevin Raison raison at chatsubo.net
Tue Nov 11 01:11:17 UTC 2008


Thanks, Ian.  This solved my problem for new objects.  Now, is there an 
easy way to re-index existing objects?

Cheers.
Kevin


Ian Eslick wrote:
> I don't have time to dive into the details of 'why' this is failing,  
> but here is a workaround in the meantime.
> 
> (defmethod cursor-set-range :around ((cursor bdb-cursor) key)
>    (multiple-value-bind (valid? k v)
>        (cursor-set cursor key)
>      (if valid?
> 	(values valid? k v)
> 	(cursor-next cursor))))
> 
> This is in the db-bdb package.
> 
> For some reason cursor-next does the comparison properly while cursor- 
> set-range does not.  Something about the types returned by (get- 
> universal-time) cause the serializer to do something unexpected and it  
> will take some time to track it down due to issues of visibility in  
> the serializer buffer streams.
> 
> Let me know if this gets you unstuck.
> 
> Ian
> 
> On Nov 6, 2008, at 11:14 PM, Kevin Raison wrote:
> 
>> Given this class defined with elephant-unstable in sbcl 10.22 using
>> berkeleydb 4.6:
>>
>> (defpclass test-class ()
>>   ((host :accessor host :initarg :host :type string :initform  
>> "" :index t)
>>    (timestamp :accessor timestamp :initarg :timestamp :initform
>> (get-universal-time)
>>               :type integer :index t))
>>   (:index t))
>>
>> Can someone help me understand why this works:
>>
>> CL-USER> (make-instance 'test-class :host "test1" :timestamp  
>> 10000000000)
>> #<TEST-CLASS oid:791>
>> CL-USER> (get-instances-by-range 'test-class 'timestamp 0 10000000001)
>> (#<TEST-CLASS oid:791>)
>>
>> But this does not:
>> CL-USER> (make-instance 'test-class :host "test1" :timestamp
>> (get-universal-time))
>> #<TEST-CLASS oid:795>
>> CL-USER> (get-instances-by-range 'test-class 'timestamp 0
>> (get-universal-time))
>> NIL
>> CL-USER> (get-instances-by-range 'test-class 'timestamp 0 10000000001)
>> NIL
>>
>> When (type-of (get-universal-time)) is (INTEGER 0 1152921504606846975)
>>
>>
>> If I do not drop all instances between the above two command sets, I  
>> get
>> this:
>> CL-USER> (make-instance 'test-class :host "test1" :timestamp  
>> 10000000000)
>> #<TEST-CLASS oid:798>
>> CL-USER> (get-instances-by-range 'test-class 'timestamp 0 10000000001)
>> (#<TEST-CLASS oid:798>)
>> CL-USER> (make-instance 'test-class :host "test1" :timestamp
>> (get-universal-time))
>> #<TEST-CLASS oid:799>
>> CL-USER> (get-instances-by-range 'test-class 'timestamp 0
>> (get-universal-time))
>> (#<TEST-CLASS oid:798>)
>> CL-USER> (get-instances-by-range 'test-class 'timestamp 0 10000000001)
>> (#<TEST-CLASS oid:798>)
>>
>>
>> I have tried a number of variations, including not specifying types in
>> the class definition, specifying "number" as the type of timestamp,
>> coercing (get-universal-time) to an integer.  Nothing has worked.  Can
>> anyone shed light on this for me?  Am I missing something obvious?   
>> The
>> hyperspec specifies that universal time "is an absolute time  
>> represented
>> as a single non-negative integer."  So why would it not be indexed  
>> like
>> any other integer?
>>
>> Thanks in advance.
>>
>> Kevin Raison
>>
>> _______________________________________________
>> elephant-devel site list
>> elephant-devel at common-lisp.net
>> http://common-lisp.net/mailman/listinfo/elephant-devel
> 
> 
> _______________________________________________
> elephant-devel site list
> elephant-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/elephant-devel




More information about the elephant-devel mailing list