[Zope3-dev] a simple product

Tres Seaver tseaver@zope.com
20 Jan 2003 10:09:36 -0500


On Mon, 2003-01-20 at 08:24, Steve Alexander wrote:

> >> If you need to index dates, you'll want to use a Field Index for that. 
> >> This needs to be ported from Zope 2.
> > 
> > Surely the funky Date or DateRange index would be better to use?
> 
> I'm not aware of such a product, although I remember some talk about it.

Both types are "standard" plug-in indexes as of Zope 2.6.  From the
DateIndex README:

    Normal FieldIndexes *can* be used to index values which are DateTime
    instances, but they are hideously expensive:

    o DateTime instances are *huge*, both in RAM and on disk.

    o DateTime instances maintain an absurd amount of precision, far
      beyond any reasonable search criteria for "normal" cases.

    DateIndex is a pluggable index which addresses these two issues
    as follows:

    o It normalizes the indexed value to an integer representation
      with a granularity of one minute.

    o It normalizes the 'query' value into the same form.

    o Objects which return 'None' for the index query are omitted from
      the index.

>From the DateRangeIndex README:

    Zope applications frequently wish to perform efficient queries
    against a pair of date attributes/methods, representing a time
    interval (e.g., effective / expiration dates).  This query *can*
    be done using a pair of indexes, but this implementation is
    hideously expensive:

    o DateTime instances are *huge*, both in RAM and on disk.

    o DateTime instances maintain an absurd amount of precision, far
      beyond any reasonable search criteria for "normal" cases.

    o Results must be fetched and intersected between two indexes.

    o Handling objects which do not specify both endpoints (i.e.,
      where the interval is open or half-open) is iffy, as the
      default value needs to be coerced into a different abnormal
      value for each end to permit ordered comparison.

    o The *very* common case of the open interval (neither endpoint
      specified) should be optimized.

    DateRangeIndex is a pluggable index which addresses these issues
    as follows:

    o It groups the "open" case into a special set, '_always'.

    o It maintains separate ordered sets for each of the "half-open"
      cases.

    o It performs the expensive "intersect two range search" operation
      only on the (usually small) set of objects which provide a
      closed interval.

    o It flattens the key values into integers with granularity of
      one minute.

    o It normalizes the 'query' value into the same form.

Both indexes derive, like FieldIndex and KeywordIndex, from UnIndex;
porting the whole package is probably not that much harder than porting
only one index.

Tres.
-- 
===============================================================
Tres Seaver                                tseaver@zope.com
Zope Corporation      "Zope Dealers"       http://www.zope.com