def apply(self, query): """see IIndexSearch.apply expected query is a 2-tuple with datetime.datetime Use case as following: search: q_start|--------------------|q_end cases: 1) i_start|---------------------------|i_end 2) i_start|---------------|i_end 3) i_start|-----------------|i_end 4) i_start|-----|i_end """ if len(query) != 2 or not isinstance(query, tuple): raise TypeError("two-length tuple expected", query) q_start, q_end = query ################################### # do 1) objects with "both outside" # # objects starting before q_start query1_1 = (None, q_start) res1_1 = self._i_start.apply(query1_1) # objects ending after q_end query1_2 = (q_end, None) res1_2 = self._i_end.apply(query1_2) res1 = intersection(res1_1, res1_2) ##################################### # do 2) objects with "start inside" # query2 = (q_start, q_end) res2 = self._i_start.apply(query2) ################################### # do 3) objects with "end inside" query3 = (q_start, q_end) res3 = self._i_end.apply(query3) ################################### # do 4) object where both are inside # -> already found with 2) and 3) :-) ################################### # union the three results result = multiunion([res1, res2, res3]) return result
def __call__(self, result): sets = [] for (docid, acls), set in result: if not set: continue if self.check_acls(acls): sets.append(set) if not sets: return IFSet() return multiunion(sets)
def __call__(self, result): sets = [] for (docid, acls), set in result: if not set: continue if self.check_acls(acls): sets.append(set) if not sets: return IFSet() return multiunion(sets)
def apply(self, cache, context=None): results = [] for term in self.terms: result = term.cached_apply(cache, context) # empty results if not result: continue results.append(result) if len(results) == 0: return IFSet() if len(results) == 1: return results[0] return multiunion(results)
def apply(self, cache, context=None): results = [] index = self.getIndex(context) for value in self.values: r = index.apply((value, value)) # empty results if not r: continue results.append(r) if len(results) == 0: return IFSet() if len(results) == 1: return results[0] return multiunion(results)
def apply(self, query): if len(query) != 2 or not isinstance(query, tuple): raise TypeError("two-length tuple expected", query) return multiunion(self._fwd_index.values(*query))
def multiunion(self, *args): from BTrees.IFBTree import multiunion return multiunion(*args)