From 547d55621499a26055d59ce2f84516693fffb7aa Mon Sep 17 00:00:00 2001 From: LV-426 Date: Sun, 17 May 2015 18:09:04 +0300 Subject: DBO_raw_query_set - [!] use discouraged, work around queries the parser can't handle --- src/local/domain/cri.rhizi.net/test_domain__CRI.py | 4 +-- src/server-tests/neo4j_test_util.py | 4 +-- src/server-tests/test_rhizi_api.py | 4 +-- src/server-tests/test_util__rzdoc.py | 4 +-- src/server/db_op.py | 29 +++++++++++++++++----- src/server/neo4j_cypher.py | 25 +++++++++++++++++-- 6 files changed, 54 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/local/domain/cri.rhizi.net/test_domain__CRI.py b/src/local/domain/cri.rhizi.net/test_domain__CRI.py index 652c04a6..5a28c803 100644 --- a/src/local/domain/cri.rhizi.net/test_domain__CRI.py +++ b/src/local/domain/cri.rhizi.net/test_domain__CRI.py @@ -4,7 +4,7 @@ import tempfile import unittest import db_controller as dbc -from db_op import DBO_cypher_query, DBO_rzdoc__create +from db_op import DBO_raw_query_set, DBO_rzdoc__create from neo4j_test_util import rand_label from rz_config import RZ_Config from test_util import generate_random_RZDoc @@ -126,7 +126,7 @@ class Test_Domain_CRI(unittest.TestCase): 'match (n)-[r:Novice|Intermediate|Expert]->(m:Skill)', # [!] expect link type to be proficiency level 'return n.name, collect({skill_name: m.name, skill_level: r.proficiency})' ] - op = DBO_cypher_query(q_arr) + op = DBO_raw_query_set(q_arr) # # write csv file diff --git a/src/server-tests/neo4j_test_util.py b/src/server-tests/neo4j_test_util.py index 9d6700fb..6ea940e7 100644 --- a/src/server-tests/neo4j_test_util.py +++ b/src/server-tests/neo4j_test_util.py @@ -2,11 +2,11 @@ from random import choice import string import uuid -from db_op import DB_op, DBO_cypher_query +from db_op import DB_op, DBO_raw_query_set import neo4j_cypher import neo4j_schema -class DBO_flush_db(DBO_cypher_query): +class DBO_flush_db(DBO_raw_query_set): """ complete DB flush: remove all nodes & links """ diff --git a/src/server-tests/test_rhizi_api.py b/src/server-tests/test_rhizi_api.py index 67a67220..2924f4e8 100644 --- a/src/server-tests/test_rhizi_api.py +++ b/src/server-tests/test_rhizi_api.py @@ -5,7 +5,7 @@ from werkzeug.test import Client from werkzeug.test import EnvironBuilder import db_controller as dbc -from db_op import DBO_cypher_query +from db_op import DBO_raw_query_set import rz_api from rz_config import RZ_Config from test_util__pydev import debug__pydev_pd_arg @@ -49,7 +49,7 @@ class TestRhiziAPI(unittest.TestCase): """ id_set = ['skill_00'] q = ['create (s:Skill {id: \'skill_00\'} )'] - op = DBO_cypher_query(q) + op = DBO_raw_query_set(q) self.db_ctl.exec_op(op) with rz_api.webapp.test_client() as c: diff --git a/src/server-tests/test_util__rzdoc.py b/src/server-tests/test_util__rzdoc.py index ffcc2423..f2ad2004 100644 --- a/src/server-tests/test_util__rzdoc.py +++ b/src/server-tests/test_util__rzdoc.py @@ -1,8 +1,8 @@ -from db_op import DBO_cypher_query +from db_op import DBO_raw_query_set import neo4j_util -class DBO_RDG__skill_graph(DBO_cypher_query): +class DBO_RDG__skill_graph(DBO_raw_query_set): def __init__(self, rzdoc, lim_n=50, diff --git a/src/server/db_op.py b/src/server/db_op.py index b8939f8d..a9a5dc58 100644 --- a/src/server/db_op.py +++ b/src/server/db_op.py @@ -7,7 +7,7 @@ import StringIO as sio from model.graph import Attr_Diff from model.graph import Topo_Diff from model.model import Link, RZDoc, RZCommit -from neo4j_cypher import DB_Query, DB_result_set +from neo4j_cypher import DB_Query, DB_result_set, DB_Raw_Query import neo4j_schema from neo4j_util import cfmt from neo4j_util import generate_random_id__uuid, rzdoc__ns_label, \ @@ -355,13 +355,30 @@ class DBO_block_chain__list(DB_op): for col in row: return col -class DBO_cypher_query(DB_op): +class DBO_raw_query_set(DB_op): """ - freeform cypher query + Freeform set of DB query statements + + [!] use of this class is discouraged and should be done + only when no other DB_op is able to handle the task + at hand """ - def __init__(self, q, q_params={}): - super(DBO_cypher_query, self).__init__() - self.add_statement(q, q_params) + def __init__(self, q_arr=None, q_params={}): + super(DBO_raw_query_set, self).__init__() + + if q_arr is not None: + self.add_statement(q_arr, q_params) + + def add_statement(self, q_arr, query_params={}): + """ + super.add_statement() override: use raw queries + """ + db_q = DB_Raw_Query(q_arr, query_params) + self.query_set.append(db_q) + return len(self.query_set) + + def add_db_query(self, db_q): + assert False, 'DBO_raw_query_set only supports raw queries - use add_statement()' class DBO_diff_commit__topo(DB_composed_op): diff --git a/src/server/neo4j_cypher.py b/src/server/neo4j_cypher.py index 6d1cfa57..31a73450 100644 --- a/src/server/neo4j_cypher.py +++ b/src/server/neo4j_cypher.py @@ -3,12 +3,14 @@ Neo4j DB object """ from enum import Enum -from neo4j_cypher_parser import Cypher_Parser, e_clause__where, e_keyword,\ - e_value import logging + +from neo4j_cypher_parser import Cypher_Parser, e_clause__where, e_keyword, \ + e_value import neo4j_cypher_parser import neo4j_schema + log = logging.getLogger('rhizi') class Query_Struct_Type(Enum): @@ -44,6 +46,9 @@ class Query_Struct_Type(Enum): class DB_Query(object): + """ + DB query object + """ def __init__(self, q_arr, param_set={}): """ @@ -114,6 +119,22 @@ class DB_Query(object): def str__cypher_query(self): return self.pt_root.str__cypher_query() +class DB_Raw_Query(object): + """ + Raw DB query object which does not undergo parsing + """ + + def __init__(self, q_arr, param_set={}): + self.q_arr = q_arr + self.param_set = param_set + + def __iter__(self): + for keyword, clause_set in self.pt_root.index__kw_to_clause_set().items(): + yield keyword, clause_set + + def str__cypher_query(self): + return ' '.join(self.q_arr) + class DB_row(object): def __init__(self, data): self.data = data -- cgit v1.3.1