Hi Ian, On 4/21/07, Ian Eslick <[EMAIL PROTECTED]> wrote:
This example could be done even more cleanly using the class indexing facilities. If you feel inclined to experiment with them, this would be a good contribution to improve the example.
Actually it turned out to be an interesting exercise. Please see the attached file. I have some questions, though. * Displaying all the blog entries in descending order Using the b-tree index, one could iterate through the entries with a cursor as shown in the original example code: (with-btree-cursor (curs *my-blog*) (loop for (m k v) = (multiple-value-list (cursor-first curs)) then (multiple-value-list (cursor-next curs)) while m collect v)) Now after I replace the explicit index with a class index, I couldn't figure out how to use cursor on the class index. Maybe there's an undocumented way to do this? (loop for v in (sort (get-instances-by-class 'blog-entry) #'> :key #'entry-date) collect v) Now I have to get all the instances from that class. I assumed the result returned by get-instances-by-class is just a list of OID's? Elephant will only fetch the values when I use the accessor functions on the OID handle, right? Another downside with this approach is that I need to manually sort the entries (I guess if my assumption from the previous paragraph is true, then I'm really paying the penalty here if there are a lot of entries to sort) whereas in the original code it's taken care of by the cursor API. * Displaying all the blog entries for a particular month in descending order (with-btree-cursor (curs (get-index *my-blog* 'month)) (loop for (m k v) = (multiple-value-list (cursor-set curs month-year)) then (multiple-value-list (cursor-next-dup curs)) while m collect v)) (loop for v in (multiple-value-bind (start end) (the-month-range month-year) (nreverse (get-instances-by-range 'blog-entry 'date start end))) collect v) In this case both the cursor and the get-instances-by-range API are rather easy to use. Unlike get-instances-by-class, get-instances-by-range seems to always return the result sorted, is that correct? When I first read the documenation, I couldn't think of a use case for cursor-next-dup. It is really handy as shown in the original example. * Displaying href links to previous blog entries (month/year) (loop for (m k v) = (multiple-value-list (cursor-first curs)) then (multiple-value-list (cursor-next-nodup curs)) while m collect v))) (let ((month-year)) (loop for entry in (get-instances-by-class 'blog-entry) do (multiple-value-bind (second minute hour date month year) (decode-universal-time (entry-date entry)) (declare (ignore second minute hour date)) (pushnew (encode-universal-time 0 0 0 1 month year) month-year))) (sort month-year #'>)) Now the cursor API is much easier to use in this case. Again, since I can't figure out a way to use cursor on the class index, I need to go through _all_ the entries, collect and sort the date myself. I believe I'm not using this stuff right, so please show us the way :-) Regards, -- Mac
hunchentoot.blog.lisp
Description: Binary data
_______________________________________________ elephant-devel site list elephant-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/elephant-devel