[Grok-dev] Migrating catalog indexes

Sebastian Ware sebastian at urbantalk.se
Fri Nov 27 04:33:29 EST 2009


This looks very interesting! It addresses my biggest gripe with Grok  
to date.

But how do you set the grok.context of the index? When defining a  
grok.Index one can have the same catalog name for different contexts.  
 From your code example I don't see how I specify this. This is what a  
typical catalog would look like for me:

class SiteSearchCatalog(grok.Indexes):
     grok.site(BoardsportSource)
     grok.context(IFeedItemSupport)
     grok.name('feed_index')

     tags = grok.index.Set()
     feed_types = grok.index.Set(attribute='supportedFeedTypes')
     search = grok.index.Text(attribute="fullTextSearch"

from boardsportsource.interfaces import IPublishDate
class SitePublishCatalog(grok.Indexes):
     grok.site(BoardsportSource)
     grok.context(IPublishDate)
     grok.name('feed_index')

     publish_datetime = Value(attribute='publish_datetime')

Mvh Sebastian

27 nov 2009 kl. 00.24 skrev Simon Jagoe:

> 2009/11/26 Kevin Teague <kevin at bud.ca>:
>> If you've got an Indexes, such as:
>>
>> class MyIndexes(grok.Indexes):
>>   grok.site(MyApp)
>>   grok.context(gsc.haystack.interfaces.IContent)
>>
>>   created = grok.index.Field()
>>
>> And it gets grokked, then a catalog and a field index will be  
>> created.
>> But then if you add a second field index:
>>
>> class MyIndexes(grok.Indexes):
>>   grok.site(MyApp)
>>   grok.context(gsc.haystack.interfaces.IContent)
>>
>>   created = grok.index.Field()
>>   modified = grok.index.Field()
>>
>> This index doesn't get created. Soooo ... what's the best way to
>> migrate a catalog when the indexes are updated after the initial
>> creation. Anyone got any tips here?
>> _______________________________________________
>> Grok-dev mailing list
>> Grok-dev at zope.org
>> https://mail.zope.org/mailman/listinfo/grok-dev
>>
>
> Hi Kevin,
>
> I may not be the best person to answer this as I was wondering the
> same thing recently. I decided to poke around in the debug console to
> see if I could come up with an answer.
>
> I am using the debug prompt (./bin/app-debug) of the grok environment
> for this experiment. I will write all of this with the assumption that
> we have this grok.Indexes subclass:
>
> class ResultIndexes(grok.Indexes):
>    grok.site(App)
>    grok.context(IResult)
>    grok.name('my_catalog')
>    name = index.Field()
>    date = index.Field(attribute='get_date')
>    is_verified = index.Field()
>
> and we want to end up with this:
>
> class ResultIndexes(grok.Indexes):
>    grok.site(App)
>    grok.context(IResult)
>    grok.name('my_catalog')
>    name = index.Field()
>    date = index.Field(attribute='get_date')
>    is_verified = index.Field()
>    did_fall = index.Field()
>
> Start the app debug prompt:
>
> $ ./bin/app-debug
> Welcome to the interactive debug prompt.
> The 'root' variable contains the ZODB root folder.
>
> The 'app' variable contains the Debugger, 'app.publish(path)'
> simulates a request.
>
> # Assuming you have an app called 'app' instantiated already:
>>>> app = root[u'app']
>>>> local_site_manager = app.getSiteManager()
>
> # The name here is the value that was provided in the grok.name()
> # directive on the class. I guess empty if you did not name your
> # catalog.
>>>> from zope.app.catalog.interfaces import ICatalog
>>>> cat = local_site_manager.getUtility(ICatalog, name='my_catalog')
>
> # The catalog is a container with keys of the fields you declared in
> # your grok.Indexes subclass
>>>> print [f for f in c.keys()]
> [u'date', u'is_verified', u'name']
>
> # To add a did_fall index, assuming did_fall is a schema.Bool declared
> # on my IResult interface
>>>> cat[u'did_fall'] = FieldIndex(field_name=u'did_fall')
>
> # Not sure if this is required
>>>> import transaction
>>>> transaction.commit()
>
> # Now update the index to include the new value
>>>> cat.updateIndexes()
>
> Then to test that the catalog had updated, I wrote a unit test (I
> couldn't seem to use hurry.query in that debug prompt).
>
> Adding a view with the following render method allowed me to test the
> updated catalog. The result from this was [u'simon'], as expected. The
> data to be indexed was present in the application before updating the
> index.
>
>    def render(self):
>        from hurry.query.query import Query, Eq
>        return str([r.__name__ for r in Query().searchResults(
>                    Eq(('slalom_result_catalog', 'did_fall'), True))])
>
> Hopefully this is coherent and useful, I wrote it up as I was
> experimenting with this. Maybe somebody can throw in some more useful
> comments (and perhaps how to turn this into a script that can be run
> stand-alone would be useful too).
>
> Regards,
> Simon
> _______________________________________________
> Grok-dev mailing list
> Grok-dev at zope.org
> https://mail.zope.org/mailman/listinfo/grok-dev



More information about the Grok-dev mailing list