|
@@ -12,3 +12,40 @@ def reverseKeyLookup(a, b, **remainder):
|
|
|
|
|
|
result = yield [("CNV", ["(unknown: %s)" % b])]
|
|
result = yield [("CNV", ["(unknown: %s)" % b])]
|
|
raise PrimitiveFinished(result)
|
|
raise PrimitiveFinished(result)
|
|
|
|
+
|
|
|
|
+def read_attribute(a, b, c, **remainder):
|
|
|
|
+ #TODO this can be optimized even further...
|
|
|
|
+ model_dict, b_val, type_mapping = \
|
|
|
|
+ yield [("RD", [a, "model"]),
|
|
|
|
+ ("RV", [b]),
|
|
|
|
+ ("RD", [a, "type_mapping"]),
|
|
|
|
+ ]
|
|
|
|
+ model_instance, edges = \
|
|
|
|
+ yield [("RD", [model_dict, b]),
|
|
|
|
+ ("RO", [a]),
|
|
|
|
+ ]
|
|
|
|
+ edge_types = yield [("RDN", [type_mapping, i]) for i in edges]
|
|
|
|
+ type_edge_val = yield [("RE", [i]) for i in edge_types]
|
|
|
|
+
|
|
|
|
+ src_nodes = set([i[0] for i in type_edge_val])
|
|
|
|
+
|
|
|
|
+ found_edges = yield [("RDE", [i, b_val]) for i in src_nodes]
|
|
|
|
+
|
|
|
|
+ if len(src_nodes) == 1:
|
|
|
|
+ found_edges = [found_edges]
|
|
|
|
+
|
|
|
|
+ for e1 in found_edges:
|
|
|
|
+ if e1 is not None:
|
|
|
|
+ # Found an edge!
|
|
|
|
+ for i, e2 in enumerate(edge_types):
|
|
|
|
+ if e1 == e2:
|
|
|
|
+ # The instance of this edge is the one we want!
|
|
|
|
+ edge = edges[i]
|
|
|
|
+ edge_val = yield [("RE", [edge])]
|
|
|
|
+ result = edge_val[1]
|
|
|
|
+ raise PrimitiveFinished(result)
|
|
|
|
+ else:
|
|
|
|
+ result = yield [("RR", [])]
|
|
|
|
+ raise PrimitiveFinished(result)
|
|
|
|
+
|
|
|
|
+ raise Exception("Error in reading edge!")
|