From a762b328b629487255cdcf65366e05da3701f3f6 Mon Sep 17 00:00:00 2001
From: Marko Budiselic <mbudiselicbuda@gmail.com>
Date: Sun, 13 Mar 2016 15:39:15 +0100
Subject: [PATCH] memgraph demo transactional endpoint

---
 api/resources/demo.hpp        | 99 +++++++++++++++++++++++++++++++++++
 query_engine/prepare/main.cpp | 30 +++++------
 storage/record_accessor.hpp   |  2 +-
 3 files changed, 115 insertions(+), 16 deletions(-)
 create mode 100644 api/resources/demo.hpp

diff --git a/api/resources/demo.hpp b/api/resources/demo.hpp
new file mode 100644
index 000000000..eb462c613
--- /dev/null
+++ b/api/resources/demo.hpp
@@ -0,0 +1,99 @@
+#pragma once
+
+#include <unordered_map>
+
+#include "api/restful/resource.hpp"
+#include "query_engine/query_stripper.hpp"
+#include "query_engine/query_stripped.hpp"
+#include "database/db.hpp"
+#include "utils/hashing/fnv.hpp"
+#include "threading/task.hpp"
+#include "storage/model/properties/all.hpp"
+
+#pragma url /transaction/commit
+class Demo : public Resource<Demo, POST>
+{
+public:
+    QueryStripper<int, int, int, int> stripper;
+    std::unordered_map<uint64_t,
+                       std::function<std::string(const code_args_t&)>> query_f;
+
+    Demo(Task::sptr task, Db::sptr db) :
+        Resource(task, db),
+        stripper(make_query_stripper(TK_INT, TK_FLOAT, TK_STR, TK_BOOL))
+    {
+        query_f[7130961997552177283] = [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>();
+            std::cout << id.value << std::endl;
+            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);
+            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"));
+            t.commit();
+            return "EXECUTED: EDGE CREATED";
+        };
+
+        query_f[16940444920835972350ull] = [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();
+            return "EXECUTED: QUERY: MATCH (n{id:X})-[r]->(m) RETURN count(r)";
+        };
+    }
+
+    void post(sp::Request& req, sp::Response& res)
+    {
+        auto query = req.json["statements"][0]["statement"].GetString();
+        auto strip = stripper.strip(query);
+        auto hash = fnv(strip.query);
+        return res.send(http::Status::Ok, query_f[hash](strip.arguments));
+    }
+};
diff --git a/query_engine/prepare/main.cpp b/query_engine/prepare/main.cpp
index 9415ec0ef..dd629cfd8 100644
--- a/query_engine/prepare/main.cpp
+++ b/query_engine/prepare/main.cpp
@@ -18,8 +18,8 @@ int main()
         std::string("MATCH  (n{id:3}) RETURN n"),
         std::string("MATCH  (n{id:3}) SET n.prop = \"\" RETURN n"),
         std::string("MATCH  (n{id:3}) DELETE n"),
-        std::string("MATCH  (n{id:3}),(m{id:2}) CREATE (n)-[r:TEST]->(m) RETURN r"),
-        std::string("MATCH  (n{id:3})-[r]->(m{id:2}) RETURN count(r)")
+        std::string("MATCH  (n{id:3}),(m{id:2}) CREATE (n)-[r:test]->(m) RETURN r"),
+        std::string("MATCH  (n{id:3})-[r]->(m) RETURN count(r)")
     }};
 
     auto stripper = make_query_stripper(TK_INT, TK_FLOAT, TK_STR, TK_BOOL);
@@ -33,25 +33,25 @@ int main()
     }
 
     auto create_node = [&db](uint64_t id) {
-		auto& t = db.tx_engine.begin();
-		auto vertex_accessor = db.graph.vertices.insert(t);
-		vertex_accessor.property<Int64>(
-			"id", Int64(id)
-		);
-		t.commit();
+        auto& t = db.tx_engine.begin();
+        auto vertex_accessor = db.graph.vertices.insert(t);
+        vertex_accessor.property<Int64>(
+            "id", Int64(id)
+        );
+        t.commit();
         return vertex_accessor;
     };
 
     auto find_node = [&db](uint64_t id) {
         auto& t = db.tx_engine.begin();
-		auto vertex_accessor = db.graph.vertices.find(t, id);
-		t.commit();
+        auto vertex_accessor = db.graph.vertices.find(t, id);
+        t.commit();
         return vertex_accessor;
     };
 
     auto edit_node = [&db](uint64_t id, std::string prop) {
         auto& t = db.tx_engine.begin();
-		auto vertex_accessor = db.graph.vertices.find(t, id);
+        auto vertex_accessor = db.graph.vertices.find(t, id);
         if (!vertex_accessor) {
             t.commit();
             return vertex_accessor;
@@ -65,7 +65,7 @@ int main()
 
     auto delete_node = [&db](uint64_t id) {
         auto& t = db.tx_engine.begin();
-		auto vertex_accessor = db.graph.vertices.find(t, id);
+        auto vertex_accessor = db.graph.vertices.find(t, id);
         if (!vertex_accessor)
             return vertex_accessor;
         vertex_accessor.remove(t);
@@ -74,7 +74,7 @@ int main()
     };
 
     auto create_edge = [&db](uint64_t id1, uint64_t id2, std::string type) {
-		auto& t = db.tx_engine.begin();
+        auto& t = db.tx_engine.begin();
         auto v1 = db.graph.vertices.find(t, id1);
         if (!v1)
             return Edge::Accessor();
@@ -91,7 +91,7 @@ int main()
         return edge_accessor;
     };
 
-    auto count_edges = [&db](uint64_t id) {
+    auto vertex_out_degree = [&db](uint64_t id) {
         auto& t = db.tx_engine.begin();
         auto v = db.graph.vertices.find(t, id);
         t.commit();
@@ -112,7 +112,7 @@ int main()
     auto edge_accessor = create_edge(0, 1, "test");
     if (edge_accessor)
         cout << edge_accessor.record->data.edge_type << endl;
-    cout << count_edges(0) << endl;
+    cout << vertex_out_degree(0) << endl;
 
     return 0;
 }
diff --git a/storage/record_accessor.hpp b/storage/record_accessor.hpp
index 656e699b4..bb8be62fe 100644
--- a/storage/record_accessor.hpp
+++ b/storage/record_accessor.hpp
@@ -30,7 +30,7 @@ public:
     const Id& id() const
     {
         assert(!empty());
-        return vlist->id();
+        return vlist->id;
     }
 
     Derived update(tx::Transaction& t) const