summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLV-426 <lv-426@taproot.org.il>2015-03-23 15:45:58 +0200
committerLV-426 <lv-426@taproot.org.il>2015-04-01 22:20:31 +0300
commit242db369c352c80fc0a8480ad1796f803584219e (patch)
tree3f2d123c86e7942f82e1236282b13704dd571cea
parent828ed1ebbf2ddbf37afbb1130005884c5a595284 (diff)
neo4j_cypher: introducte Query_Transformation, QT_Node_Filter__Doc_ID_Label
-rw-r--r--src/server/neo4j_cypher.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/server/neo4j_cypher.py b/src/server/neo4j_cypher.py
index 6537619f..d8d466ea 100644
--- a/src/server/neo4j_cypher.py
+++ b/src/server/neo4j_cypher.py
@@ -51,27 +51,80 @@ class Query_Struct_Type(Enum):
+class Query_Transformation(object):
+ """
+ A query transformation, which may be applied to either a DB_op or a DB_Query
+ """
+ def __call__(self, value):
+ q_set = []
+ if isinstance(value, DB_Query):
+ q_set.append(value)
+ else: # assume iterable
+ assert hasattr(value, '__iter__')
+ for dbq in value:
+ assert isinstance(dbq, DB_Query)
+ q_set.append(dbq)
+ for dbq in q_set:
+ log.debug('%r' % (dbq))
+ self.apply_to_single_query(dbq)
+ log.debug('%r' % (dbq))
+ return value
+ def apply_to_single_query(self, dbq):
+ pass
+class QT_Node_Filter__Doc_ID_Label(Query_Transformation):
+ def __init__(self, doc_id):
+ self.doc_id = doc_id
+ def apply_to_single_query(self, dbq):
+ doc_id_label = META_LABEL__RZ_DOC_PREFIX + self.doc_id
+ rgx__doc_label = re.compile(r'%s[\w\d_]+' % (META_LABEL__RZ_DOC_PREFIX))
+ assert None != rgx__doc_label.match(doc_id_label), 'Illegal doc ID label: %s' % (doc_id_label) # validate doc label
+ q_type = dbq.query_struct_type
+ c_set = [] # clause set
+ if Query_Struct_Type.w == q_type:
+ c_set += dbq.pt_root.clause_set_by_kw('create')
+ if Query_Struct_Type.r == q_type:
+ c_set += dbq.pt_root.clause_set_by_kw('match')
+ if Query_Struct_Type.rw == q_type:
+ c_set += dbq.pt_root.clause_set_by_kw('create')
+ c_set += dbq.pt_root.clause_set_by_kw('match')
+ for c in c_set:
+ set_of_lbl_set = c.sub_exp_set_by_type(e_label_set, recurse=True)
+ if not set_of_lbl_set: # no label set
+ p_node_or_path_set = c.sub_exp_set_by_type([p_node], recurse=True)
+ def f_visit(n, ctx, depth):
+ if isinstance(n, e_ident) and n.parent.__class__ in [p_node]:
+ lbl_set = n.spawn_sibling__adjacent(e_label_set)
+ lbl = lbl_set.spawn_child(e_value)
+ lbl.value = doc_id_label
+ for p_exp in p_node_or_path_set:
+ p_exp.tree_walk__pre(f_visit=f_visit)
+ else: # append to existing label set
+ for lbl_set in set_of_lbl_set:
+ if isinstance(lbl_set.parent, p_node):
+ lbl = lbl_set.spawn_child(e_value)
+ lbl.value = doc_id_label
+ # log.debug('db_q trans: in clause: %s, out clause: %s' % (cur_clause, new_clause))
"""