[Zope-dev] Hey Chris, question for you

Chris McDonough chrism@digicool.com
Tue, 26 Jun 2001 14:24:23 -0400


> Chris:
>
> I am working on getting a decent query language for ZCatalog/Catalog and

Very cool...

> I have been able to make good progress, however I am running into a bit
> of an issue that I thought you might know something about:
>
> In order to implement a "!=" query operator, I am trying to do the
> following:

Tricky.

> >From the index, return the result set that match the value (easy)
> Subtract that from the set of all items in the index (not so easy)
>
> I see that there is the difference method available from IIBTree,
> however I seem to be unable to use it on the entire index (Which is an
> OOBTree and not really a set I guess). Here is a snippit of my code
> which doesn't work:
>
> if op == '!=' or op[:3] == 'not':
> w, rs = difference(index._index, rs) # XXX Not a warm fuzzy...
>
> (where rs is the index result set that matches the value and index is
> the Catalog index OOBTree)
>
> What can I supply for the first argument to get a set of all items in
> the index, or is there any easier and better approach to this whole
> issue?

Well.. I assume that _index is the forward data structure of a FieldIndex.
In this case, you could get the info you want (a list of all document ids in
the index) from _unindex.keys(), as _index and _unindex are mirror images of
each other that need to be kept in sync... I think what comes back is a
BTreeItems object.  I think this is usable in conjunction with the resultset
IISet (also a list of document ids) via the difference function... I haven't
tried it, though...

> BTW: I realize I could step though _index.items() and create an IISet
> but that seems awful inefficient...

Yeah, that'd be terrible.

This is a tricky operator.  I can't really wrap my head around using it in
conjunction with parens.  Then again, maybe you wouldn't...


HTH,

- C