Beispiel #1
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
Beispiel #2
0
 def visit_RelUpdate(self, node):
     if isinstance(node.op, L.SetAdd):
         is_add = True
     elif isinstance(node.op, L.SetRemove):
         is_add = False
     else:
         return
     rel = node.rel
     elem = L.Name(node.elem)
     
     if N.is_M(rel):
         set_ = L.Subscript(elem, L.Num(0))
         value = L.Subscript(elem, L.Num(1))
         code = (L.SetUpdate(set_, node.op, value),)
     
     elif N.is_F(rel):
         attr = N.get_F(rel)
         obj = L.Subscript(elem, L.Num(0))
         value = L.Subscript(elem, L.Num(1))
         if is_add:
             code = (L.AttrAssign(obj, attr, value),)
         else:
             code = (L.AttrDelete(obj, attr),)
     
     elif N.is_MAP(rel):
         map = L.Subscript(elem, L.Num(0))
         key = L.Subscript(elem, L.Num(1))
         value = L.Subscript(elem, L.Num(2))
         if is_add:
             code = (L.DictAssign(map, key, value),)
         else:
             code = (L.DictDelete(map, key),)
     
     else:
         code = node
     
     return code
Beispiel #3
0
 def make_projection_expr(self, state):
     return L.Subscript(state, L.Num(0))
Beispiel #4
0
 def make_update_state_code(self, prefix, state, op, value):
     opcls = {L.SetAdd: L.Add, L.SetRemove: L.Sub}[op.__class__]
     by = {'count': L.Num(1), 'sum': L.Name(value)}[self.kind]
     return (L.Assign(state, L.BinOp(L.Name(state), opcls(), by)), )