delete accessor from version list + build flow update + memgraph docker file + TODO: debug cypher grammar
This commit is contained in:
parent
62a58f05b5
commit
b5536d70fa
.gitmodulesCMakeLists.txtREADME.md
docker
libs
src
api/resources
cypher
data_structures/skiplist
mvcc
speedy
storage
utils
tests
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -1,6 +0,0 @@
|
||||
[submodule "src/speedy/r3"]
|
||||
path = src/speedy/r3
|
||||
url = https://github.com/c9s/r3.git
|
||||
[submodule "src/speedy/rapidjson"]
|
||||
path = src/speedy/rapidjson
|
||||
url = https://github.com/miloyip/rapidjson.git
|
119
CMakeLists.txt
119
CMakeLists.txt
@ -1,6 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.1)
|
||||
|
||||
# set directory name as the project name
|
||||
# get directory name
|
||||
get_filename_component(ProjectId ${CMAKE_SOURCE_DIR} NAME)
|
||||
# replace whitespaces with underscores
|
||||
@ -8,6 +7,8 @@ string(REPLACE " " "_" ProjectId ${ProjectId})
|
||||
# set project name
|
||||
project(${ProjectId})
|
||||
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
# c++14
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
|
||||
|
||||
@ -47,43 +48,35 @@ endif (UNIX)
|
||||
|
||||
# external dependencies
|
||||
|
||||
include(ExternalProject)
|
||||
|
||||
set(build_include_dir ${CMAKE_BINARY_DIR}/include)
|
||||
set(src_dir ${CMAKE_SOURCE_DIR}/src)
|
||||
set(libs_dir ${CMAKE_SOURCE_DIR}/libs)
|
||||
|
||||
# lemon
|
||||
set(lemon_dir "${libs_dir}/lemon")
|
||||
set(lemon_tag "f38a55106d79b7a4c063abb958517d6c47dc6ac7")
|
||||
set(lemon_url "http://www.sqlite.org/src/raw/tool/lemon.c?name=${lemon_tag}")
|
||||
ExternalProject_Add(
|
||||
lemon
|
||||
DOWNLOAD_COMMAND wget ${lemon_url} -O lemon.c
|
||||
DOWNLOAD_DIR ${lemon_dir}
|
||||
SOURCE_DIR ${lemon_dir}
|
||||
BINARY_DIR ${lemon_dir}
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND clang lemon.c -o lemon -O2
|
||||
INSTALL_COMMAND ""
|
||||
TEST_COMMAND ""
|
||||
)
|
||||
# setup external dependencies
|
||||
|
||||
# lempar
|
||||
set(lempar_dir "${libs_dir}/lemon")
|
||||
set(lempar_tag "404ea3dc27dbeed343f0e61b1d36e97b9f5f0fb6")
|
||||
set(lempar_url "http://www.sqlite.org/src/raw/tool/lempar.c?name=${lempar_tag}")
|
||||
ExternalProject_Add(
|
||||
lempar
|
||||
DOWNLOAD_COMMAND wget ${lempar_url} -O lempar.c
|
||||
DOWNLOAD_DIR ${lempar_dir}
|
||||
SOURCE_DIR ${lempar_dir}
|
||||
BINARY_DIR ${lempar_dir}
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
TEST_COMMAND ""
|
||||
)
|
||||
# !! IMPORTANT !! run ./libs/setup.sh before cmake command
|
||||
# TODO: run from execute_process
|
||||
|
||||
# lemon & lempar
|
||||
set(lemon_dir ${libs_dir}/lemon)
|
||||
# lexertl
|
||||
set(lexertl_dir ${libs_dir}/lexertl)
|
||||
# fmt
|
||||
set(fmt_source_dir ${libs_dir}/fmt)
|
||||
set(fmt_static_lib ${fmt_source_dir}/fmt/libfmt.a)
|
||||
# r3
|
||||
set(r3_source_dir ${libs_dir}/r3)
|
||||
set(r3_static_lib ${r3_source_dir}/.libs/libr3.a)
|
||||
# http-parser
|
||||
set(http_parser_source_dir "${libs_dir}/http-parser")
|
||||
set(http_parser_static_lib ${http_parser_source_dir}/libhttp_parser.a)
|
||||
# libuv
|
||||
set(libuv_source_dir ${libs_dir}/libuv)
|
||||
set(libuv_static_lib ${libuv_source_dir}/.libs/libuv.a)
|
||||
# rapidjson (C++ JSON encoder/decoder)
|
||||
set(rapidjson_source_dir "${libs_dir}/rapidjson")
|
||||
# Catch (C++ Automated Test Cases in Headers)
|
||||
set(catch_source_dir "${libs_dir}/Catch")
|
||||
|
||||
# build memgraph's cypher grammar
|
||||
# copy grammar file to the build directory
|
||||
@ -100,46 +93,11 @@ SET(cypher_build_include_dir ${build_include_dir}/cypher)
|
||||
FILE(MAKE_DIRECTORY ${cypher_build_include_dir})
|
||||
FILE(RENAME ${CMAKE_BINARY_DIR}/cypher.h ${cypher_build_include_dir}/cypher.h)
|
||||
|
||||
# lexertl
|
||||
set(lexertl_dir ${libs_dir}/lexertl)
|
||||
ExternalProject_Add(
|
||||
lexertl
|
||||
GIT_REPOSITORY "https://github.com/BenHanson/lexertl.git"
|
||||
GIT_TAG "7d4d36a357027df0e817453cc9cf948f71047ca9"
|
||||
SOURCE_DIR "${libs_dir}/lexertl"
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
TEST_COMMAND ""
|
||||
)
|
||||
|
||||
# fmtlib
|
||||
set(fmt_dir "${libs_dir}/fmt")
|
||||
set(fmt_tag "e5e4fb370ccf327bbdcdcd782eb3e53580e11094") # version 3.0.0
|
||||
ExternalProject_Add(
|
||||
fmt
|
||||
GIT_REPOSITORY "https://github.com/fmtlib/fmt.git"
|
||||
GIT_TAG "${fmt_tag}"
|
||||
SOURCE_DIR "${libs_dir}/fmt"
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
TEST_COMMAND ""
|
||||
)
|
||||
ExternalProject_Get_Property(fmt source_dir)
|
||||
set(fmt_source_dir ${source_dir})
|
||||
ExternalProject_Get_Property(fmt binary_dir)
|
||||
set(fmt_binary_dir ${binary_dir})
|
||||
set(fmt_static_lib ${fmt_binary_dir}/fmt/libfmt.a)
|
||||
# message(STATUS "Fmt source dir is: ${fmt_source_dir}")
|
||||
# message(STATUS "fmt binary dir is: ${fmt_binary_dir}")
|
||||
# message(STATUS "fmt static lib is: ${fmt_static_lib}")
|
||||
|
||||
# compiler options
|
||||
SET(COMPILE_OPTIONS "-O0 -g3 -Wall -Werror -fmessage-length=0")
|
||||
|
||||
# add all cpp file recursive into sourceFiles varibale
|
||||
FILE(GLOB_RECURSE sourceFiles ${src_dir}/*.cpp)
|
||||
# FILE(GLOB_RECURSE sourceFiles ${src_dir}/*.cpp)
|
||||
# print list of source files
|
||||
# MESSAGE(STATUS "All source files are: ${sourceFiles}")
|
||||
|
||||
@ -161,9 +119,13 @@ endif()
|
||||
|
||||
# includes
|
||||
include_directories(${src_dir})
|
||||
include_directories(${lexertl_dir})
|
||||
include_directories(${fmt_source_dir})
|
||||
include_directories(${build_include_dir})
|
||||
include_directories(${fmt_source_dir})
|
||||
include_directories(${http_parser_source_dir})
|
||||
include_directories(${lexertl_dir})
|
||||
include_directories(${libuv_source_dir}/include)
|
||||
include_directories(${rapidjson_source_dir}/include)
|
||||
include_directories(${r3_source_dir}/include)
|
||||
|
||||
# creates build/libcypher_lib.a
|
||||
add_library(cypher_lib STATIC ${CMAKE_BINARY_DIR}/cypher.cpp)
|
||||
@ -171,3 +133,18 @@ add_library(cypher_lib STATIC ${CMAKE_BINARY_DIR}/cypher.cpp)
|
||||
# tests
|
||||
enable_testing()
|
||||
add_subdirectory(tests)
|
||||
|
||||
EXECUTE_PROCESS(
|
||||
COMMAND python link_resources.py
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/api
|
||||
)
|
||||
|
||||
# add main executable
|
||||
add_executable(memgraph src/memgraph.cpp)
|
||||
|
||||
# link libraries
|
||||
target_link_libraries(memgraph Threads::Threads)
|
||||
target_link_libraries(memgraph pcre)
|
||||
target_link_libraries(memgraph ${libuv_static_lib})
|
||||
target_link_libraries(memgraph ${r3_static_lib})
|
||||
target_link_libraries(memgraph ${http_parser_static_lib})
|
||||
|
@ -33,3 +33,6 @@ ctest -R concurrent
|
||||
ctest -R concurrent --parallel 4
|
||||
```
|
||||
|
||||
# custom test build example
|
||||
clang++ -std=c++1y -o concurrent_skiplist ../tests/concurrent/skiplist.cpp -pg -I../src/ -I../libs/fmt -Lfmt-prefix/src/fmt-build/fmt -lfmt -lpthread
|
||||
|
||||
|
33
docker/memgraph.dockerfile
Normal file
33
docker/memgraph.dockerfile
Normal file
@ -0,0 +1,33 @@
|
||||
FROM ubuntu:16.04
|
||||
|
||||
# apt-get setup
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y cmake git python clang wget \
|
||||
&& apt-get install -y check libpcre3 libpcre3-dev libjemalloc-dev \
|
||||
libjemalloc1 build-essential libtool automake \
|
||||
autoconf pkg-config
|
||||
# && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||
|
||||
# prepare source
|
||||
RUN mkdir -p /memgraph/build
|
||||
RUN mkdir -p /memgraph/libs
|
||||
COPY libs/setup.sh /memgraph/libs/setup.sh
|
||||
COPY src /memgraph/src
|
||||
COPY tests /memgraph/tests
|
||||
COPY CMakeLists.txt /memgraph/CMakeLists.txt
|
||||
|
||||
# setup libs
|
||||
WORKDIR /memgraph/libs
|
||||
RUN ./setup.sh
|
||||
|
||||
# build
|
||||
WORKDIR /memgraph/build
|
||||
RUN cmake -DCMAKE_C_COMPILER=clang \
|
||||
-DCMAKE_CXX_COMPILER=clang++ \
|
||||
-DRUNTIME_ASSERT=OFF \
|
||||
-DTHROW_EXCEPTION_ON_ERROR=OFF \
|
||||
-DNDEBUG=OFF ..
|
||||
RUN make
|
||||
|
||||
# run
|
||||
CMD /memgraph/build/memgraph 7474
|
@ -1,45 +0,0 @@
|
||||
FROM ubuntu:16.04
|
||||
|
||||
# apt-get setup
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y cmake git python clang \
|
||||
&& apt-get install -y check libpcre3 libpcre3-dev libjemalloc-dev \
|
||||
libjemalloc1 build-essential libtool automake \
|
||||
autoconf pkg-config
|
||||
# && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||
|
||||
RUN git clone https://pullbot:JnSdamFGKOanF1@phabricator.tomicevic.com/diffusion/MG/memgraph.git /memgraph
|
||||
|
||||
# update all submodules
|
||||
WORKDIR /memgraph
|
||||
RUN git submodule update --init
|
||||
|
||||
# install r3
|
||||
WORKDIR /memgraph/src/speedy/r3
|
||||
RUN git checkout 28726b27af3cd0a9d3166033c6619a9c7227cb48
|
||||
RUN ./autogen.sh && ./configure && make
|
||||
|
||||
# install libuv
|
||||
RUN git clone https://github.com/libuv/libuv.git /libs/libuv
|
||||
WORKDIR /libs/libuv
|
||||
RUN ./autogen.sh && ./configure && make && make check && make install
|
||||
ENV LD_LIBRARY_PATH /usr/local/lib
|
||||
|
||||
# install http_parser
|
||||
RUN git clone https://github.com/nodejs/http-parser /libs/http_parser
|
||||
WORKDIR /libs/http_parser
|
||||
# TODO: remove from here, in the time of writing the master branch
|
||||
# had a bug, some not HEAD commit was checked out
|
||||
RUN git checkout 4e382f96e6d3321538a78f2c7f9506d4e79b08d6
|
||||
RUN make && make install
|
||||
|
||||
WORKDIR /memgraph/build
|
||||
RUN cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..\
|
||||
&& make && ctest
|
||||
|
||||
# compile memgraph
|
||||
WORKDIR /memgraph
|
||||
RUN ./build.sh
|
||||
|
||||
# run memgraph
|
||||
CMD /memgraph/memgraph 7474
|
2
libs/.gitignore
vendored
2
libs/.gitignore
vendored
@ -1,2 +1,4 @@
|
||||
*
|
||||
!.gitignore
|
||||
!setup.sh
|
||||
!cleanup.sh
|
||||
|
7
libs/cleanup.sh
Executable file
7
libs/cleanup.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
for folder in ./* ; do
|
||||
if [ -d "$folder" ]; then
|
||||
rm -rf $folder
|
||||
fi
|
||||
done
|
72
libs/setup.sh
Executable file
72
libs/setup.sh
Executable file
@ -0,0 +1,72 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Catch
|
||||
git clone https://github.com/philsquared/Catch.git
|
||||
catch_tag="master"
|
||||
cd Catch
|
||||
git checkout ${catch_tag}
|
||||
cd ..
|
||||
|
||||
# fmt
|
||||
git clone https://github.com/fmtlib/fmt.git
|
||||
fmt_tag="e5e4fb370ccf327bbdcdcd782eb3e53580e11094"
|
||||
cd fmt
|
||||
git checkout ${fmt_tag}
|
||||
cmake .
|
||||
make
|
||||
cd ..
|
||||
|
||||
# http_parser
|
||||
git clone https://github.com/nodejs/http-parser
|
||||
http_parser_tag="4e382f96e6d3321538a78f2c7f9506d4e79b08d6"
|
||||
cd http-parser
|
||||
git checkout ${http_parser_tag}
|
||||
make package
|
||||
cd ..
|
||||
|
||||
# lemon
|
||||
mkdir lemon
|
||||
cd lemon
|
||||
lemon_tag="09a96bed19955697a5e20c49ad863ec2005815a2"
|
||||
wget http://www.sqlite.org/src/raw/tool/lemon.c?name=${lemon_tag} -O lemon.c
|
||||
lempar_tag="8c4e9d8517e50da391f1d89a519e743dd4afbc09"
|
||||
wget http://www.sqlite.org/src/raw/tool/lempar.c?name=${lempar_tag} -O lempar.c
|
||||
clang lemon.c -o lemon -O2
|
||||
cd ..
|
||||
|
||||
# lexertl
|
||||
git clone https://github.com/BenHanson/lexertl.git
|
||||
lexertl_tag=7d4d36a357027df0e817453cc9cf948f71047ca9
|
||||
cd lexertl
|
||||
git checkout ${lexertl_tag}
|
||||
cd ..
|
||||
|
||||
# libuv
|
||||
git clone https://github.com/libuv/libuv.git
|
||||
libuv_tag="c82eedd0a76233f0894098853b5a0c307af27064"
|
||||
cd libuv
|
||||
git checkout ${libuv_tag}
|
||||
./autogen.sh && ./configure && make
|
||||
cd ..
|
||||
|
||||
# rapidjson
|
||||
git clone https://github.com/miloyip/rapidjson.git
|
||||
rapidjson_tag=${3d5848a7cd3367c5cb451c6493165b7745948308}
|
||||
cd rapidjson
|
||||
git checkout ${rapidjson_tag}
|
||||
cd ..
|
||||
|
||||
# r3
|
||||
|
||||
# UBUNTU 16.04
|
||||
# TODO: automate this
|
||||
# sudo apt-get -y install check libpcre3 libpcre3-dev libjemalloc-dev
|
||||
# sudo apt-get -y install libjemalloc1 build-essential libtool automake
|
||||
# sudo apt-get -y install autoconf pkg-config
|
||||
|
||||
git clone https://github.com/c9s/r3.git
|
||||
r3_tag=28726b27af3cd0a9d3166033c6619a9c7227cb48
|
||||
cd r3
|
||||
git checkout ${r3_tag}
|
||||
./autogen.sh && ./configure && make
|
||||
cd ..
|
@ -65,8 +65,8 @@ public:
|
||||
|
||||
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);
|
||||
v1.vlist->update(t)->data.out.add(e.vlist);
|
||||
v2.vlist->update(t)->data.in.add(e.vlist);
|
||||
|
||||
e.from(v1.vlist);
|
||||
e.to(v2.vlist);
|
||||
|
@ -9,7 +9,7 @@
|
||||
namespace ast
|
||||
{
|
||||
|
||||
struct Accessor : public VisitableExpr<Accessor>
|
||||
struct Accessor : public ValueExpr<Accessor>
|
||||
{
|
||||
Accessor(Identifier* entity, Identifier* prop)
|
||||
: entity(entity), prop(prop) {}
|
||||
|
@ -10,7 +10,7 @@ struct Expr : public AstVisitable
|
||||
};
|
||||
|
||||
template <class Derived>
|
||||
struct VisitableExpr : public Crtp<Derived>, public Expr
|
||||
struct ValueExpr : public Crtp<Derived>, public Expr
|
||||
{
|
||||
using uptr = std::unique_ptr<Derived>;
|
||||
|
||||
@ -21,14 +21,14 @@ struct VisitableExpr : public Crtp<Derived>, public Expr
|
||||
};
|
||||
|
||||
template <class T, class Derived>
|
||||
struct LeafExpr : public VisitableExpr<Derived>
|
||||
struct LeafExpr : public ValueExpr<Derived>
|
||||
{
|
||||
LeafExpr(T value) : value(value) {}
|
||||
T value;
|
||||
};
|
||||
|
||||
template <class Derived>
|
||||
struct BinaryExpr : public VisitableExpr<Derived>
|
||||
struct BinaryExpr : public ValueExpr<Derived>
|
||||
{
|
||||
BinaryExpr(Expr* left, Expr* right) : left(left), right(right) {}
|
||||
|
||||
@ -36,10 +36,17 @@ struct BinaryExpr : public VisitableExpr<Derived>
|
||||
Expr* right;
|
||||
};
|
||||
|
||||
struct PatternExpr : public VisitableExpr<PatternExpr>
|
||||
struct PatternExpr : public Expr
|
||||
{
|
||||
using uptr = std::unique_ptr<PatternExpr>;
|
||||
|
||||
PatternExpr(Pattern* pattern) : pattern(pattern) {}
|
||||
|
||||
virtual void accept(AstVisitor& visitor)
|
||||
{
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
Pattern* pattern;
|
||||
};
|
||||
|
||||
|
@ -3,22 +3,13 @@
|
||||
#include "ast_node.hpp"
|
||||
#include "queries.hpp"
|
||||
|
||||
// LEGACY TODO remove from here
|
||||
|
||||
namespace ast
|
||||
{
|
||||
|
||||
struct Start : public AstNode<Start>
|
||||
{
|
||||
Start(WriteQuery* write_query) : write_query(write_query) {}
|
||||
Start(ReadQuery* read_query) : read_query(read_query) {}
|
||||
Start(UpdateQuery* update_query) : update_query(update_query) {}
|
||||
Start(DeleteQuery* delete_query) : delete_query(delete_query) {}
|
||||
|
||||
// TODO: the start structure must have a different implementation
|
||||
// is this class necessary?
|
||||
WriteQuery* write_query {nullptr};
|
||||
ReadQuery* read_query {nullptr};
|
||||
UpdateQuery* update_query {nullptr};
|
||||
DeleteQuery* delete_query {nullptr};
|
||||
};
|
||||
|
||||
};
|
||||
|
@ -56,19 +56,19 @@
|
||||
// start structure
|
||||
|
||||
start ::= write_query(WQ). {
|
||||
ast->root = ast->create<ast::Start>(WQ);
|
||||
ast->root = WQ;
|
||||
}
|
||||
|
||||
start ::= read_query(RQ). {
|
||||
ast->root = ast->create<ast::Start>(RQ);
|
||||
ast->root = RQ;
|
||||
}
|
||||
|
||||
start ::= update_query(UQ). {
|
||||
ast->root = ast->create<ast::Start>(UQ);
|
||||
ast->root = UQ;
|
||||
}
|
||||
|
||||
start ::= delete_query(DQ). {
|
||||
ast->root = ast->create<ast::Start>(DQ);
|
||||
ast->root = DQ;
|
||||
}
|
||||
|
||||
// write query structure
|
||||
@ -211,10 +211,6 @@ node(N) ::= LP node_idn(I) label_idn(L) properties(P) RP. {
|
||||
N = ast->create<ast::Node>(I, L, P);
|
||||
}
|
||||
|
||||
node(N) ::= idn(I). {
|
||||
N = ast->create<ast::Node>(I, nullptr, nullptr);
|
||||
}
|
||||
|
||||
%type node_idn {ast::Identifier*}
|
||||
|
||||
// a node identifier can be ommitted
|
||||
@ -302,104 +298,114 @@ property_list(L) ::= property(P). {
|
||||
%type property {ast::Property*}
|
||||
|
||||
// IDENTIFIER ':' <expression>
|
||||
property(P) ::= idn(I) COLON expr(E). {
|
||||
property(P) ::= idn(I) COLON value_expr(E). {
|
||||
P = ast->create<ast::Property>(I, E);
|
||||
}
|
||||
|
||||
%type expr {ast::Expr*}
|
||||
%type value_expr {ast::Expr*}
|
||||
|
||||
expr(E) ::= expr(L) AND expr(R). {
|
||||
value_expr(E) ::= value_expr(L) AND value_expr(R). {
|
||||
E = ast->create<ast::And>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) OR expr(R). {
|
||||
value_expr(E) ::= value_expr(L) OR value_expr(R). {
|
||||
E = ast->create<ast::Or>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) LT expr(R). {
|
||||
value_expr(E) ::= value_expr(L) LT value_expr(R). {
|
||||
E = ast->create<ast::Lt>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) GT expr(R). {
|
||||
value_expr(E) ::= value_expr(L) GT value_expr(R). {
|
||||
E = ast->create<ast::Gt>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) GE expr(R). {
|
||||
value_expr(E) ::= value_expr(L) GE value_expr(R). {
|
||||
E = ast->create<ast::Ge>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) LE expr(R). {
|
||||
value_expr(E) ::= value_expr(L) LE value_expr(R). {
|
||||
E = ast->create<ast::Le>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) EQ expr(R). {
|
||||
value_expr(E) ::= value_expr(L) EQ value_expr(R). {
|
||||
E = ast->create<ast::Eq>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) NE expr(R). {
|
||||
value_expr(E) ::= value_expr(L) NE value_expr(R). {
|
||||
E = ast->create<ast::Ne>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) PLUS expr(R). {
|
||||
value_expr(E) ::= value_expr(L) PLUS value_expr(R). {
|
||||
E = ast->create<ast::Plus>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) MINUS expr(R). {
|
||||
value_expr(E) ::= value_expr(L) MINUS value_expr(R). {
|
||||
E = ast->create<ast::Minus>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) STAR expr(R). {
|
||||
value_expr(E) ::= value_expr(L) STAR value_expr(R). {
|
||||
E = ast->create<ast::Star>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) SLASH expr(R). {
|
||||
value_expr(E) ::= value_expr(L) SLASH value_expr(R). {
|
||||
E = ast->create<ast::Slash>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= expr(L) REM expr(R). {
|
||||
value_expr(E) ::= value_expr(L) REM value_expr(R). {
|
||||
E = ast->create<ast::Rem>(L, R);
|
||||
}
|
||||
|
||||
expr(E) ::= idn(I). {
|
||||
value_expr(E) ::= idn(I). {
|
||||
E = ast->create<ast::Accessor>(I, nullptr);
|
||||
}
|
||||
|
||||
expr(E) ::= idn(I) DOT idn(P). {
|
||||
value_expr(E) ::= idn(I) DOT idn(P). {
|
||||
E = ast->create<ast::Accessor>(I, P);
|
||||
}
|
||||
|
||||
// this production produces parser conflicts TODO: findout why
|
||||
// the intention os to add patter in the RETURN statement
|
||||
// expr(E) ::= pattern(P). {
|
||||
// E = ast->create<ast::PatternExpr>(P);
|
||||
// }
|
||||
|
||||
%type idn {ast::Identifier*}
|
||||
|
||||
idn(I) ::= IDN(X). {
|
||||
I = ast->create<ast::Identifier>(X->value);
|
||||
}
|
||||
|
||||
expr(E) ::= INT(V). {
|
||||
value_expr(E) ::= INT(V). {
|
||||
auto value = std::stoi(V->value);
|
||||
E = ast->create<ast::Integer>(value);
|
||||
}
|
||||
|
||||
expr(E) ::= FLOAT(V). {
|
||||
value_expr(E) ::= FLOAT(V). {
|
||||
auto value = std::stod(V->value);
|
||||
E = ast->create<ast::Float>(value);
|
||||
}
|
||||
|
||||
expr(E) ::= STR(V). {
|
||||
value_expr(E) ::= STR(V). {
|
||||
auto value = V->value.substr(1, V->value.size() - 2);
|
||||
E = ast->create<ast::String>(value);
|
||||
}
|
||||
|
||||
expr(E) ::= BOOL(V). {
|
||||
value_expr(E) ::= BOOL(V). {
|
||||
auto value = V->value[0] == 't' || V->value[0] == 'T' ? true : false;
|
||||
E = ast->create<ast::Boolean>(value);
|
||||
}
|
||||
|
||||
// %type pattern_expr {ast::Expr*}
|
||||
//
|
||||
// patter_expr(E) ::= pattern(P). {
|
||||
// E = ast->create<ast::PatternExpr>(P);
|
||||
// }
|
||||
|
||||
%type expr {ast::Expr*}
|
||||
|
||||
expr(E) ::= value_expr(V). {
|
||||
E = V;
|
||||
}
|
||||
|
||||
// expr(E) ::= patter_expr(P). {
|
||||
// E = P;
|
||||
// }
|
||||
|
||||
//%type alias {ast::Alias*}
|
||||
//
|
||||
//alias(A) ::= IDN(X) AS IDN(Y). {
|
||||
@ -433,6 +439,6 @@ accessor(A) ::= idn(E) DOT idn(P). {
|
||||
|
||||
%type set_value {ast::SetValue*}
|
||||
|
||||
set_value(V) ::= expr(E). {
|
||||
set_value(V) ::= value_expr(E). {
|
||||
V = ast->create<ast::SetValue>(E);
|
||||
}
|
||||
|
@ -12,14 +12,6 @@ public:
|
||||
|
||||
void visit(ast::Start& start) override
|
||||
{
|
||||
if (start.write_query != nullptr)
|
||||
accept(start.write_query);
|
||||
if (start.read_query != nullptr)
|
||||
accept(start.read_query);
|
||||
if (start.update_query != nullptr)
|
||||
accept(start.update_query);
|
||||
if (start.delete_query != nullptr)
|
||||
accept(start.delete_query);
|
||||
}
|
||||
|
||||
void visit(ast::DeleteQuery& delete_query) override
|
||||
|
@ -28,10 +28,15 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
long long counter = 0;
|
||||
|
||||
// destroy all elements from local_freelist
|
||||
for (auto element : local_freelist) {
|
||||
counter++;
|
||||
if (element->flags.is_marked()) T::destroy(element);
|
||||
}
|
||||
|
||||
std::cout << "Destroy has been called: " << counter << std::endl;
|
||||
}
|
||||
|
||||
void collect(T *node) { freelist.add(node); }
|
||||
|
@ -19,68 +19,6 @@ public:
|
||||
using uptr = std::unique_ptr<VersionList<T>>;
|
||||
using item_t = T;
|
||||
|
||||
class Accessor
|
||||
{
|
||||
friend class VersionList<T>;
|
||||
|
||||
Accessor(tx::Transaction& transaction, VersionList<T>& vlist)
|
||||
: transaction(transaction), vlist(vlist)
|
||||
{
|
||||
vlist.add_ref();
|
||||
}
|
||||
|
||||
public:
|
||||
~Accessor()
|
||||
{
|
||||
vlist.release_ref();
|
||||
}
|
||||
|
||||
Accessor(const Accessor&) = default;
|
||||
Accessor(Accessor&&) = default;
|
||||
|
||||
Accessor& operator=(const Accessor&) = delete;
|
||||
Accessor& operator=(Accessor&&) = delete;
|
||||
|
||||
T* insert()
|
||||
{
|
||||
return vlist.insert(transaction);
|
||||
}
|
||||
|
||||
T* find() const
|
||||
{
|
||||
return vlist.find(transaction);
|
||||
}
|
||||
|
||||
T* update()
|
||||
{
|
||||
return vlist.update(transaction);
|
||||
}
|
||||
|
||||
T* update(T* record)
|
||||
{
|
||||
return vlist.update(record, transaction);
|
||||
}
|
||||
|
||||
bool remove()
|
||||
{
|
||||
return vlist.remove(transaction);
|
||||
}
|
||||
|
||||
bool remove(T* record)
|
||||
{
|
||||
return vlist.remove(record, transaction);
|
||||
}
|
||||
|
||||
const Id& id() const
|
||||
{
|
||||
return vlist.id;
|
||||
}
|
||||
|
||||
private:
|
||||
tx::Transaction& transaction;
|
||||
VersionList<T>& vlist;
|
||||
};
|
||||
|
||||
VersionList(Id id) : id(id) {}
|
||||
VersionList(const VersionList&) = delete;
|
||||
|
||||
@ -99,11 +37,6 @@ public:
|
||||
delete head.load();
|
||||
}
|
||||
|
||||
Accessor access(tx::Transaction& transaction)
|
||||
{
|
||||
return Accessor(transaction, *this);
|
||||
}
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& stream,
|
||||
const VersionList<T>& vlist)
|
||||
{
|
||||
@ -130,14 +63,6 @@ public:
|
||||
|
||||
}
|
||||
|
||||
const Id id;
|
||||
|
||||
private:
|
||||
std::atomic<T*> head {nullptr};
|
||||
RecordLock lock;
|
||||
|
||||
//static Recycler recycler;
|
||||
|
||||
T* find(const tx::Transaction& t)
|
||||
{
|
||||
auto r = head.load(std::memory_order_acquire);
|
||||
@ -223,6 +148,9 @@ private:
|
||||
return true;
|
||||
}
|
||||
|
||||
const Id id;
|
||||
|
||||
private:
|
||||
void lock_and_validate(T* record, tx::Transaction& t)
|
||||
{
|
||||
assert(record != nullptr);
|
||||
@ -240,6 +168,9 @@ private:
|
||||
assert(record->hints.load().exp.is_committed());
|
||||
throw SerializationError();
|
||||
}
|
||||
|
||||
std::atomic<T*> head {nullptr};
|
||||
RecordLock lock;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -1 +0,0 @@
|
||||
Subproject commit cefefb239a698f85d1aae634f08bf79d5f9ec1d3
|
@ -12,8 +12,9 @@
|
||||
#include <string.h>
|
||||
#include <pcre.h>
|
||||
#include <stdbool.h>
|
||||
#include "r3/include/str_array.h"
|
||||
#include "r3/include/r3_str.h"
|
||||
|
||||
#include "str_array.h"
|
||||
#include "r3_str.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -1 +0,0 @@
|
||||
Subproject commit c02d52ad56595dc70b38daf46b5f315d3a7115fa
|
@ -14,9 +14,8 @@ public:
|
||||
if (edges_iterator == edges_accessor.end())
|
||||
return Edge::Accessor();
|
||||
|
||||
// find vertex
|
||||
auto versions_accessor = edges_iterator->second.access(t);
|
||||
auto edge = versions_accessor.find();
|
||||
// find edge
|
||||
auto edge = edges_iterator->second.find(t);
|
||||
|
||||
if (edge == nullptr)
|
||||
return Edge::Accessor();
|
||||
@ -41,8 +40,7 @@ public:
|
||||
|
||||
// create new vertex
|
||||
auto inserted_edge_record = result.first;
|
||||
auto edge_accessor = inserted_edge_record->second.access(t);
|
||||
auto edge = edge_accessor.insert();
|
||||
auto edge = inserted_edge_record->second.insert(t);
|
||||
|
||||
return Edge::Accessor(edge, &inserted_edge_record->second, this);
|
||||
}
|
||||
|
@ -37,16 +37,14 @@ public:
|
||||
{
|
||||
assert(!empty());
|
||||
|
||||
auto accessor = vlist->access(t);
|
||||
return Derived(accessor.update(t), vlist, store);
|
||||
return Derived(vlist->update(t), vlist, store);
|
||||
}
|
||||
|
||||
bool remove(tx::Transaction& t) const
|
||||
{
|
||||
assert(!empty());
|
||||
|
||||
auto accessor = vlist->access(t);
|
||||
return accessor.remove(record);
|
||||
return vlist->remove(record, t);
|
||||
}
|
||||
|
||||
const Property& property(const std::string& key) const
|
||||
|
@ -15,8 +15,7 @@ public:
|
||||
return Vertex::Accessor();
|
||||
|
||||
// find vertex
|
||||
auto versions_accessor = vertices_iterator->second.access(t);
|
||||
auto vertex = versions_accessor.find();
|
||||
auto vertex = vertices_iterator->second.find(t);
|
||||
|
||||
if (vertex == nullptr)
|
||||
return Vertex::Accessor();
|
||||
@ -42,8 +41,7 @@ public:
|
||||
|
||||
// create new vertex
|
||||
auto inserted_vertex_record = result.first;
|
||||
auto vertex_accessor = inserted_vertex_record->second.access(t);
|
||||
auto vertex = vertex_accessor.insert();
|
||||
auto vertex = inserted_vertex_record->second.insert(t);
|
||||
|
||||
return Vertex::Accessor(vertex, &inserted_vertex_record->second, this);
|
||||
}
|
||||
|
24
src/utils/sysinfo/memory.hpp
Normal file
24
src/utils/sysinfo/memory.hpp
Normal file
@ -0,0 +1,24 @@
|
||||
#pragma mark
|
||||
|
||||
#include "sys/types.h"
|
||||
#include "sys/sysinfo.h"
|
||||
|
||||
auto total_virtual_memory()
|
||||
{
|
||||
struct sysinfo mem_info;
|
||||
sysinfo (&mem_info);
|
||||
long long total_virtual_memory = mem_info.totalram;
|
||||
total_virtual_memory += mem_info.totalswap;
|
||||
total_virtual_memory *= mem_info.mem_unit;
|
||||
return total_virtual_memory;
|
||||
}
|
||||
|
||||
auto used_virtual_memory()
|
||||
{
|
||||
struct sysinfo mem_info;
|
||||
sysinfo (&mem_info);
|
||||
long long virtual_memory_used = mem_info.totalram - mem_info.freeram;
|
||||
virtual_memory_used += mem_info.totalswap - mem_info.freeswap;
|
||||
virtual_memory_used *= mem_info.mem_unit;
|
||||
return virtual_memory_used;
|
||||
}
|
@ -26,7 +26,7 @@ void stacktrace(std::ostream& stream) noexcept
|
||||
// TODO: log to local file or remote database
|
||||
void terminate_handler(std::ostream& stream) noexcept
|
||||
{
|
||||
if(auto exc = std::current_exception())
|
||||
if (auto exc = std::current_exception())
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -2,23 +2,6 @@ cmake_minimum_required(VERSION 3.1)
|
||||
|
||||
project(memgraph_tests)
|
||||
|
||||
# setup dependencies
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
# Catch (C++ Automated Test Cases in Headers) dependency
|
||||
ExternalProject_Add(
|
||||
Catch
|
||||
GIT_REPOSITORY "https://github.com/philsquared/Catch.git"
|
||||
GIT_TAG "master"
|
||||
SOURCE_DIR "${CMAKE_SOURCE_DIR}/libs/Catch"
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
TEST_COMMAND ""
|
||||
)
|
||||
ExternalProject_Get_Property(Catch source_dir)
|
||||
set(catch_source_dir ${source_dir})
|
||||
|
||||
include_directories(${catch_source_dir}/include)
|
||||
|
||||
## UNIT TESTS
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include "data_structures/skiplist/skiplist.hpp"
|
||||
#include "data_structures/static_array.hpp"
|
||||
#include "utils/assert.hpp"
|
||||
#include "utils/sysinfo/memory.hpp"
|
||||
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
@ -18,6 +19,8 @@ int main()
|
||||
{
|
||||
ds::static_array<std::thread, THREADS_NO> threads;
|
||||
skiplist_t skiplist;
|
||||
|
||||
cout << "1. used virtual memory: " << used_virtual_memory() << endl;
|
||||
|
||||
// put THREADS_NO * elems_per_thread items to the skiplist
|
||||
for (size_t thread_i = 0; thread_i < THREADS_NO; ++thread_i) {
|
||||
@ -37,6 +40,8 @@ int main()
|
||||
thread.join();
|
||||
}
|
||||
|
||||
cout << "1. used virtual memory: " << used_virtual_memory() << endl;
|
||||
|
||||
// get skiplist size
|
||||
{
|
||||
auto accessor = skiplist.access();
|
||||
@ -61,6 +66,8 @@ int main()
|
||||
thread.join();
|
||||
}
|
||||
|
||||
cout << "1. used virtual memory: " << used_virtual_memory() << endl;
|
||||
|
||||
// check size
|
||||
{
|
||||
auto accessor = skiplist.access();
|
||||
@ -79,6 +86,8 @@ int main()
|
||||
}
|
||||
|
||||
// TODO: test GC and memory
|
||||
std::this_thread::sleep_for(5s);
|
||||
cout << "1. used virtual memory: " << used_virtual_memory() << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -0,0 +1 @@
|
||||
# MATCH (p:Personnel)-[:CREATED]->(o:Opportunity)-[:HAS_MATCH]->(c:Company {id: "321"}) RETURN (a:Account {id: "123"})-[:IS]->(p)
|
Loading…
Reference in New Issue
Block a user