|
@@ -29,6 +29,8 @@ class ModelverseState(object):
|
|
|
self.values = {}
|
|
|
self.nodes = set()
|
|
|
|
|
|
+ self.cache = {}
|
|
|
+
|
|
|
if bootfile is not None:
|
|
|
self.root = self.parse(bootfile)
|
|
|
else:
|
|
@@ -159,6 +161,7 @@ class ModelverseState(object):
|
|
|
n = self.create_nodevalue(data)[0]
|
|
|
e = self.create_edge(source, destination)[0]
|
|
|
self.create_edge(e, n)
|
|
|
+ self.cache.setdefault(source, {})[data] = e
|
|
|
return (None, status.SUCCESS)
|
|
|
|
|
|
def read_value(self, node):
|
|
@@ -211,6 +214,18 @@ class ModelverseState(object):
|
|
|
return (result, status.SUCCESS)
|
|
|
|
|
|
def read_dict_edge(self, node, value):
|
|
|
+ try:
|
|
|
+ first = self.cache[node][value]
|
|
|
+ # Got hit, so validate
|
|
|
+ if (self.edges[first][0] == node) and \
|
|
|
+ (len(self.outgoing[first]) == 1) and \
|
|
|
+ (self.values[self.edges[list(self.outgoing[first])[0]][1]] == value):
|
|
|
+ return (first, status.SUCCESS)
|
|
|
+ del self.cache[node][value]
|
|
|
+ except KeyError:
|
|
|
+ # Didn't exist
|
|
|
+ pass
|
|
|
+
|
|
|
if node not in self.nodes and node not in self.edges:
|
|
|
return (None, status.FAIL_RDICTE_UNKNOWN)
|
|
|
if not self.is_valid_datavalue(value):
|
|
@@ -236,6 +251,7 @@ class ModelverseState(object):
|
|
|
print("Duplicate key on value: %s (%s <-> %s)!" % (v, found, e1))
|
|
|
return (None, status.FAIL_RDICTE_AMBIGUOUS)
|
|
|
found = e1
|
|
|
+ self.cache.setdefault(node, {})[value] = e1
|
|
|
if found is not None:
|
|
|
return (found, status.SUCCESS)
|
|
|
else:
|