From 3654aeff86c8384ac99f14d05c646814f21b1de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Tomic=CC=8Cevic=CC=81?= <dominik.tomicevic@gmail.com> Date: Sun, 20 Mar 2016 08:56:13 +0100 Subject: [PATCH] fixed query hashes --- api/resources/demo.hpp | 149 +++++++++++++++++++------------- demo/worker/client.cpp | 23 ++--- demo/worker/random.hpp | 5 -- demo/worker/worker.hpp | 5 -- query_engine/query_stripper.hpp | 8 +- speedy/rapidjson_middleware.hpp | 4 + storage/edge_accessor.hpp | 5 ++ 7 files changed, 108 insertions(+), 91 deletions(-) diff --git a/api/resources/demo.hpp b/api/resources/demo.hpp index 23dd746a7..7fa19ecb4 100644 --- a/api/resources/demo.hpp +++ b/api/resources/demo.hpp @@ -10,6 +10,14 @@ #include "threading/task.hpp" #include "storage/model/properties/all.hpp" +std::vector<std::string> queries { + "CREATE (n:Item{id:1}) RETURN n", + "MATCH (n:Item{id:1}),(m:Item{id:1}) CREATE (n)-[r:test]->(m) RETURN r", + "MATCH (n:Item{id:1}) SET n.prop = 7 RETURN n", + "MATCH (n:Item{id:1}) RETURN n", + "MATCH (n:Item{id:1})-[r]->(m) RETURN count(r)" +}; + #pragma url /transaction/commit class Demo : public Resource<Demo, POST> { @@ -21,77 +29,96 @@ public: Resource(task, db), stripper(make_query_stripper(TK_INT, TK_FLOAT, TK_STR, TK_BOOL)) { - query_f[7130961997552177283] = [db](const code_args_t& args) { + std::vector<uint64_t> hashes; + + for(auto& query : queries) + { + auto strip = stripper.strip(query); + auto hash = fnv(strip.query); + + hashes.push_back(hash); + } + + query_f[hashes[0]] = [db](const code_args_t& args) { auto& t = db->tx_engine.begin(); - auto vertex_accessor = db->graph.vertices.insert(t); - vertex_accessor.property( - "id", args[0] - ); - t.commit(); - return "EXECUTED: CREATE (n{id:X}) RETURN n"; - }; - query_f[11198568396549106428ull] = [db](const code_args_t& args) { - auto& t = db->tx_engine.begin(); - auto id = args[0]->as<Int32>(); - auto vertex_accessor = db->graph.vertices.find(t, id.value); - t.commit(); - return "EXECUTED: MATCH (n{id:X}) RETURN n"; - }; - - query_f[11637140396624918705ull] = [db](const code_args_t& args) { - auto& t = db->tx_engine.begin(); - auto id = args[0]->as<Int32>(); - auto vertex_accessor = db->graph.vertices.find(t, id.value); - if (!vertex_accessor) { - t.commit(); - return "FAIL TO FIND NODE"; - } - vertex_accessor.property( - "prop", args[1] - ); - t.commit(); - return "EXECUTED: MATCH (n{id:X}) SET n.prop=Y RETURN n"; - }; - - query_f[784140140862470291ull] = [db](const code_args_t& args) { - auto& t = db->tx_engine.begin(); - auto id1 = args[0]->as<Int32>(); - auto v1 = db->graph.vertices.find(t, id1.value); - - if (!v1) { - t.commit(); - return "FAIL TO FIND NODE"; - } - auto id2 = args[1]->as<Int32>(); - auto v2 = db->graph.vertices.find(t, id2.value); - if (!v2) { - t.commit(); - return "FAIL TO FIND NODE"; - } - auto edge_accessor = db->graph.edges.insert(t); - - - return t.commit(), "AAA"; - - v1.vlist->access(t).update()->data.out.add(edge_accessor.vlist); - v2.vlist->access(t).update()->data.in.add(edge_accessor.vlist); - - edge_accessor.from(v1.vlist); - edge_accessor.to(v2.vlist); - edge_accessor.edge_type(EdgeType("test")); + auto v = db->graph.vertices.insert(t); + v.property("id", args[0]); t.commit(); - return "EXECUTED: EDGE CREATED"; + return std::to_string(v.property("id").as<Int32>().value); }; - query_f[16940444920835972350ull] = [db](const code_args_t& args) { + query_f[hashes[1]] = [db](const code_args_t& args) { + return std::string("ALO"); auto& t = db->tx_engine.begin(); + + auto v1 = db->graph.vertices.find(t, args[0]->as<Int32>().value); + + if(!v1) + return t.commit(), std::string("not found"); + + auto v2 = db->graph.vertices.find(t, args[1]->as<Int32>().value); + + if(!v2) + return t.commit(), std::string("not found"); + + auto e = db->graph.edges.insert(t); + + v1.vlist->access(t).update()->data.out.add(e.vlist); + v2.vlist->access(t).update()->data.in.add(e.vlist); + + e.from(v1.vlist); + e.to(v2.vlist); + e.edge_type(EdgeType("test")); + + t.commit(); + return e.edge_type(); + }; + + query_f[hashes[2]] = [db](const code_args_t& args) { + auto& t = db->tx_engine.begin(); + auto id = args[0]->as<Int32>(); auto v = db->graph.vertices.find(t, id.value); + + if (!v) + return t.commit(), std::string("not found"); + + v.property("prop", args[1]); + t.commit(); - return "EXECUTED: QUERY: MATCH (n{id:X})-[r]->(m) RETURN count(r)"; + return std::to_string(v.property("id").as<Int32>().value); }; + + query_f[hashes[3]] = [db](const code_args_t& args) { + auto& t = db->tx_engine.begin(); + + auto id = args[0]->as<Int32>(); + auto v = db->graph.vertices.find(t, id.value); + + t.commit(); + + if(!v) + return std::string("not found"); + + return std::to_string(v.property("id").as<Int32>().value); + }; + + query_f[hashes[4]] = [db](const code_args_t& args) { + auto& t = db->tx_engine.begin(); + + auto id = args[0]->as<Int32>(); + auto v = db->graph.vertices.find(t, id.value); + + t.commit(); + + if(!v) + return std::string("not found"); + + return std::to_string(v.out_degree()); + }; + } int x{0}; @@ -99,7 +126,6 @@ public: void post(sp::Request& req, sp::Response& res) { task->run([this, &req]() { - //return res.send(http::Status::Ok, "alo"); auto query = req.json["statements"][0]["statement"].GetString(); auto strip = stripper.strip(query); auto hash = fnv(strip.query); @@ -111,6 +137,7 @@ public: std::cout << "Unrecognized query '" << query << "' with hash " << hash << "." << std::endl; + return std::string("Unrecognized Query"); } diff --git a/demo/worker/client.cpp b/demo/worker/client.cpp index 33453f9bb..9480dc3d0 100644 --- a/demo/worker/client.cpp +++ b/demo/worker/client.cpp @@ -24,23 +24,14 @@ int main(int argc, char* argv[]) auto connections = std::stoi(argv[3]); auto duration = std::stod(argv[4]); - // memgraph - std::vector<std::string> queries { - "CREATE (n{id:@}) RETURN n", - "MATCH (n{id:#}),(m{id:#}) CREATE (n)-[r:test]->(m) RETURN r", - "MATCH (n{id:#}) SET n.prop = ^ RETURN n", - "MATCH (n{id:#}) RETURN n", - "MATCH (n{id:#})-[r]->(m) RETURN count(r)" - }; - // neo4j - /* std::vector<std::string> queries { */ - /* "CREATE (n:Item{id:@}) RETURN n", */ - /* "MATCH (n:Item{id:#}),(m:Item{id:#}) CREATE (n)-[r:test]->(m) RETURN r", */ - /* "MATCH (n:Item{id:#}) SET n.prop = ^ RETURN n", */ - /* "MATCH (n:Item{id:#}) RETURN n", */ - /* "MATCH (n:Item{id:#})-[r]->(m) RETURN count(r)" */ - /* }; */ + std::vector<std::string> queries { + "CREATE (n:Item{id:@}) RETURN n", + "MATCH (n:Item{id:#}),(m:Item{id:#}) CREATE (n)-[r:test]->(m) RETURN r", + "MATCH (n:Item{id:#}) SET n.prop = # RETURN n", + "MATCH (n:Item{id:#}) RETURN n", + "MATCH (n:Item{id:#})-[r]->(m) RETURN count(r)" + }; auto threads = queries.size(); diff --git a/demo/worker/random.hpp b/demo/worker/random.hpp index 72329e255..22999f0b9 100644 --- a/demo/worker/random.hpp +++ b/demo/worker/random.hpp @@ -15,15 +15,10 @@ public: std::string operator()(Rg&& gen, size_t len) { auto str = std::string(); - str.reserve(len + 4); - str.push_back('\\'); - str.push_back('"'); while(str.size() < len) str.push_back(charset[rnd(std::forward<Rg>(gen))]); - str.push_back('\\'); - str.push_back('"'); return str; } diff --git a/demo/worker/worker.hpp b/demo/worker/worker.hpp index 8264e89df..a51c59b72 100644 --- a/demo/worker/worker.hpp +++ b/demo/worker/worker.hpp @@ -41,7 +41,6 @@ public: /* std::cout << "------------------- RESPONSE ------------------" << std::endl; */ /* std::cout << std::string(buf.ptr, buf.len) << std::endl; */ /* std::cout << "-----------------------------------------------" << std::endl; */ - /* std::cout << std::endl; */ requests++; send(stream.socket); @@ -52,10 +51,6 @@ public: // cypherize and send the request //socket.write(cypher(queries[idx])); auto req = cypher(query); - -/* std::cout << "-------------------- REQUEST ------------------" << std::endl; */ -/* std::cout << req << std::endl; */ - socket.write(req); } diff --git a/query_engine/query_stripper.hpp b/query_engine/query_stripper.hpp index fc72cc38b..8b7e4b40d 100644 --- a/query_engine/query_stripper.hpp +++ b/query_engine/query_stripper.hpp @@ -26,18 +26,18 @@ class QueryStripper public: QueryStripper(Ts&&... strip_types) : - lexer(std::make_unique<CypherLexer>()), - strip_types(std::make_tuple(std::forward<Ts>(strip_types)...)) {} + strip_types(std::make_tuple(std::forward<Ts>(strip_types)...)), + lexer(std::make_unique<CypherLexer>()) {} QueryStripper(QueryStripper& other) = delete; - QueryStripper(QueryStripper&& other) : + QueryStripper(QueryStripper&& other) : strip_types(std::move(other.strip_types)), lexer(std::move(other.lexer)) {} auto strip(const std::string& query) { - // TODO write this more optimal (resplace string + // TODO write this more optimal (resplace string // concatenation with something smarter) // TODO: in place substring replacement diff --git a/speedy/rapidjson_middleware.hpp b/speedy/rapidjson_middleware.hpp index 7b0228f5d..1ce0f6f86 100644 --- a/speedy/rapidjson_middleware.hpp +++ b/speedy/rapidjson_middleware.hpp @@ -30,6 +30,10 @@ bool rapidjson_middleware(sp::Request& req, sp::Response& res) // return the error message to the client auto error_str = rapidjson::GetParseError_En(req.json.GetParseError()); std::string parse_error = "JSON parse error: " + std::string(error_str); + + std::cout << "'" << req.body << "'" << std::endl; + std::cout << parse_error << std::endl; + res.send(http::Status::BadRequest, parse_error); // stop further execution diff --git a/storage/edge_accessor.hpp b/storage/edge_accessor.hpp index 4bf9a235f..a24bd4a07 100644 --- a/storage/edge_accessor.hpp +++ b/storage/edge_accessor.hpp @@ -15,6 +15,11 @@ public: this->record->data.edge_type = type; } + const std::string& edge_type() const + { + return this->record->data.edge_type; + } + void from(VertexRecord* vertex_record) { this->record->data.from = vertex_record;