def propagate_rule(self, event, delta_rule): """Propagate event and delta_rule. Compute and enqueue new events generated by EVENT and DELTA_RULE. """ self.log(event.formula.table.table, "Processing event %s with rule %s", event, delta_rule) # compute tuples generated by event (either for insert or delete) # print "event: {}, event.tuple: {}, # event.tuple.rawtuple(): {}".format( # str(event), str(event.tuple), str(event.tuple.raw_tuple())) # binding_list is dictionary # Save binding for delta_rule.trigger; throw away binding for event # since event is ground. binding = self.new_bi_unifier() assert compile.is_literal(delta_rule.trigger) assert compile.is_literal(event.formula) undo = self.bi_unify(delta_rule.trigger, binding, event.formula, self.new_bi_unifier(), self.name) if undo is None: return self.log(event.formula.table.table, "binding list for event and delta-rule trigger: %s", binding) bindings = self.top_down_evaluation(delta_rule.variables(), delta_rule.body, binding) self.log(event.formula.table.table, "new bindings after top-down: %s", ",".join([str(x) for x in bindings])) if delta_rule.trigger.is_negated(): insert_delete = not event.insert else: insert_delete = event.insert self.process_new_bindings(bindings, delta_rule.head, insert_delete, delta_rule.original)
def propagate_rule(self, event, delta_rule): """Propagate event and delta_rule. Compute and enqueue new events generated by EVENT and DELTA_RULE. """ self.log(event.formula.table, "Processing event %s with rule %s", event, delta_rule) # compute tuples generated by event (either for insert or delete) # print "event: {}, event.tuple: {}, # event.tuple.rawtuple(): {}".format( # str(event), str(event.tuple), str(event.tuple.raw_tuple())) # binding_list is dictionary # Save binding for delta_rule.trigger; throw away binding for event # since event is ground. binding = self.new_bi_unifier() assert compile.is_literal(delta_rule.trigger) assert compile.is_literal(event.formula) undo = self.bi_unify(delta_rule.trigger, binding, event.formula, self.new_bi_unifier(), self.name) if undo is None: return self.log(event.formula.table, "binding list for event and delta-rule trigger: %s", binding) bindings = self.top_down_evaluation(delta_rule.variables(), delta_rule.body, binding) self.log(event.formula.table, "new bindings after top-down: %s", ",".join([str(x) for x in bindings])) if delta_rule.trigger.is_negated(): insert_delete = not event.insert else: insert_delete = event.insert self.process_new_bindings(bindings, delta_rule.head, insert_delete, delta_rule.original)
def test_type_checkers(self): """Test the type checkers, e.g. is_atom, is_rule.""" atom = compile.Literal("p", []) atom2 = compile.Literal("q", []) atom3 = compile.Literal("r", []) lit = compile.Literal("r", [], negated=True) regular_rule = compile.Rule(atom, [atom2, atom3]) regular_rule2 = compile.Rule(atom, [lit, atom2]) multi_rule = compile.Rule([atom, atom2], [atom3]) fake_rule = compile.Rule([atom, 1], [atom2]) fake_rule2 = compile.Rule(atom, [atom2, 1]) # is_atom self.assertTrue(compile.is_atom(atom)) self.assertTrue(compile.is_atom(atom2)) self.assertTrue(compile.is_atom(atom3)) self.assertFalse(compile.is_atom(lit)) self.assertFalse(compile.is_atom(regular_rule)) self.assertFalse(compile.is_atom(regular_rule2)) self.assertFalse(compile.is_atom(multi_rule)) self.assertFalse(compile.is_atom(fake_rule)) self.assertFalse(compile.is_atom(fake_rule2)) self.assertFalse(compile.is_atom("a string")) # is_literal self.assertTrue(compile.is_literal(atom)) self.assertTrue(compile.is_literal(atom2)) self.assertTrue(compile.is_literal(atom3)) self.assertTrue(compile.is_literal(lit)) self.assertFalse(compile.is_literal(regular_rule)) self.assertFalse(compile.is_literal(regular_rule2)) self.assertFalse(compile.is_literal(multi_rule)) self.assertFalse(compile.is_literal(fake_rule)) self.assertFalse(compile.is_literal(fake_rule2)) self.assertFalse(compile.is_literal("a string")) # is_regular_rule self.assertFalse(compile.is_regular_rule(atom)) self.assertFalse(compile.is_regular_rule(atom2)) self.assertFalse(compile.is_regular_rule(atom3)) self.assertFalse(compile.is_regular_rule(lit)) self.assertTrue(compile.is_regular_rule(regular_rule)) self.assertTrue(compile.is_regular_rule(regular_rule2)) self.assertFalse(compile.is_regular_rule(multi_rule)) self.assertFalse(compile.is_regular_rule(fake_rule)) self.assertFalse(compile.is_regular_rule(fake_rule2)) self.assertFalse(compile.is_regular_rule("a string")) # is_multi_rule self.assertFalse(compile.is_multi_rule(atom)) self.assertFalse(compile.is_multi_rule(atom2)) self.assertFalse(compile.is_multi_rule(atom3)) self.assertFalse(compile.is_multi_rule(lit)) self.assertFalse(compile.is_multi_rule(regular_rule)) self.assertFalse(compile.is_multi_rule(regular_rule2)) self.assertTrue(compile.is_multi_rule(multi_rule)) self.assertFalse(compile.is_multi_rule(fake_rule)) self.assertFalse(compile.is_multi_rule(fake_rule2)) self.assertFalse(compile.is_multi_rule("a string")) # is_rule self.assertFalse(compile.is_rule(atom)) self.assertFalse(compile.is_rule(atom2)) self.assertFalse(compile.is_rule(atom3)) self.assertFalse(compile.is_rule(lit)) self.assertTrue(compile.is_rule(regular_rule)) self.assertTrue(compile.is_rule(regular_rule2)) self.assertTrue(compile.is_rule(multi_rule)) self.assertFalse(compile.is_rule(fake_rule)) self.assertFalse(compile.is_rule(fake_rule2)) self.assertFalse(compile.is_rule("a string")) # is_datalog self.assertTrue(compile.is_datalog(atom)) self.assertTrue(compile.is_datalog(atom2)) self.assertTrue(compile.is_datalog(atom3)) self.assertFalse(compile.is_datalog(lit)) self.assertTrue(compile.is_datalog(regular_rule)) self.assertTrue(compile.is_datalog(regular_rule2)) self.assertFalse(compile.is_datalog(multi_rule)) self.assertFalse(compile.is_datalog(fake_rule)) self.assertFalse(compile.is_datalog(fake_rule2)) self.assertFalse(compile.is_datalog("a string")) # is_extended_datalog self.assertTrue(compile.is_extended_datalog(atom)) self.assertTrue(compile.is_extended_datalog(atom2)) self.assertTrue(compile.is_extended_datalog(atom3)) self.assertFalse(compile.is_extended_datalog(lit)) self.assertTrue(compile.is_extended_datalog(regular_rule)) self.assertTrue(compile.is_extended_datalog(regular_rule2)) self.assertTrue(compile.is_extended_datalog(multi_rule)) self.assertFalse(compile.is_extended_datalog(fake_rule)) self.assertFalse(compile.is_extended_datalog(fake_rule2)) self.assertFalse(compile.is_extended_datalog("a string"))