|
@@ -135,11 +135,37 @@ def has_value(a, **remainder):
|
|
|
|
|
|
def make_reverse_dictionary(a, **remainder):
|
|
|
reverse, = yield [("CN", [])]
|
|
|
+
|
|
|
+ if "id" not in a:
|
|
|
+ yield [("RETURN", [{'id': reverse}])]
|
|
|
+
|
|
|
key_nodes, = yield [("RDK", [a['id']])]
|
|
|
values = yield [("RDN", [a['id'], i]) for i in key_nodes]
|
|
|
yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
|
|
|
yield [("RETURN", [{'id': reverse}])]
|
|
|
|
|
|
+def make_reverse_dictionary_multi(a, **remainder):
|
|
|
+ reverse, keys = yield [("CN", []), ("RDK", [a['id']])]
|
|
|
+
|
|
|
+ if "id" not in a:
|
|
|
+ yield [("RETURN", [{'id': reverse}])]
|
|
|
+
|
|
|
+ values = yield [("RDN", [a['id'], i]) for i in keys]
|
|
|
+ keys = yield [("RV", [i]) for i in keys]
|
|
|
+ values = yield [("RV", [i]) for i in values]
|
|
|
+
|
|
|
+ ndict = {}
|
|
|
+ for k, v in zip(keys, values):
|
|
|
+ ndict.setdefault(v, set()).add(k)
|
|
|
+
|
|
|
+ n = yield [("CN", []) for _ in ndict]
|
|
|
+ for k in ndict:
|
|
|
+ set_node = n.pop()
|
|
|
+ yield [("CD", [reverse, k, set_node])]
|
|
|
+ yield [("CD", [set_node, v, set_node]) for v in ndict[k]]
|
|
|
+
|
|
|
+ yield [("RETURN", [{'id': reverse}])]
|
|
|
+
|
|
|
def dict_eq(a, b, **remainder):
|
|
|
key_nodes, = yield [("RDK", [a['id']])]
|
|
|
key_values = yield [("RV", [i]) for i in key_nodes]
|
|
@@ -462,3 +488,12 @@ def set_equality(a, b, **remainder):
|
|
|
keys_b = yield [("RV", [i]) for i in keys_b]
|
|
|
print("Check equality for # " + str(len(keys_a) + len(keys_b)))
|
|
|
yield [("RETURN", [{'value': keys_a == keys_b}])]
|
|
|
+
|
|
|
+def set_difference(a, b, **remainder):
|
|
|
+ keys_a, keys_b = yield [("RDK", [a["id"]]), ("RDK", [b["id"]])]
|
|
|
+ keys_a = yield [("RV", [i]) for i in keys_a]
|
|
|
+ keys_b = yield [("RV", [i]) for i in keys_b]
|
|
|
+ result = set(keys_a) - set(keys_b)
|
|
|
+ res, = yield [("CN", [])]
|
|
|
+ yield [("CD", [res, v, res]) for v in result]
|
|
|
+ yield [("RETURN", [{'id': res}])]
|