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 |