diff --git a/jaseci_core/jaseci/prim/edge.py b/jaseci_core/jaseci/prim/edge.py index 7ade46e642..0679affa5d 100644 --- a/jaseci_core/jaseci/prim/edge.py +++ b/jaseci_core/jaseci/prim/edge.py @@ -14,10 +14,11 @@ class Edge(Element, Anchored): """Edge class for Jaseci""" - def __init__(self, **kwargs): + def __init__(self, fast_edge: bool = False, **kwargs): self.from_node_id = None self.to_node_id = None self.bidirected: bool = False + self.fast_edge = fast_edge Anchored.__init__(self) Element.__init__(self, **kwargs) @@ -103,6 +104,8 @@ def save(self): """ Write self through hook to persistent storage """ + if self.fast_edge: + self.from_node().save() if self.is_fast(): self._persist = False super().save() diff --git a/jaseci_core/jaseci/prim/node.py b/jaseci_core/jaseci/prim/node.py index a93d91f68a..167de847c7 100644 --- a/jaseci_core/jaseci/prim/node.py +++ b/jaseci_core/jaseci/prim/node.py @@ -53,14 +53,22 @@ def smart_build_fast_edge_ids(self): for v in self.fast_edges[k]: link_order = [v[0], self.jid] if v[1] == FROM else [self.jid, v[0]] edge = Edge( - m_id=self._m_id, h=self._h, kind="edge", name=k, auto_save=False + fast_edge=True, + m_id=self._m_id, + h=self._h, + kind="edge", + name=k, + auto_save=False, ) edge.from_node_id = link_order[0] edge.to_node_id = link_order[1] edge.bidirected = v[1] == BI edge.jid = v[2] if len(v) > 2 else uuid.uuid4().urn edge.context = v[3] if len(v) > 3 else {} - edge.save() + # old `edge.save()` might be confusing + # this line doesn't mean it has to be saved on db + # it only needs to be available on cache (memory, redis) + self._h.commit_obj_to_cache(edge, True) self._fast_edge_ids.add_obj(edge, bypass=True) def smart_add_edge(self, obj): diff --git a/jaseci_core/jaseci/tests/jac_test_code.py b/jaseci_core/jaseci/tests/jac_test_code.py index be5fc956cb..7704159ac2 100644 --- a/jaseci_core/jaseci/tests/jac_test_code.py +++ b/jaseci_core/jaseci/tests/jac_test_code.py @@ -1189,54 +1189,53 @@ simple_graph = """ -node a { - has val = 0; -} - -node b { - has val = 0; -} - -node c { - has val = 0; -} - -node d { - has val = 0; -} - -node e { - has val = 0; -} +node a1 {has val = 0;} +node a2 {has val = 0;} +node a3 {has val = 0;} +node b1 {has val = 0;} +node b2 {has val = 0;} +edge e1 {has val = 0;} +edge e2 {has val = 0;} +edge e3 {has val = 0;} walker sample { root { - take --> node::a else: take spawn here ++> node::a; - take --> node::b else: take spawn here ++> node::b; + take --> node::a1 else: take spawn here +[e1]+> node::a1; + take --> node::b1 else: take spawn here ++> node::b1; } - a { - take --> node::c else: take spawn here ++> node::c; - } - - b { - take --> node::d else: take spawn here ++> node::d; - } - - c { - take --> node::e else: take spawn here ++> node::e; + a1: take --> node::a2 else { + report --> node::a2; + report -[e2]-> node::a2; + take spawn here +[e2]+> node::a2; } + a2: take --> node::a3 else: take spawn here +[e3]+> node::a3; + b1: take --> node::b2 else: take spawn here ++> node::b2; } walker sample2 { root { - take --> node::a; - take --> node::b; - } - a: take --> node::c; - b: take --> node::d; - c: take --> node::e; - d: here.val = 1; - e: here.val = 2; + take --> node::a1; + take --> node::b1; + } + a1: take --> node::a2; + a2: take --> node::a3; + a3: here.val = 1; + b1: take --> node::b2; + b2: here.val = 1; +} + +walker sample3 { + root { + take --> node::a1; + take --> node::b1; + } + a1: take --> node::a2; + b1: take --> node::b2; + a2 { + take --> node::a3; + -[e3]->.edge[0].val = 1; + } + a3: here.val = 2; } """ diff --git a/jaseci_serv/jaseci_serv/base/tests/test_orm_hooks.py b/jaseci_serv/jaseci_serv/base/tests/test_orm_hooks.py index 5b7c5503cc..b334a0e737 100644 --- a/jaseci_serv/jaseci_serv/base/tests/test_orm_hooks.py +++ b/jaseci_serv/jaseci_serv/base/tests/test_orm_hooks.py @@ -329,22 +329,26 @@ def test_node_saves_on_traversing_graphs(self): self.assertSetEqual( set( [ - "e::node", - "a::node", - "b::architype", - "root::architype", - "d::architype", - "b::node", "basic::sentinel", - "d::node", - "c::node", - "generic::architype", - "a::architype", - "c::architype", "root::graph", - "e::architype", + "a1::node", + "a2::node", + "a3::node", + "b1::node", + "b2::node", + "root::architype", + "a1::architype", + "a2::architype", + "a3::architype", + "b1::architype", + "b2::architype", + "e1::architype", + "e2::architype", + "e3::architype", + "generic::architype", "sample::architype", "sample2::architype", + "sample3::architype", "generic::architype", ] ), @@ -365,6 +369,18 @@ def test_node_saves_on_traversing_graphs(self): test_walker.run() self.assertSetEqual( - set(["d::node", "e::node"]), + set(["b2::node", "a3::node"]), + set([item.name + "::" + item.j_type for item in hook.save_obj_list]), + ) + + hook.commit() + hook.clear_cache() + + test_walker = sent.run_architype("sample3") + test_walker.prime(gph) + test_walker.run() + + self.assertSetEqual( + set(["a2::node", "a3::node"]), set([item.name + "::" + item.j_type for item in hook.save_obj_list]), )