entities/adapters.py
changeset 5768 1e73a466aa69
parent 5722 61d6a4caa963
child 5877 0c7b7b76a84f
equal deleted inserted replaced
5766:c397819f2482 5768:1e73a466aa69
   106                         yield container
   106                         yield container
   107                         yielded = True
   107                         yielded = True
   108         else:
   108         else:
   109             yield entity
   109             yield entity
   110 
   110 
       
   111     # weight in ABCD
       
   112     entity_weight = 1.0
       
   113     attr_weight = {}
       
   114 
   111     def get_words(self):
   115     def get_words(self):
   112         """used by the full text indexer to get words to index
   116         """used by the full text indexer to get words to index
   113 
   117 
   114         this method should only be used on the repository side since it depends
   118         this method should only be used on the repository side since it depends
   115         on the logilab.database package
   119         on the logilab.database package
   119         """
   123         """
   120         from logilab.database.fti import tokenize
   124         from logilab.database.fti import tokenize
   121         # take care to cases where we're modyfying the schema
   125         # take care to cases where we're modyfying the schema
   122         entity = self.entity
   126         entity = self.entity
   123         pending = self._cw.transaction_data.setdefault('pendingrdefs', set())
   127         pending = self._cw.transaction_data.setdefault('pendingrdefs', set())
   124         words = []
   128         words = {}
   125         for rschema in entity.e_schema.indexable_attributes():
   129         for rschema in entity.e_schema.indexable_attributes():
   126             if (entity.e_schema, rschema) in pending:
   130             if (entity.e_schema, rschema) in pending:
   127                 continue
   131                 continue
       
   132             weight = self.attr_weight.get(rschema, 'C')
   128             try:
   133             try:
   129                 value = entity.printable_value(rschema, format='text/plain')
   134                 value = entity.printable_value(rschema, format='text/plain')
   130             except TransformError:
   135             except TransformError:
   131                 continue
   136                 continue
   132             except:
   137             except:
   133                 self.exception("can't add value of %s to text index for entity %s",
   138                 self.exception("can't add value of %s to text index for entity %s",
   134                                rschema, entity.eid)
   139                                rschema, entity.eid)
   135                 continue
   140                 continue
   136             if value:
   141             if value:
   137                 words += tokenize(value)
   142                 words.setdefault(weight, []).extend(tokenize(value))
   138         for rschema, role in entity.e_schema.fulltext_relations():
   143         for rschema, role in entity.e_schema.fulltext_relations():
   139             if role == 'subject':
   144             if role == 'subject':
   140                 for entity_ in getattr(entity, rschema.type):
   145                 for entity_ in getattr(entity, rschema.type):
   141                     words += entity_.cw_adapt_to('IFTIndexable').get_words()
   146                     merge_weight_dict(words, entity_.cw_adapt_to('IFTIndexable').get_words())
   142             else: # if role == 'object':
   147             else: # if role == 'object':
   143                 for entity_ in getattr(entity, 'reverse_%s' % rschema.type):
   148                 for entity_ in getattr(entity, 'reverse_%s' % rschema.type):
   144                     words += entity_.cw_adapt_to('IFTIndexable').get_words()
   149                     merge_weight_dict(words, entity_.cw_adapt_to('IFTIndexable').get_words())
   145         return words
   150         return words
   146 
   151 
       
   152 def merge_weight_dict(maindict, newdict):
       
   153     for weight, words in newdict.iteritems():
       
   154         maindict.setdefault(weight, []).extend(words)
   147 
   155 
   148 class IDownloadableAdapter(EntityAdapter):
   156 class IDownloadableAdapter(EntityAdapter):
   149     """interface for downloadable entities"""
   157     """interface for downloadable entities"""
   150     __regid__ = 'IDownloadable'
   158     __regid__ = 'IDownloadable'
   151     __select__ = implements(IDownloadable) # XXX for bw compat, else should be abstract
   159     __select__ = implements(IDownloadable) # XXX for bw compat, else should be abstract