[Grok-dev] declaring catalog indexes

Martijn Faassen faassen at startifact.com
Sat Apr 14 12:38:40 EDT 2007


Hi there,

The current way to set up catalog indexes in Grok looks like this:

def setup_catalog(catalog):
    catalog['a_index'] = FieldIndex('a_attribute',
      ISomeInterface)
    catalog['b_index'] = TextIndex('b_attribute', 

      ISomeInterface)

class App(grok.Application):
    grok.local_utility(IntIds, provides=IIntIds)
    grok.local_utility(Catalog,
       provides=ICatalog, name='my_catalog', setup=setup_catalog)

This will index everything providing ISomeInterface. We can also set up 
an adapter from our own objects to ISomeInterface and this will result 
in those objects being indexed as well.

This approach is pretty powerful. If I have an extension object that 
wants to be indexed, I merely have to implement the right interface on 
my object, or provide some adapter from my object to that interface.

The main drawback to this approach is that all indexes are set up 
centrally. Of course you can write code to adjust the catalog later (and 
have no setup_catalog), but are there patterns we can come up with to 
make the creation of indexes more easy?

Let's translate the above in another proposal:

class App(grok.Application):
     grok.local_utility(IntIds, provides=IIntIds)
     grok.local_utility(Catalog, provides=ICatalog, name='my_catalog')

class AIndex(grok.FieldIndex):
    grok.catalog(App, 'my_catalog')
    grok.attribute('a_attribute', ISomeInterface)

class BIndex(grok.TextIndex):
    grok.catalog(App, 'my_catalog')
    grok.attribute('b_attribute', ISomeInterface)

The indexes are grokked automatically and get created in the catalog 
when 'App' is created using a subscriber. This allows an extension 
modules to create new indexes in the core. Of course the app would still 
need to be reinstalled to enable those indexes, but with some clever 
event registration (IApplicationSetup event?) we might be able to handle 
that quite nicely as well.

One issue that this approach has is if indexes take other parameters 
than the three I know about (attribute name, interface, boolean on 
whether to call attribute or not). How do we pass them in? Does anyone 
have experience with indexes that can use extra information?

What do people think?

Regards,

Martijn



More information about the Grok-dev mailing list