|
1 | 1 | from graph_runner import GraphRunner
|
2 |
| -from gremlin_python.process.traversal import T |
3 | 2 | import importlib
|
4 |
| -import uuid |
5 |
| -from jinja2 import Environment, BaseLoader |
| 3 | +import inflection |
| 4 | + |
6 | 5 |
|
7 | 6 | class GraphEntity:
|
8 | 7 | def __init__(self, **kwargs):
|
9 | 8 | self.g = kwargs.get('Traversal')
|
10 | 9 | self.gr = GraphRunner(Traversal=kwargs.get('Traversal'), Entity=self)
|
11 | 10 | self.id = kwargs.get('Id')
|
| 11 | + self.friendly_id = kwargs.get('FriendlyId') |
| 12 | + self.logger = kwargs.get('Logger') |
12 | 13 | self.rule_order = kwargs.get('RuleOrder', {})
|
13 | 14 | self.exec_properties = kwargs.get('ExecProperties')
|
| 15 | + node_properties = kwargs.get('NodeProperties', {}) |
| 16 | + for prop in node_properties: |
| 17 | + self.__dict__[prop] = node_properties[prop][0] |
| 18 | + self.properties = kwargs.get('Properties') + ['friendly_id'] |
14 | 19 |
|
15 | 20 | def full_self(self):
|
16 | 21 | return type(self).__module__ + "." + self.__class__.__qualname__
|
@@ -50,16 +55,39 @@ def update_code(self, **kwargs):
|
50 | 55 | self.g.V(id).properties(property).drop().iterate()
|
51 | 56 | self.g.V(id).property(property, code).next()
|
52 | 57 |
|
| 58 | + def from_node_f(self, friendly_id): |
| 59 | + self.logger.debug('Loading node {}'.format(id)) |
| 60 | + v = self.g.V().has('friendly_id', friendly_id) |
| 61 | + if v.has_next(): |
| 62 | + return self.from_node(v.id) |
| 63 | + |
53 | 64 | def from_node(self, id):
|
| 65 | + self.logger.debug('Loading node {}'.format(id)) |
54 | 66 | if self.gr.property_exists(Id=id, Property='gr_type')[1]:
|
55 | 67 | module_name, class_name = self.get_property('gr_type', id).rsplit(".", 1)
|
| 68 | + self.logger.debug('Found node, type={}.{}'.format(module_name, class_name)) |
56 | 69 | cls = getattr(importlib.import_module(module_name), class_name)
|
57 |
| - return cls(Id=id, Traversal=self.g) |
| 70 | + properties = self.g.V(id).valueMap(False).toList()[0] |
| 71 | + self.logger.debug('Properties={}'.format(properties)) |
| 72 | + return cls(Id=id, |
| 73 | + Traversal=self.g, |
| 74 | + NodeProperties=properties, |
| 75 | + Logger=self.logger) |
58 | 76 |
|
59 |
| - def add_node(self): |
60 |
| - id = str(uuid.uuid4()) |
61 |
| - self.id = id |
62 |
| - return self.g.addV().property(T.id, self.id).property('gr_type', self.full_self()) |
| 77 | + def add_node(self, **kwargs): |
| 78 | + properties = kwargs.get('Properties') |
| 79 | + v = self.g.addV().property('gr_type', self.full_self()) |
| 80 | + self.logger.debug('Creating node') |
| 81 | + self.logger.debug('Expected Properties: {}'.format(self.properties)) |
| 82 | + self.logger.debug('Actual Properties: {}'.format(properties)) |
| 83 | + for prop in self.properties: |
| 84 | + prop_u = inflection.underscore(prop) |
| 85 | + properties_u = {inflection.underscore(k): v for k, v in properties.items()} |
| 86 | + self.logger.debug('Checking {}'.format(prop_u)) |
| 87 | + if prop_u in properties_u: |
| 88 | + self.logger.debug('Adding property {}:{}'.format(prop_u, properties_u[prop_u])) |
| 89 | + v.property(prop_u, properties_u[prop_u]) |
| 90 | + return v |
63 | 91 |
|
64 | 92 | def add_ruled_edge(self, name, to_id, rule):
|
65 | 93 | self.g.V(self.id).addE(name).drop().iterate()
|
@@ -92,7 +120,6 @@ def next_node_by_rules(self):
|
92 | 120 | if result:
|
93 | 121 | return self.g.V(self.id).outE(rule)
|
94 | 122 |
|
95 |
| - |
96 | 123 | def get_property(self, name, id=None):
|
97 | 124 | if id is None:
|
98 | 125 | id = self.id
|
|
0 commit comments