1+ from attr import frozen
2+
13from fixcore .db .model import QueryModel
24from fixcore .message_bus import MessageBus , Action
35import logging
2123log = logging .getLogger (__name__ )
2224
2325subscriber_id = SubscriberId ("fixcore" )
24- merge_outer_edges = "merge_outer_edges"
26+ merge_deferred_edges = "merge_deferred_edges"
27+
2528
29+ @frozen
30+ class DeferredMergeResult :
31+ processed : int
32+ updated : int
33+ deleted : int
2634
27- class MergeOuterEdgesHandler (Service ):
35+
36+ class MergeDeferredEdgesHandler (Service ):
2837 def __init__ (
2938 self ,
3039 message_bus : MessageBus ,
@@ -35,18 +44,21 @@ def __init__(
3544 ):
3645 super ().__init__ ()
3746 self .message_bus = message_bus
38- self .merge_outer_edges_listener : Optional [Task [None ]] = None
47+ self .merge_deferred_edges_listener : Optional [Task [None ]] = None
3948 self .subscription_handler = subscription_handler
4049 self .subscriber : Optional [Subscriber ] = None
4150 self .task_handler_service = task_handler_service
4251 self .db_access = db_access
4352 self .model_handler = model_handler
4453
45- async def merge_outer_edges (self , task_id : TaskId ) -> Tuple [ int , int ] :
54+ async def merge_deferred_edges (self , task_ids : List [ TaskId ] ) -> DeferredMergeResult :
4655 deferred_outer_edge_db = self .db_access .deferred_outer_edge_db
47- pending_edges = await deferred_outer_edge_db .all_for_task (task_id )
56+ pending_edges = []
57+ for task_id in task_ids :
58+ pending_edges .extend (await deferred_outer_edge_db .all_for_task (task_id ))
4859 if pending_edges :
49- first = pending_edges [0 ]
60+ processed = 0
61+ first = min (pending_edges , key = lambda x : x .created_at )
5062 graph_db = self .db_access .get_graph_db (first .graph )
5163 model = await self .model_handler .load_model (first .graph )
5264
@@ -76,49 +88,43 @@ async def find_node_id(selector: NodeSelector) -> Optional[NodeId]:
7688 for edge in pending_edge .edges :
7789 from_id = await find_node_id (edge .from_node )
7890 to_id = await find_node_id (edge .to_node )
91+ processed += 1
7992 if from_id and to_id :
8093 edges .append ((from_id , to_id , edge .edge_type ))
8194
95+ # apply edges in graph
8296 updated , deleted = await graph_db .update_deferred_edges (edges , first .created_at )
83-
84- log .info (
85- f"MergeOuterEdgesHandler: updated { updated } /{ len (edges )} ,"
86- f" deleted { deleted } edges in task id { task_id } "
87- )
88-
89- return updated , deleted
97+ # delete processed edge definitions
98+ for task_id in task_ids :
99+ await deferred_outer_edge_db .delete_for_task (task_id )
100+ log .info (f"DeferredEdges: { len (edges )} edges: { updated } updated, { deleted } deleted. ({ task_ids } )" )
101+ return DeferredMergeResult (processed , updated , deleted )
90102 else :
91- log .info (f"MergeOuterEdgesHandler: no pending edges for task id { task_id } found." )
92-
93- return 0 , 0
94-
95- async def mark_done (self , task_id : TaskId ) -> None :
96- deferred_outer_edge_db = self .db_access .deferred_outer_edge_db
97- await deferred_outer_edge_db .delete_for_task (task_id )
103+ log .info (f"MergeOuterEdgesHandler: no pending edges found. ({ task_ids } )" )
104+ return DeferredMergeResult (0 , 0 , 0 )
98105
99106 async def __handle_events (self , subscription_done : Future [None ]) -> None :
100- async with self .message_bus .subscribe (subscriber_id , [merge_outer_edges ]) as events :
107+ async with self .message_bus .subscribe (subscriber_id , [merge_deferred_edges ]) as events :
101108 subscription_done .set_result (None )
102109 while True :
103110 event = await events .get ()
104- if isinstance (event , Action ) and event .message_type == merge_outer_edges :
105- await self .merge_outer_edges (event .task_id )
106- await self .mark_done (event .task_id )
111+ if isinstance (event , Action ) and event .message_type == merge_deferred_edges :
112+ await self .merge_deferred_edges ([event .task_id ])
107113 await self .task_handler_service .handle_action_done (event .done (subscriber_id ))
108114
109115 async def start (self ) -> None :
110116 subscription_done = asyncio .get_event_loop ().create_future ()
111117 self .subscriber = await self .subscription_handler .add_subscription (
112- subscriber_id , merge_outer_edges , True , timedelta (seconds = 30 )
118+ subscriber_id , merge_deferred_edges , True , timedelta (seconds = 30 )
113119 )
114- self .merge_outer_edges_listener = asyncio .create_task (
120+ self .merge_deferred_edges_listener = asyncio .create_task (
115121 self .__handle_events (subscription_done ), name = subscriber_id
116122 )
117123 await subscription_done
118124
119125 async def stop (self ) -> None :
120- if self .merge_outer_edges_listener :
126+ if self .merge_deferred_edges_listener :
121127 with suppress (Exception ):
122- self .merge_outer_edges_listener .cancel ()
128+ self .merge_deferred_edges_listener .cancel ()
123129 if self .subscriber :
124- await self .subscription_handler .remove_subscription (subscriber_id , merge_outer_edges )
130+ await self .subscription_handler .remove_subscription (subscriber_id , merge_deferred_edges )
0 commit comments