[elephant-devel] Persistent classes
Ian Eslick
eslick at media.mit.edu
Mon Apr 21 03:20:52 UTC 2008
Hi Richard,
I'm not a SQL guru, but I believe that OFFSET and LIMIT are typically
performed on the result of a query. The resulting OFFSET and/or LIMIT
is typically going to be O(q) rather than O(n). However, many query
optimizers use arrays to store the active query set rather than
BTrees, and of course it's easy to skip to the n'th value in a query
array. I'm hoping our new query system will be able to do something
like this.
>>
>> 4) What is the intended use of `add-class-derived-index'? I must say
>> that the documentation isn't very clear about it (specially figuring
>> out what is a valid `derived-defun' wasn't trivial). Tight now I
think
>> I am supposed to run it once (it complains about a duplicate index
if
>> run a second time). This isn't exactly handy, because I would prefer
>> that defining a derived index to left a clear trace in my code.
Right
>> now I am calling it wrapped with `handler-case'.
> Uhhh....Ian will have to answer that.
The dynamic nature of add-dynamic-index has annoyed me for awhile
too. Originally, I didn't want to implement the metaprotocol support
to do this in the class definition and didn't take the time to provide
a top-level macro to take care of this. I have now put support into
the persistent-object metaprotocol on the unstable branch for the
following construct:
(defclass foo ()
((slot1 :accessor slot1)
(slot2 :accessor slot2)
(didx :accessor didx
:derived-fn (lambda (inst) (+ slot1 slot2))
:slot-deps (slot1 slot2))))
didx is now an indexed slot which is a function of the value of other
slots. It is only updated when slot1 or slot2 are written. Be warned
that derived functions can be expensive as they are updated when any
dependent slot is written. If not slot-dep argument is provided, the
derived index value is recomputed on each slot write to that instance.
The unstable branch is at beta quality. It passes prior tests, some
new tests but the new features and overall stability have not been
proven out. I'm using it extensively with BDB, but we're still
waiting on the relational data store maintainers (clsql and
postmodern) to find the time to add the required support. So as
Robert said, use it if you're experimenting or developing with
elephant, but don't use it in production until it's finalized (a few
weeks to a month or two from now).
The feature set in unstable includes a much more robust schema
evolution mechanism along with inherited slot indices (a base class
can index instances of its subclasses), a number of new slot types
including read-caching slots, collection slots, and associations.
A more extensive update can be found at:
http://common-lisp.net/pipermail/elephant-devel/2008-March/001646.html
> Hi, I've started using Elephant and I must say I am really surprised
> how easy and nice to use it is. However, there are some areas where
> I feel a bit lost, and I couldn't find the answers in the manual. I
> am using Elephant 0.9.1 with a BDB backend. 1) What is the right way
> of doing something similar to a UNIQUE constraint in a relational
> database? The solution on top of my head is to write a method for
> `initialize-instance' that will check the existence of an object
> with the same value as the provided for the unique slot (which
> should of course be indexed), and raise a condition if yes. 2) What
> is the right way to do many-to-many relationships? At the moment I
> have slot with a pset, and add object A to the pset of object B and
> vice versa, in a transaction. 3) How do I implement something to do
> efficient (i.e. not O(n)) LIMIT and OFFSET queries? I was thinking
> of maintaining a counter (my intuition would be to use a class
> allocated slot, but I think that class objects are not serialized---
> am I right?) for classes where I need it, and using some method to
> update it. For decreasing the counter my candidate is drop-pobject,
> for increasing initialize-instance, but I am not sure about it (btw
> Elephant complains if you try to trace `initialize-instance'). 4)
> What is the intended use of `add-class-derived-index'? I must say
> that the documentation isn't very clear about it (specially figuring
> out what is a valid `derived-defun' wasn't trivial). Tight now I
> think I am supposed to run it once (it complains about a duplicate
> index if run a second time). This isn't exactly handy, because I
> would prefer that defining a derived index to left a clear trace in
> my code. Right now I am calling it wrapped with `handler-case'.
> Finally, how stable is the unstable version of Elephant and what are
> the most important changes that have already been implemented? I am
> specially interested in the query language part. Thanks in advance,
> -- Richard
More information about the elephant-devel
mailing list