def _search_for_items(self, query):
     result = None
     if IItemSubscriber.providedBy(query) or valid_signature(query):
         sresult = set()
         if not isinstance(query, tuple):
             query = query.signature()
         for idx in self.indexes:
             sresult = sresult | set(
                 self._search_for_items({idx: query}))
         return sorted(tuple(sresult))
     # search for specific subscription relationship name:
     for (k, v) in query.items():
         if str(k) in self.indexes:
             idx = self.indexes[str(k)]
             if IItemSubscriber.providedBy(v):
                 signature = v.signature()
             elif isinstance(v, tuple) and len(v) == 2:
                 signature = v
             else:
                 raise ValueError('unable to obtain subscriber signature')
             if result is None:
                 result = set(idx.item_uids_for(signature))
             else:
                 result = result & set(idx.item_uids_for(signature))
     if not result:
         return ()
     return tuple(result)
 def search(self, query):
     if isinstance(query, basestring):
         return self._search_for_subscribers(query)  # query: UID
     if IItemSubscriber.providedBy(query) or valid_signature(query):
         return self._search_for_items(query)  # query: sub or sig
     # query for named subscription relationships:
     k, v = query.items()[0]
     if IItemSubscriber.providedBy(v) or isinstance(v, tuple):
         return self._search_for_items(query)  # tuple of uids
     return self._search_for_subscribers(query)