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
Esempio n. 2
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
 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))        
Esempio n. 7
0
 def multiunion(self, *args):
     from BTrees.IFBTree import multiunion
     return multiunion(*args)