[Dev] New iterItems() convenience API

Phillip J. Eby pje at telecommunity.com
Sat Jun 25 08:36:39 PDT 2005


At 08:01 AM 6/25/2005 -0700, Andi Vajda wrote:

>>I've added getKind() and iterItems() classmethods to schema.Item, so that 
>>you can more easily get at kinds or do KindQueries.  For example, you can 
>>replace code like this:
>>
>>       kind = "//parcels/osaf/contentmodel/mail/IMAPAccount"
>>       for item in ItemQuery.KindQuery().run([view.findPath(kind)]):
>>           if item.isActive and item.host and item.username:
>>               yield item
>>
>>with this:
>>
>>       for item in Mail.IMAPAccount.iterItems(view):
>>           if item.isActive and item.host and item.username:
>>               yield item
>
>That's a great idea. I'll add the same to the Kind class. There already is 
>an iterAttributes() method there. An iterItems() makes sense.
>It should work as follows:
>
>         for item in mailItem.itsKind.iterItems():
>             .....

Of course, if mailItem is an instance of a schema.Item (and currently only 
the repository core schema isn't), the existing iterItems() classmethod 
allows you to do this:

          for item in mailItem.iterItems():

So, the Kind method would only be useful in situations when you already 
have a kind object -- and I'll be trying to eliminate those situations as 
much as possible.  :)


>Ultimately though, the hope is that there is going to be a lot less use of 
>KindQuery once the new ItemCollection/Query/AbstractSet stuff becomes 
>mainstream.
>Basically, a KindQuery should be a query of last resort. Using sets, which 
>ultimately wrap one or more ref collections is a lot more efficient.

I'm not sure I follow you here; there will still be situations where the 
desired behavior is to obtain all items of a particular kind, and the ideal 
API is simply to ask a class to iterate its items.  For example, all items 
of the Web.Server kind need to be found in order to set up listening ports.

Of course, if efficiency requires a different implementation for 
iterItems() then that is easily achieved since there is now only one place 
needed to change it.  (Not entirely true, actually, as there are still 
KindQuery uses floating around that I haven't converted yet for one reason 
and another.)



More information about the Dev mailing list