def make_demand_func(query):
    func = N.get_query_demand_func_name(query.name)
    uset = N.get_query_demand_set_name(query.name)
    
    maxsize = query.demand_set_maxsize
    
    if maxsize is None:
        code = L.Parser.ps('''
            def _FUNC(_elem):
                if _elem not in _U:
                    _U.reladd(_elem)
            ''', subst={'_FUNC': func, '_U': uset})
    elif maxsize == 1:
        code = L.Parser.ps('''
            def _FUNC(_elem):
                if _elem not in _U:
                    _U.relclear()
                    _U.reladd(_elem)
            ''', subst={'_FUNC': func, '_U': uset})
    elif not isinstance(maxsize, int) or maxsize <= 0:
        raise L.ProgramError('Invalid value for demand_set_maxsize')
    else:
        code = L.Parser.ps('''
            def _FUNC(_elem):
                if _elem not in _U:
                    while len(_U) >= _MAXSIZE:
                        _stale = _U.peek()
                        _U.relremove(_stale)
                    _U.reladd(_elem)
            ''', subst={'_FUNC': func, '_U': uset,
                        '_MAXSIZE': L.Num(maxsize)})
    
    return code
Exemple #2
0
    def add_demand_function_call(self, query_sym, query_node, ann):
        """Return a Query node wrapped with a call to a demand function,
        if needed.
        """
        # Skip if there's no demand set associated with this query.
        if query_sym.name not in self.queries_with_usets:
            return query_node
        # Skip if we have a nodemand annotation.
        if ann is not None and ann.get('nodemand', False):
            return query_node

        demand_call = L.Call(N.get_query_demand_func_name(query_sym.name),
                             [L.tuplify(query_sym.demand_params)])
        return L.FirstThen(demand_call, query_node)
 def add_demand_function_call(self, query_sym, query_node, ann):
     """Return a Query node wrapped with a call to a demand function,
     if needed.
     """
     # Skip if there's no demand set associated with this query.
     if query_sym.name not in self.queries_with_usets:
         return query_node
     # Skip if we have a nodemand annotation.
     if ann is not None and ann.get('nodemand', False):
         return query_node
     
     demand_call = L.Call(N.get_query_demand_func_name(query_sym.name),
                          [L.tuplify(query_sym.demand_params)])
     return L.FirstThen(demand_call, query_node)
Exemple #4
0
def make_demand_func(query):
    func = N.get_query_demand_func_name(query.name)
    uset = N.get_query_demand_set_name(query.name)

    maxsize = query.demand_set_maxsize

    if maxsize is None:
        code = L.Parser.ps('''
            def _FUNC(_elem):
                if _elem not in _U:
                    _U.reladd(_elem)
            ''',
                           subst={
                               '_FUNC': func,
                               '_U': uset
                           })
    elif maxsize == 1:
        code = L.Parser.ps('''
            def _FUNC(_elem):
                if _elem not in _U:
                    _U.relclear()
                    _U.reladd(_elem)
            ''',
                           subst={
                               '_FUNC': func,
                               '_U': uset
                           })
    elif not isinstance(maxsize, int) or maxsize <= 0:
        raise L.ProgramError('Invalid value for demand_set_maxsize')
    else:
        code = L.Parser.ps('''
            def _FUNC(_elem):
                if _elem not in _U:
                    while len(_U) >= _MAXSIZE:
                        _stale = _U.peek()
                        _U.relremove(_stale)
                    _U.reladd(_elem)
            ''',
                           subst={
                               '_FUNC': func,
                               '_U': uset,
                               '_MAXSIZE': L.Num(maxsize)
                           })

    return code