-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
updated to latest version of OSBot-Utils
started adding implementation of MGraph__Time_Point__Create
- Loading branch information
Showing
8 changed files
with
267 additions
and
14 deletions.
There are no files selected for viewing
105 changes: 105 additions & 0 deletions
105
mgraph_db/providers/time_series/actions/MGraph__Time_Point__Create.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
from typing import Type, Dict, Tuple | ||
from mgraph_db.mgraph.actions.MGraph__Edit import MGraph__Edit | ||
from mgraph_db.mgraph.actions.MGraph__Index import MGraph__Index | ||
from mgraph_db.mgraph.domain.Domain__MGraph__Node import Domain__MGraph__Node | ||
from mgraph_db.mgraph.schemas.Schema__MGraph__Edge import Schema__MGraph__Edge | ||
from mgraph_db.providers.time_series.schemas.Schema__MGraph__Time_Point__Create__Data import Schema__MGraph__Time_Point__Create__Data | ||
from mgraph_db.providers.time_series.schemas.Schema__MGraph__Time_Point__Created__Objects import Schema__MGraph__Time_Point__Created__Objects | ||
from osbot_utils.helpers.Obj_Id import Obj_Id | ||
from osbot_utils.type_safe.Type_Safe import Type_Safe | ||
from osbot_utils.utils.Dev import pprint | ||
|
||
|
||
class MGraph__Time_Point__Create(Type_Safe): | ||
mgraph_edit : MGraph__Edit | ||
mgraph_index: MGraph__Index | ||
|
||
def execute(self, create_data: Schema__MGraph__Time_Point__Create__Data) -> Schema__MGraph__Time_Point__Created__Objects: | ||
time_point = self.mgraph_edit.new_node(node_type=create_data.node_type__time_point) | ||
|
||
if create_data.datetime_str: # Set the display value if available | ||
time_point.node_data.value = create_data.datetime_str | ||
|
||
value_nodes = {} # Initialize tracking dictionaries | ||
component_edges = {} | ||
|
||
time_components = [(create_data.year , create_data.edge_type__year ), # Define time components to process | ||
(create_data.month , create_data.edge_type__month ), | ||
(create_data.day , create_data.edge_type__day ), | ||
(create_data.hour , create_data.edge_type__hour ), | ||
(create_data.minute, create_data.edge_type__minute), | ||
(create_data.second, create_data.edge_type__second)] | ||
|
||
for value, edge_type in time_components: # Process each time component | ||
if value is not None: | ||
node_id, edge_id = self.add_value_component(value = value , | ||
node_type = create_data.node_type__value, | ||
edge_type = edge_type , | ||
from_node = time_point ) | ||
value_nodes[edge_type] = node_id | ||
component_edges[edge_type] = edge_id | ||
|
||
tz_id, tz_edge = None, None | ||
if create_data.timezone: # Handle timezone if present | ||
tz_id, tz_edge = self.add_timezone_component(timezone = create_data.timezone , | ||
utc_offset = create_data.utc_offset , | ||
create_data = create_data , | ||
time_point = time_point ) | ||
|
||
pprint(value_nodes) | ||
return Schema__MGraph__Time_Point__Created__Objects(time_point_id = time_point.node_id , | ||
value_nodes = value_nodes , | ||
component_edges = component_edges , | ||
timezone_id = tz_id , | ||
timezone_edge = tz_edge , | ||
utc_offset_id = None , # todo: add support for this | ||
offset_edge = None ) | ||
|
||
def add_timezone_component(self, timezone : str , | ||
utc_offset : int , | ||
create_data : Schema__MGraph__Time_Point__Create__Data , | ||
time_point : Domain__MGraph__Node | ||
) -> Tuple[Obj_Id, Obj_Id]: # Returns (timezone_node_id, timezone_edge_id) | ||
tz_node = self.mgraph_edit.new_node(node_type = create_data.node_type__timezone, # Create timezone node | ||
value = timezone) | ||
|
||
tz_edge = self.mgraph_edit.new_edge(edge_type = create_data.edge_type__tz, # Create edge to timezone | ||
from_node_id = time_point.node_id , | ||
to_node_id = tz_node.node_id) | ||
|
||
if utc_offset is not None: # Add UTC offset if available | ||
offset_node = self.mgraph_edit.new_node(node_type = create_data.node_type__utc_offset, | ||
value = utc_offset) | ||
|
||
self.mgraph_edit.new_edge(edge_type = create_data.edge_type__offset, # Link timezone to offset | ||
from_node_id = tz_node.node_id , | ||
to_node_id = offset_node.node_id) | ||
|
||
return tz_node.node_id, tz_edge.edge_id | ||
|
||
def add_value_component(self, value : int , | ||
node_type : Type[Domain__MGraph__Node] , | ||
edge_type : Type[Schema__MGraph__Edge] , | ||
from_node : Domain__MGraph__Node | ||
) -> Tuple[Obj_Id, Obj_Id]: # Returns (value_node_id, edge_id) | ||
value_node = self.get_or_create_value_node(value, node_type) # Get or create value node | ||
|
||
edge = self.mgraph_edit.new_edge(edge_type = edge_type , # Create edge to value node | ||
from_node_id = from_node.node_id , | ||
to_node_id = value_node.node_id ) | ||
|
||
return value_node.node_id, edge.edge_id | ||
|
||
def get_or_create_value_node(self, value: int, node_type: Type[Domain__MGraph__Node]) -> Domain__MGraph__Node: | ||
matching_nodes = self.mgraph_index.get_nodes_by_field('value', value) # Check if value node exists | ||
type_nodes = self.mgraph_index.get_nodes_by_type(node_type) | ||
result_nodes = matching_nodes & type_nodes # Find intersection | ||
|
||
if result_nodes: # Return existing node if found | ||
return self.mgraph_edit.data().node(next(iter(result_nodes))) | ||
|
||
value_node = self.mgraph_edit.new_node(node_type = node_type, # Create new value node if needed | ||
value = value) | ||
|
||
self.mgraph_index.add_node(value_node.node.data) # Add to index for future reuse | ||
return value_node |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.