diff options
| author | LV-426 <lv-426@taproot.org.il> | 2015-03-23 15:45:58 +0200 |
|---|---|---|
| committer | LV-426 <lv-426@taproot.org.il> | 2015-04-01 22:20:31 +0300 |
| commit | 242db369c352c80fc0a8480ad1796f803584219e (patch) | |
| tree | 3f2d123c86e7942f82e1236282b13704dd571cea /src/server | |
| parent | 828ed1ebbf2ddbf37afbb1130005884c5a595284 (diff) | |
neo4j_cypher: introducte Query_Transformation, QT_Node_Filter__Doc_ID_Label
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/neo4j_cypher.py | 53 |
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)) """ |
