[elephant-devel] virtual subtree?
Ian Eslick
eslick at csail.mit.edu
Mon Apr 16 16:04:59 UTC 2007
A final clarification:
map-index is a feature of the upcoming 0.9 release. The same
effective functionality can be achieved on version 0.6.0 using cursor
operations cursor-pset and cursor-pnext-dup.
Ian
On Apr 15, 2007, at 2:52 PM, Ian Eslick wrote:
> I should clarify two points from my last e-mail.
>
> I added to the first btree the elements:
>
> k: 1 v:'test1
> k: 2 v:'test
> k 10 v:10
> k 20 v:20
>
> That generated the test result.
>
> The final index, 'triple-first, only indexes triples and no other
> types. It accomplishes this by returning an 'index-p' value. The
> first value returned by the :key-form is whether or not to index
> the value provided to get-value. The second value is the secondary-
> key to use to create the index entry that is used to find the value
> in the main indexed-btree, in this case the triple with the first
> value equal to the generated secondary key.
>
> Sorry if that is wordy - please ask questions if any of this is
> unclear.
>
> Cheers,
> Ian
>
> On Apr 15, 2007, at 2:34 PM, Ian Eslick wrote:
>
>> Joe,
>>
>> The easiest thing I can think of is to create a derived index on
>> the classes of
>> elements in your btree and then use map-index to map over the
>> instances.
>>
>> ELE-TESTS> (setf my-things (make-indexed-btree))
>>
>> ELE-TESTS> (add-index my-things :index-name 'thing-type
>> :key-form '(lambda (index k v)
>> (values t (type-of v))))
>>
>> ELE-TESTS> (map-index (lambda (sk v pk) (print v))
>> (get-index my-things 'thing-type) :value 'symbol)
>>
>> TEST1
>> TEST2
>> NIL
>>
>> ELE-TESTS> (map-index (lambda (sk v pk) (print v))
>> (get-index my-things 'thing-type) :value 'fixnum)
>>
>> 10
>> 20
>> NIL
>>
>> Or better, you can mix this in with an efficient search for your
>> triples, such as:
>>
>> ELE-TESTS> (add-index my-things :index-name 'triples-first
>> :key-form '(lambda (index k v)
>> (if (subtypep (type-of v)
>> 'triple) t)
>> (values t (triple-first v))
>> (values nil nil)))
>> :populate t)
>>
>> This will create an index 'triples-first which only indexes
>> triples and does so by the value of the first element. Thus you
>> can easily retrieve all triples with the first element eq to 5.
>>
>> ELE-TESTS> (map-index (lambda (sk v pk) (print v)) (get-index my-
>> things 'triples-first :value 5)))
>>
>> The index will be automatically populated if there are already
>> elements. Otherwise all new elements will automatically be added
>> to the new index.
>>
>> This does create a parallel 'index' which is its own btree. There
>> isn't a good way to do this using only a single btree as we don't
>> expose the sort order constraints or allow the user to create
>> partial keys so they can use cursors to iterate over a subset of
>> the btree. Now if you indexed your things by typename, then you
>> could do this with a single tree, although you'd have to go over
>> indexes
>>
>> Cheers,
>> Ian
>>
>>
>> A brief aside:
>>
>> One of the major issues on queue for v 0.9.1 is how do we
>> automatically do something similar
>> for class heirarchies. If I want an index to go over all elements
>> of a base class,
>> but a restricted index to go over all elements of some subtype,
>> how do we implement and
>> specify this.
>>
>> For example, if we had base class 'people and subclasses
>> 'employee, 'manager, 'consultant, etc.
>> What if we wanted to retrieve all 'employees and 'managers named
>> "Bob"? Today you'd have to map
>> over each class index separately. I'd like to be able to map over
>> 'people if people has a slotname
>> for "Name" that is common to the subclasses and get back all
>> objects of any subclass with that name.
>>
>>
>> On Apr 15, 2007, at 12:39 PM, Joe Corneli wrote:
>>
>>> I am wondering whether it is possible to efficiently treat a
>>> subset of
>>> a given btree as its own tree. Specifically: if I have a collection
>>> of miscellaneous data, which I'll call Things, some of which are
>>> Triples, can I specifically examine all of the Triples in my
>>> collection, and from that sub-set, find those Triples whose first
>>> slot
>>> is, say, equal to 5?
>>>
>>> Or must I do what seems to be the expected thing, and treat
>>> Things and
>>> Triples as a separate btrees if I want to efficiently search through
>>> the slots of my Triples?
>>> _______________________________________________
>>> 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
>
> _______________________________________________
> 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