Generally using get-instances-xxx is expensive (you have to cons up all objects). A more efficient solution would be to map-inverted- index over slot-b value and filter by the slot-a value. If slot-b returns a small set, this is pretty darned efficient.
The little query interpreter we have now should do this automatically. It's something like this (I don't have time to look up the syntax just now) (map-query (select ((?c my-class)) (= (slot-a ?c) val-a) (= (slot-b ?c) val-b)) However, if you don't have a small set in either a or b, you can create a virtual slot that is some function of a and b and automatically updated when slot a and b are updated. For now the best way to do this is to put them into a string that can be totally ordered. We need a good solution for sorting on short sequences of primitive values so we can have pre-computed join indices.0 However, later the query system will allow you to do reasonably efficient equality joins on the value/ranges in each slot (assuming both are indexed). In fact the new system in query2.lisp might actually handle the simple join query you're trying to do above - it would be worth a quick try. Ian On Jan 6, 2009, at 1:36 AM, Yarek Kowalik wrote: > I've run into several situations where I want to query for objects > that match values two or more slots. I currently do something like > this: > > (defclass my-class () > ((a :accessor slot-a) > (b :accessor slot-b > :index b)) > (:documentation "my test class")) > > (find-if (lambda (obj) > (equal (slot-a obj) val-a)) > (elephant:get-instances-by-value 'my-class 'slot-b val-b)) > > > Is this a reasonable way of finding an object of type 'my-class that > matches on values val-a and val-b for slots a and b? > > Yarek > _______________________________________________ > elephant-devel site list > elephant-devel@common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel _______________________________________________ elephant-devel site list elephant-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/elephant-devel