12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- from modelverse_kernel.primitives import PrimitiveFinished
- def reverseKeyLookup(a, b, **remainder):
- edges = yield [("RO", [a])]
- expanded_edges = yield [("RE", [i]) for i in edges]
- for i, edge in enumerate(expanded_edges):
- if b == edge[1]:
- # Found our edge: edges[i]
- outgoing = yield [("RO", [edges[i]])]
- result = yield [("RE", [outgoing[0]])]
- raise PrimitiveFinished(result[1])
- result = yield [("CNV", ["(unknown: %s)" % b])]
- 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!")
|