示例#1
0
    def visit_RelClear(self, node):
        code = (node, )

        auxmaps = self.auxmaps_by_rel.get(node.rel, set())
        for auxmap in auxmaps:
            clear_code = (L.MapClear(auxmap.map), )
            code = L.insert_rel_maint(code, clear_code, L.SetRemove())

        wraps = self.wraps_by_rel.get(node.rel, set())
        for wrap in wraps:
            clear_code = (L.RelClear(wrap.rel), )
            code = L.insert_rel_maint(code, clear_code, L.SetRemove())

        return code
示例#2
0
    def visit_RelClear(self, node):
        if node.rel not in self.rels:
            return node

        code = (node, )
        clear_code = (L.RelClear(self.result_var), )
        code = L.insert_rel_maint(code, clear_code, L.SetRemove())
        return code
示例#3
0
    def visit_MapClear(self, node):
        sfm = self.setfrommaps_by_map.get(node.map, None)
        if sfm is None:
            return node

        code = (node, )
        clear_code = (L.RelClear(sfm.rel), )
        code = L.insert_rel_maint(code, clear_code, L.SetRemove())
        return code
示例#4
0
 def visit_AttrDelete(self, node):
     if node.attr not in self.objrels.Fs:
         return
     
     lookup = L.Attribute(node.obj, node.attr)
     pair = L.Tuple([node.obj, lookup])
     var = next(self.fresh_vars)
     return (L.Assign(var, pair),
             L.RelUpdate(N.F(node.attr), L.SetRemove(), var))
示例#5
0
 def visit_DictDelete(self, node):
     if not self.objrels.MAP:
         return
     
     lookup = L.DictLookup(node.target, node.key, None)
     triple = L.Tuple([node.target, node.key, lookup])
     var = next(self.fresh_vars)
     return (L.Assign(var, triple),
             L.RelUpdate(N.MAP, L.SetRemove(), var))
示例#6
0
    def visit_MapDelete(self, node):
        sfm = self.setfrommaps_by_map.get(node.map, None)
        if sfm is None:
            return node

        code = (node, )
        func_name = sfm.get_maint_func_name('delete')
        call_code = (L.Expr(L.Call(func_name, [L.Name(node.key)])), )
        code = L.insert_rel_maint(code, call_code, L.SetRemove())
        return code
示例#7
0
    def visit_Module(self, node):
        node = self.generic_visit(node)

        funcs = []
        for auxmaps in self.auxmaps_by_rel.values():
            for auxmap in auxmaps:
                for op in [L.SetAdd(), L.SetRemove()]:
                    func = make_auxmap_maint_func(self.fresh_vars, auxmap, op)
                    funcs.append(func)
        for sfm in self.setfrommaps_by_map.values():
            for op in ['assign', 'delete']:
                func = make_setfrommap_maint_func(self.fresh_vars, sfm, op)
                funcs.append(func)
        for wraps in self.wraps_by_rel.values():
            for wrap in wraps:
                for op in [L.SetAdd(), L.SetRemove()]:
                    func = make_wrap_maint_func(self.fresh_vars, wrap, op)
                    funcs.append(func)

        func_names = L.get_defined_functions(tuple(funcs))
        self.maint_funcs.update(func_names)

        node = node._replace(body=tuple(funcs) + node.body)
        return node
示例#8
0
    def visit_RelClear(self, node):
        # We should clear if we are not using demand and our operand is
        # being cleared, or if we are using demand and our demand set is
        # being cleared.
        aggrinv = self.aggrinv
        uses_demand = aggrinv.uses_demand
        if uses_demand:
            should_clear = node.rel == aggrinv.restr
        else:
            should_clear = node.rel == aggrinv.rel
        if not should_clear:
            return node

        clear_code = (L.MapClear(self.aggrinv.map), )
        code = L.insert_rel_maint((node, ), clear_code, L.SetRemove())
        return code
示例#9
0
    def visit_Module(self, node):
        node = self.generic_visit(node)

        fv = self.fresh_vars
        ops = [L.SetAdd(), L.SetRemove()]
        funcs = []
        for op in ops:
            func = make_aggr_oper_maint_func(fv, self.aggrinv, op)
            funcs.append(func)
        if self.aggrinv.uses_demand:
            for op in ops:
                func = make_aggr_restr_maint_func(fv, self.aggrinv, op)
                funcs.append(func)

        func_names = L.get_defined_functions(tuple(funcs))
        self.maint_funcs.update(func_names)

        node = node._replace(body=tuple(funcs) + node.body)
        return node
示例#10
0
    def visit_Module(self, node):
        ct = self.clausetools

        node = self.generic_visit(node)

        funcs = []
        for rel in self.rels:
            for op in [L.SetAdd(), L.SetRemove()]:
                fresh_var_prefix = next(self.fresh_vars)
                func = make_comp_maint_func(ct,
                                            fresh_var_prefix,
                                            self.fresh_join_names,
                                            self.comp,
                                            self.result_var,
                                            rel,
                                            op,
                                            counted=self.counted)
                funcs.append(func)

        func_names = L.get_defined_functions(tuple(funcs))
        self.maint_funcs.update(func_names)

        node = node._replace(body=tuple(funcs) + node.body)
        return node