def _eval(self, context): subqueries = self._subqueries if len(subqueries) == 1: return subqueries[0]._eval(context) search = IOr(*[sq._eval(context) for sq in subqueries]) search.complete() return search
def setOperation(op, sets, isearch): '''perform *op* on *sets*. if *isearch*, return an incremental search. *op* may be '"and"' or '"or"'. Uses 'IncrementalSearch', if available. ''' if not sets: if op == 'and': return # None means all results if isearch: search = IOr(); search.complete(); return search return IISet() # Note: "multiunion" is *much* faster than "IOr"! #if IAnd is not None and (isearch or len(sets) > 1): if IAnd is not None and (isearch or (op == 'and' and len(sets) > 1)): isets = [] for set in sets: if set is None: # all results if op == 'and': continue else: return if not isinstance(set, ISearch): set = IBTree(set) isets.append(set) if op == 'and' and not isets: return # empty 'and' cl = op == 'and' and IAnd or IOr if len(isets) == 1: # do not wrap a one element search search = isets[0] else: search = cl(*isets); search.complete() if isearch: return search if hasattr(search, 'asSet'): r = search.asSet() else: r = IISet(); r.__setstate__((tuple(search),)) return r if op == 'or' and len(sets) > 5: r = multiunion(sets) else: combine = op == 'and' and intersection or union r= None for set in sets: r= combine(r,set) if r is None: if combine is union: r = IISet() else: return if isearch: r = IBTree(r) return r