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
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
def make_projection_expr(self, state): return L.Subscript(state, L.Num(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)), )