[rucksack-devel] indexing issue?
Cyrus Harmon
ch-rucksack at bobobeach.com
Thu Nov 30 00:32:12 UTC 2006
Ah, it's not the symbol that's the issue, it's that I can't do
rucksack-map-slot unless :unique is t. I assume this should work for
non-unique indices as well?
Thanks,
Cyrus
On Nov 29, 2006, at 3:54 PM, Cyrus Harmon wrote:
> perhaps I'm doing something wrong here, but I can't seem to get
> indexing for non symbols to work properly:
>
> =====
>
> (cl:defpackage :rucksack-object-test (:use :cl :rucksack))
>
> (cl:in-package :rucksack-object-test)
>
> (eval-when (:compile-toplevel :load-toplevel)
> (defparameter *test-suite* #p"/tmp/rucksack-object-test/"))
>
> (defparameter *names* '("David" "Jim" "Peter" "Thomas"
> "Arthur" "Jans" "Klaus" "James" "Martin"))
>
> (defparameter *moods* '("Happy" "Sad" "Mad" "Tired" "Bored"))
>
> (defclass thingy ()
> ((frobosity :accessor frobosity :initarg :frobosity :initform 32)))
>
> (eval-when (:compile-toplevel :load-toplevel)
> (with-rucksack (rucksack *test-suite* :if-exists :supersede)
> (with-transaction ()
> (defclass person (thingy)
> ((id :initform (gensym "PERSON-")
> :reader hacker-id
> :index :symbol-index
> :unique t)
> (name :initform (elt *names* (random (length *names*)))
> :initarg :name
> :accessor name
> :index :case-insensitive-string-index)
> (age :initform (random 100)
> :initarg :age
> :accessor age
> :index :number-index)
> (mood :initform (elt *moods* (random (length *moods*)))
> :accessor mood
> :index :string-index))
> (:metaclass persistent-class)
> (:index t)))))
>
> (defmethod print-object ((person person) stream)
> (print-unreadable-object (person stream :type t)
> (format stream "called ~S of age ~D who is ~A"
> (name person)
> (age person)
> (mood person))))
>
> (defun test-create (&key (nr-objects 10))
> "Test creating a rucksack with many persons."
> (with-rucksack (rucksack *test-suite*)
> (with-transaction ()
> (loop for i below nr-objects
> do (let ((person (make-instance 'person :age i)))
> (print (age person))
> (add-rucksack-root person rucksack))))))
>
> (defun test-get ()
> (with-rucksack (rucksack *test-suite*)
> (with-transaction ()
> (map-rucksack-roots (lambda (root)
> (print (cons root (frobosity root))))
> rucksack))))
>
> (defun test-number-index ()
> (with-rucksack (rucksack *test-suite*)
> (with-transaction ()
> (rucksack-map-slot rucksack 'person 'age #'print :equal 1))))
>
> (defun test-string-index ()
> (with-rucksack (rucksack *test-suite*)
> (with-transaction ()
> (rucksack-map-slot rucksack 'person 'mood #'print :equal
> "Sad")))
>
> (with-rucksack (rucksack *test-suite*)
> (with-transaction ()
> (dotimes (i 10) (let ((q (make-instance 'person)))
> (add-rucksack-root q rucksack))))))
>
> ======
>
> and then
>
> (test-create)
> (test-number-index)
>
> gives the following:
>
> Argument X is not a NUMBER:
> #<PERSISTENT-CONS #97 in #<STANDARD-CACHE of size 10000, heap #P"/
> tmp/rucksack-object-test/heap" and 24 objects in memory.>>
> [Condition of type SIMPLE-TYPE-ERROR]
>
> Restarts:
> 0: [ABORT] Abort #<STANDARD-TRANSACTION #337383312100000 with 0
> dirty objects>
> 1: [RETRY] Retry #<STANDARD-TRANSACTION #337383312100000 with 0
> dirty objects>
> 2: [ABORT-REQUEST] Abort handling SLIME request.
> 3: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-
> thread" {1190A6B1}>)
>
> Backtrace:
> 0: (SB-KERNEL:TWO-ARG-* #<PERSISTENT-CONS #97 in #<STANDARD-CACHE
> of size 10000, heap #P"/tmp/rucksack-object-test/heap" and 24
> objects in memory.>> 16)
> 1: (RUCKSACK::OBJECT-ID-TO-BLOCK #<PERSISTENT-CONS #97 in
> #<STANDARD-CACHE of size 10000, heap #P"/tmp/rucksack-object-test/
> heap" and 24 objects in memory.>> #<RUCKSACK::OBJECT-TABLE
> {128C6A29}>)
> 2: (RUCKSACK::OBJECT-HEAP-POSITION #<RUCKSACK::OBJECT-TABLE
> {128C6A29}> #<PERSISTENT-CONS #97 in #<STANDARD-CACHE of size
> 10000, heap #P"/tmp/rucksack-object-test/heap" and 24 objects in
> memory.>>)
> 3: (RUCKSACK::FIND-COMMITTED-OBJECT-VERSION #<PERSISTENT-CONS #97
> in #<STANDARD-CACHE of size 10000, heap #P"/tmp/rucksack-object-
> test/heap" and 24 objects in memory.>> 337383312100000 #<MARK-AND-
> SWEEP-HEAP {128C8499}>)
> 4: ((SB-PCL::FAST-METHOD RUCKSACK::LOAD-OBJECT (T T STANDARD-
> CACHE)) #<unavailable argument> #<unavailable argument>
> #<PERSISTENT-CONS #97 in #<STANDARD-CACHE of size 10000, heap #P"/
> tmp/rucksack-object-test/heap" and 24 objects in memory.>>
> #<STANDARD-TRANSACTION #337383312100000 with 0 dirty objects>
> #<STANDARD-CACHE of size 10000, heap #P"/tmp/rucksack-object-test/
> heap" and 24 objects in memory.>)
> 5: ((SB-PCL::FAST-METHOD CACHE-GET-OBJECT (T STANDARD-CACHE))
> #<unavailable argument> #<unavailable argument> #<PERSISTENT-CONS
> #97 in #<STANDARD-CACHE of size 10000, heap #P"/tmp/rucksack-object-
> test/heap" and 24 objects in memory.>> #<STANDARD-CACHE of size
> 10000, heap #P"/tmp/rucksack-object-test/heap" and 24 objects in
> memory.>)
> 6: ((LAMBDA (SLOT-VALUE OBJECT-ID)) #<unavailable argument>
> #<PERSISTENT-CONS #97 in #<STANDARD-CACHE of size 10000, heap #P"/
> tmp/rucksack-object-test/heap" and 24 objects in memory.>>)
> 7: ((LABELS RUCKSACK::MAP-SLOT) #<PERSISTENT-CLASS PERSON>)
> 8: ((SB-PCL::FAST-METHOD RUCKSACK-MAP-SLOT (STANDARD-RUCKSACK
> #1="#<...>" . #1#)) #<unavailable argument> #<unavailable argument>
> #<RUCKSACK::SERIAL-TRANSACTION-RUCKSACK in #P"/tmp/rucksack-object-
> test/" with 10 roots {128C3319}> PERSON AGE #<FUNCTION PRINT>)
> 9: (TEST-NUMBER-INDEX)
> 10: (SB-INT:SIMPLE-EVAL-IN-LEXENV (TEST-NUMBER-INDEX) #<NULL-LEXENV>)
> --more--
>
>
> any ideas what I might be doing wrong?
>
> Thanks,
>
> Cyrus
>
> _______________________________________________
> rucksack-devel mailing list
> rucksack-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/rucksack-devel
More information about the rucksack-devel
mailing list