From 2caf0e617eee4758e03d292f443b92f9313dc368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Budiseli=C4=87?= Date: Tue, 26 Jan 2021 20:08:40 +0100 Subject: [PATCH] Remove docs/dev (migrated to Notion) (#84) --- .github/workflows/diff.yaml | 2 +- README.md | 30 +- docs/dev/code-review.md | 269 ---- docs/dev/communication/contents.md | 5 - docs/dev/cpp-code-conventions.md | 350 ----- docs/dev/lcp.md | 1349 ----------------- docs/dev/other-code-conventions.md | 15 - docs/dev/query/.gitignore | 1 - docs/dev/query/contents.md | 34 - docs/dev/query/execution.md | 373 ----- docs/dev/query/interpreter-class.dot | 23 - docs/dev/query/interpreter-class.png | Bin 56219 -> 0 bytes docs/dev/query/parsing.md | 62 - docs/dev/query/planning.md | 526 ------- docs/dev/query/semantic.md | 134 -- docs/dev/quick-start.md | 107 -- docs/dev/required-reading.md | 129 -- docs/dev/storage/v1/accessors.md | 110 -- docs/dev/storage/v1/contents.md | 6 - docs/dev/storage/v1/durability.md | 80 - docs/dev/storage/v1/indexes.md | 116 -- docs/dev/storage/v1/property-storage.md | 131 -- docs/dev/storage/v2/contents.md | 3 - docs/dev/workflow.md | 166 -- .../active/python-query-modules.md | 185 --- docs/feature_spec/active/tensorflow-op.md | 198 --- docs/feature_spec/contents.md | 33 - .../draft/a-star-variable-length-expand.md | 15 - .../draft/cloud-native-graph-store.md | 7 - .../draft/compile-filter-expressions.md | 40 - docs/feature_spec/draft/database-triggers.md | 14 - .../draft/date-and-time-data-types.md | 13 - .../draft/distributed-query-execution.md | 10 - .../draft/edge-create-or-update-queries.md | 14 - ...xtend-variable-length-filter-expression.md | 12 - .../draft/geospatial-data-types.md | 28 - .../draft/hybrid-storage-engine.md | 20 - docs/feature_spec/draft/load-data-queries.md | 17 - docs/feature_spec/draft/multitenancy.md | 15 - docs/feature_spec/draft/query-compilation.md | 14 - docs/feature_spec/draft/release-log-levels.md | 17 - docs/feature_spec/draft/rust-query-modules.md | 15 - .../feature_spec/draft/sharded-graph-store.md | 8 - .../draft/storage-memory-management.md | 13 - .../draft/vectorized-query-execution.md | 9 - docs/feature_spec/obsolete/distributed.md | 148 -- .../obsolete/high-availability.md | 275 ---- .../obsolete/kafka-integration.md | 117 -- docs/feature_spec/replication.md | 222 --- docs/presentation/latex-template/README.md | 22 - .../presentation/latex-template/mg-beamer.cls | 82 - .../fonts/EncodeSansSemiCondensed-Regular.ttf | Bin 170864 -> 0 bytes .../latex-template/mg-style/memgraph-logo.png | Bin 27184 -> 0 bytes .../mg-style/title-slide-169.png | Bin 189077 -> 0 bytes .../latex-template/mg-style/title-slide.png | Bin 193440 -> 0 bytes docs/presentation/latex-template/template.tex | 40 - environment/README.md | 44 +- 57 files changed, 5 insertions(+), 5663 deletions(-) delete mode 100644 docs/dev/code-review.md delete mode 100644 docs/dev/communication/contents.md delete mode 100644 docs/dev/cpp-code-conventions.md delete mode 100644 docs/dev/lcp.md delete mode 100644 docs/dev/other-code-conventions.md delete mode 100644 docs/dev/query/.gitignore delete mode 100644 docs/dev/query/contents.md delete mode 100644 docs/dev/query/execution.md delete mode 100644 docs/dev/query/interpreter-class.dot delete mode 100644 docs/dev/query/interpreter-class.png delete mode 100644 docs/dev/query/parsing.md delete mode 100644 docs/dev/query/planning.md delete mode 100644 docs/dev/query/semantic.md delete mode 100644 docs/dev/quick-start.md delete mode 100644 docs/dev/required-reading.md delete mode 100644 docs/dev/storage/v1/accessors.md delete mode 100644 docs/dev/storage/v1/contents.md delete mode 100644 docs/dev/storage/v1/durability.md delete mode 100644 docs/dev/storage/v1/indexes.md delete mode 100644 docs/dev/storage/v1/property-storage.md delete mode 100644 docs/dev/storage/v2/contents.md delete mode 100644 docs/dev/workflow.md delete mode 100644 docs/feature_spec/active/python-query-modules.md delete mode 100644 docs/feature_spec/active/tensorflow-op.md delete mode 100644 docs/feature_spec/contents.md delete mode 100644 docs/feature_spec/draft/a-star-variable-length-expand.md delete mode 100644 docs/feature_spec/draft/cloud-native-graph-store.md delete mode 100644 docs/feature_spec/draft/compile-filter-expressions.md delete mode 100644 docs/feature_spec/draft/database-triggers.md delete mode 100644 docs/feature_spec/draft/date-and-time-data-types.md delete mode 100644 docs/feature_spec/draft/distributed-query-execution.md delete mode 100644 docs/feature_spec/draft/edge-create-or-update-queries.md delete mode 100644 docs/feature_spec/draft/extend-variable-length-filter-expression.md delete mode 100644 docs/feature_spec/draft/geospatial-data-types.md delete mode 100644 docs/feature_spec/draft/hybrid-storage-engine.md delete mode 100644 docs/feature_spec/draft/load-data-queries.md delete mode 100644 docs/feature_spec/draft/multitenancy.md delete mode 100644 docs/feature_spec/draft/query-compilation.md delete mode 100644 docs/feature_spec/draft/release-log-levels.md delete mode 100644 docs/feature_spec/draft/rust-query-modules.md delete mode 100644 docs/feature_spec/draft/sharded-graph-store.md delete mode 100644 docs/feature_spec/draft/storage-memory-management.md delete mode 100644 docs/feature_spec/draft/vectorized-query-execution.md delete mode 100644 docs/feature_spec/obsolete/distributed.md delete mode 100644 docs/feature_spec/obsolete/high-availability.md delete mode 100644 docs/feature_spec/obsolete/kafka-integration.md delete mode 100644 docs/feature_spec/replication.md delete mode 100644 docs/presentation/latex-template/README.md delete mode 100644 docs/presentation/latex-template/mg-beamer.cls delete mode 100644 docs/presentation/latex-template/mg-style/fonts/EncodeSansSemiCondensed-Regular.ttf delete mode 100644 docs/presentation/latex-template/mg-style/memgraph-logo.png delete mode 100644 docs/presentation/latex-template/mg-style/title-slide-169.png delete mode 100644 docs/presentation/latex-template/mg-style/title-slide.png delete mode 100644 docs/presentation/latex-template/template.tex diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml index 3cd5e7e05..efe269720 100644 --- a/.github/workflows/diff.yaml +++ b/.github/workflows/diff.yaml @@ -4,7 +4,7 @@ on: push: paths-ignore: - 'docs/**' - - '*.md' + - '**/*.md' jobs: community_build: diff --git a/README.md b/README.md index a141030e3..858c6e18d 100644 --- a/README.md +++ b/README.md @@ -6,34 +6,8 @@ data structures, multi-version concurrency control and asynchronous IO. ## Development Documentation -* [Quick Start](docs/dev/quick-start.md) -* [Workflow](docs/dev/workflow.md) -* [Storage](docs/dev/storage/v2/contents.md) -* [Query Engine](docs/dev/query/contents.md) -* [Communication](docs/dev/communication/contents.md) -* [Lisp C++ Preprocessor (LCP)](docs/dev/lcp.md) - -## Feature Specifications - -Each prominent Memgraph feature requires a feature specification. The purpose -of the feature specification is to have a base for discussing all aspects of -the feature. Elements of feature specifications should be: - -* High-level context. -* Interface. -* User stories. Usage from the end-user perspective. In the case of a library, - that should be cases on how to use the programming interface. In the case of -a shell script, that should be cases on how to use flags. -* Discussion about concurrency, memory management, error management. -* Any other essential functional or non-functional requirements. -* Test and benchmark strategy. -* Possible future changes/improvements/extensions. -* Security concerns. -* Additional and/or optional implementation details. - -It's crucial to keep feature spec up-to-date with the implementation. Take a -look at the list of [feature specifications](docs/feature_spec/contents.md) to -learn more about powerful Memgraph features. +Please continue +[here](https://www.notion.so/memgraph/memgraph-0428591638604c8385550e214ea9f3e6). ## User Documentation diff --git a/docs/dev/code-review.md b/docs/dev/code-review.md deleted file mode 100644 index c7f2659ae..000000000 --- a/docs/dev/code-review.md +++ /dev/null @@ -1,269 +0,0 @@ -# Code Review Guidelines - -This chapter describes some of the things you should be on the lookout when -reviewing someone else's code. - -## Exceptions - -Although the Google C++ Style Guide forbids exceptions, we do allow them in -our codebase. As a reviewer you should watch out for the following. - -The documentation of throwing functions needs to be in-sync with the -implementation. This must be enforced recursively. I.e. if a function A now -throws a new exception, and the function B uses A, then B needs to handle that -exception or have its documentation updated and so on. Naturally, the same -applies when an exception is removed. - -Transitive callers of the function which throws a new exception must be OK -with that. This ties into the previous point. You need to check that all users -of the new exception either handle it correctly or propagate it. - -Exceptions should not escape out of class destructors, because that will -terminate the program. The code should be changed so that such cases are not -possible. - -Exceptions being thrown in class constructors. Although this is well defined -in C++, it usually implies that a constructor is doing too much work and the -class construction & initialization should be redesigned. Usual approaches are -using the (Static) Factory Method pattern or having some sort of an -initialization method that needs to be called after the construction is done. -Prefer the Factory Method. - -Don't forget that STL functions may also throw! - -## Pointers & References - -In cases when some code passes a pointer or reference, or if a code stores a -pointer or reference you should take a careful look at the following. - - * Lifetime of the pointed to value (this includes both ownership and - multithreaded access). - * In case of a class, check validity of destructor and move/copy - constructors. - * Is the pointed to value mutated, if not it should be `const` (`const Type - *` or `const Type &`). - -## Allocators & Memory Resources - -With the introduction of polymorphic allocators (C++17 `` and -our `utils/memory.hpp`) we get a more convenient type signatures for -containers so as to keep the outward facing API nice. This convenience comes -at a cost of less static checks on the type level due to type erasure. - -For example: - - std::pmr::vector first_vec(std::pmr::null_memory_resource()); - std::pmr::vector second_vec(std::pmr::new_delete_resource()); - - second_vec = first_vec // What happens here? - - // Or with our implementation - utils::MonotonicBufferResource monotonic_memory(1024); - std::vector> first_vec(&monotonic_memory); - std::vector> second_vec(utils::NewDeleteResource()); - - second_vec = first_vec // What happens here? - -In the above, both `first_vec` and `second_vec` have the same type, but have -*different* allocators! This can lead to ambiguity when moving or copying -elements between them. - -You need to watch out for the following. - - * Swapping can lead to undefined behaviour if the allocators are not equal. - * Is the move construction done with the right allocator. - * Is the move assignment done correctly, also it may throw an exception. - * Is the copy construction done with the right allocator. - * Is the copy assignment done correctly. - * Using `auto` makes allocator propagation rules rather ambiguous. - -## Classes & Object Oriented Programming - -A common mistake is to use classes, inheritance and "OOP" when it's not -needed. This sections shows examples of encountered cases. - -### Classes without (Meaningful) Members - - class MyCoolClass { - public: - int BeCool(int a, int b) { return a + b; } - - void SaySomethingCool() { std::cout << "Hello!"; } - }; - -The above class has no members (i.e. state) which affect the behaviour of -methods. This class should need not exist, it can be easily replaced with a -more modular (and shorter) design -- top level functions. - - int BeCool(int a, int b) { return a + b; } - - void SaySomethingCool() { std::cout << "Hello!"; } - -### Classes with a Single Public Method - - clas MyAwesomeClass { - public: - MyAwesomeClass(int state) : state_(state) {} - - int GetAwesome() { return GetAwesomeImpl() + 1; } - - private: - int state_; - - int GetAwesomeImpl() { return state_; } - }; - -The above class has a `state_` and even a private method, but there's only one -public method -- `GetAwesome`. - -You should check "Does the stored state have any meaningful influence on the -public method?", similarly to the previous point. - -In the above case it doesn't, and the class should be replaced with a public -function in `.hpp` while the private method should become a private function -in `.cpp` (static or in anonymous namespace). - - // hpp - int GetAwesome(int state); - - // cpp - namespace { - int GetAwesomeImpl(int state) { return state; } - } - int GetAwesome(int state) { return GetAwesomeImpl(state) + 1; } - -A counterexample is when the state is meaningful. - - class Counter { - public: - Counter(int state) : state_(state) {} - - int Get() { return state_++; } - - private: - int state_; - }; - -But even that could be replaced with a closure. - - auto MakeCounter(int state) { - return [state]() mutable { return state++; }; - } - -### Private Methods - -Instead of private methods, top level functions should be preferred. The -reasoning is completely explained in "Effective C++" Item 23 by Scott Meyers. -In our codebase, even improvements to compilation times can be noticed if -private methods in interface (`.hpp`) files are replaced with top level -functions in implementation (`.cpp`) files. - -### Inheritance - -The rule is simple -- if there are no virtual methods (but maybe destructor), -then the class should be marked as `final` and never inherited. - -If there are virtual methods (i.e. class is meant to be inherited), make sure -that either a public virtual destructor or a protected non-virtual destructor -exist. See "Effective C++" Item 7 by Scott Meyers. Also take a look at -"Effective C++" Items 32---39 by Scott Meyers. - -An example of how inheritance with no virtual methods is replaced with -composition. - - class MyBase { - public: - virtual ~MyBase() {} - - void DoSomethingBase() { ... } - }; - - class MyDerived final : public MyBase { - public: - void DoSomethingNew() { ... DoSomethingBase(); ... } - }; - -With composition, the above becomes. - - class MyBase final { - public: - void DoSomethingBase() { ... } - }; - - class MyDerived final { - MyBase base_; - - public: - void DoSomethingNew() { ... base_.DoSomethingBase(); ... } - }; - -The composition approach is preferred as it encapsulates the fact that -`MyBase` is used for the implementation and users only interact with the -public interface of `MyDerived`. Additionally, you can easily replace `MyBase -base_;` with a C++ PIMPL idiom (`std::unique_ptr base_;`) to make the -code more modular with regards to compilation. - -More advanced C++ users will recognize that the encapsulation feature of the -non-PIMPL composition can be replaced with private inheritance. - - class MyDerived final : private MyBase { - public: - void DoSomethingNew() { ... MyBase::DoSomethingBase(); ... } - }; - -One of the common "counterexample" is the ability to store objects of -different type in a container or pass them to a function. Unfortunately, this -is not that good of a design. For example. - - class MyBase { - ... // No virtual methods (but the destructor) - }; - - class MyFirstClass final : public MyBase { ... }; - - class MySecondClass final : public MyBase { ... }; - - std::vector> first_and_second_classes; - first_and_second_classes.push_back(std::make_unique()); - first_and_second_classes.push_back(std::make_unique()); - - void FunctionOnFirstOrSecond(const MyBase &first_or_second, ...) { ... } - -With C++17, the containers for different types should be implemented with -`std::variant`, and as before the functions can be templated. - - class MyFirstClass final { ... }; - - class MySecondClass final { ... }; - - std::vector> first_and_second_classes; - // Notice no heap allocation, since we don't store a pointer - first_and_second_classes.emplace_back(MyFirstClass()); - first_and_second_classes.emplace_back(MySecondClass()); - - // You can also use `std::variant` here instead of template - template - void FunctionOnFirstOrSecond(const TFirstOrSecond &first_or_second, ...) { ... } - -Naturally, if the base class has meaningful virtual methods (i.e. other than -destructor) it maybe is OK to use inheritance but also consider alternatives. -See "Effective C++" Items 32---39 by Scott Meyers. - -### Multiple Inheritance - -Multiple inheritance should not be used unless all base classes are pure -interface classes. This decision is inherited from [Google C++ Style -Guide](https://google.github.io/styleguide/cppguide.html#Inheritance). For -example on how to design with and around multiple inheritance refer to -"Effective C++" Item 40 by Scott Meyers. - -Naturally, if there *really* is no better design, then multiple inheritance is -allowed. An example of this can be found in our codebase when inheriting -Visitor classes (though even that could be replaced with `std::variant` for -example). - -## Code Format & Style - -If something doesn't conform to our code formatting and style, just refer the -author to either [C++ Style](cpp-code-conventions.md) or [Other Code -Conventions](other-code-conventions.md). diff --git a/docs/dev/communication/contents.md b/docs/dev/communication/contents.md deleted file mode 100644 index 6b515b32a..000000000 --- a/docs/dev/communication/contents.md +++ /dev/null @@ -1,5 +0,0 @@ -# Communication - -## Bolt - -Memgraph implements [Bolt communication protocol](https://7687.org/). diff --git a/docs/dev/cpp-code-conventions.md b/docs/dev/cpp-code-conventions.md deleted file mode 100644 index 163a5c902..000000000 --- a/docs/dev/cpp-code-conventions.md +++ /dev/null @@ -1,350 +0,0 @@ -# C++ Code Conventions - -This chapter describes code conventions which should be followed when writing -C++ code. - -## Code Style - -Memgraph uses the -[Google Style Guide for C++](https://google.github.io/styleguide/cppguide.html) -in most of its code. You should follow them whenever writing new code. -Besides following the style guide, take a look at -[Code Review Guidelines](code-review.md) for common design issues and pitfalls -with C++ as well as [Required Reading](required-reading.md). - -### Often Overlooked Style Conventions - -#### Pointers & References - -References provide a shorter syntax for accessing members and better declare -the intent that a pointer *should* not be `nullptr`. They do not prevent -accessing a `nullptr` and obfuscate the client/calling code because the -reference argument is passed just like a value. Errors with such code have -been very difficult to debug. Therefore, pointers are always used. They will -not prevent bugs but will make some of them more obvious when reading code. - -The only time a reference can be used is if it is `const`. Note that this -kind of reference is not allowed if it is stored somewhere, i.e. in a class. -You should use a pointer to `const` then. The primary reason being is that -references obscure the semantics of moving an object, thus making bugs with -references pointing to invalid memory harder to track down. - -Example of this can be seen while capturing member variables by reference -inside a lambda. -Let's define a class that has two members, where one of those members is a -lambda that captures the other member by reference. - -```cpp -struct S { - std::function foo; - int bar; - - S() : foo([&]() { std::cout << bar; }) - {} -}; -``` -What would happend if we move an instance of this object? Our lambda -reference capture will point to the same location as before, i.e. it -will point to the **old** memory location of `bar`. This means we have -a dangling reference in our code! -There are multiple ways to avoid this. The simple solutions would be -capturing by value or disabling move constructors/assignments. -Still, if we capture by reference an object that is not a member -of the struct containing the lambda, we can still have a dangling -reference if we move that object somewhere in our code and there is -nothing we can do to prevent that. -So, be careful with lambda catptures, and remember that references are -still a pointer under the hood! - -[Style guide reference](https://google.github.io/styleguide/cppguide.html#Reference_Arguments) - -#### Constructors & RAII - -RAII (Resource Acquisition is Initialization) is a nice mechanism for managing -resources. It is especially useful when exceptions are used, such as in our -code. Unfortunately, they do have 2 major downsides. - - * Only exceptions can be used for to signal failure. - * Calls to virtual methods are not resolved as expected. - -For those reasons the style guide recommends minimal work that cannot fail. -Using virtual methods or doing a lot more should be delegated to some form of -`Init` method, possibly coupled with static factory methods. Similar rules -apply to destructors, which are not allowed to even throw exceptions. - -[Style guide reference](https://google.github.io/styleguide/cppguide.html#Doing_Work_in_Constructors) - -#### Constructors and member variables - -One of the most powerful tools in C++ is the move semantics. We won't go into -detail how it works, but you should know how to utilize it as much as -possible. In our example we will define a small `struct` called `S` which -contains only a single member, `text` of type `std::string`. -```cpp -struct S { - std::string text; -}; -``` -We want to define a constructor that takes a `std::string`, and saves its -value in `text`. This is a common situation, where the constructor takes -a value, and saves it in the object to be constructed. - -Our first implementation would look like this: -```cpp -S(const std::string &s) : text(s) {} -``` - -This is a valid solution but with one downside - we always copy. If we -construct an object like this: -```cpp -S s("some text"); -``` -we would create a temporary `std::string` object and then copy it to our member -variable. - -Of course, we know what to do now - we will capture temporary variables using -`&&` and move it into our `text` variable. -```cpp -S(std::string &&s) : text(std::move(s)) {} -``` - -Now let's add an extra member variable of type `std::vector` called -`words`. Our constructors accept 2 values now - `std::vector` and -`std::string`. Those arguments could be passed by value, by reference, or -as rvalues. To cover all the cases we need to define a dedicated constructor -for each case. -Fortunately, there are two simpler options, the first one is writing a -templated constructor: -```cpp -template -S(T1 &&s, T2 &&v) : text(std::forward(s), words(std::forward(v) {} -``` -But don't forget to define `requires` clause so you don't accept any type. This -solution is optimal but really hard to read AND write. The second solution is -something you should ALWAYS prefer in these simple cases where we only store -one of the arguments: -```cpp -S(std::string s, std::vector v) : text(std::move(s)), words(std::move(v)) {} -``` -This way we have an almost optimal solution. The only extra operation we have is -the extra move when we send an `lvalue`. We would copy the value to the `s`, and -then move it to the `text` variable. Before, we would copy directly to `text`. -Also, you should ALWAYS write const-correct code, meaning `s` and `v` cannot be -`const` as it's not correct here. Why is that? You CANNOT move a const object! -It would just degrade to copying the object. I would say that this is a small -price to pay for a much cleaner and more maintainable code. - -### Additional Style Conventions - -Old code may have broken Google C++ Style accidentally, but the new code -should adhere to it as close as possible. We do have some exceptions -to Google style as well as additions for unspecified conventions. - -#### Using C++ Exceptions - -Unlike Google, we do not forbid using exceptions. - -But, you should be very careful when using them and introducing new ones. They -are indeed handy, but cause problems with understanding the control flow since -exceptions are another form of `goto`. It also becomes very hard to determine -that the program is in correct state after the stack is unwound and the thrown -exception handled. Other than those issues, throwing exceptions in destructors -will terminate the program. The same will happen if a thread doesn't handle an -exception even though it is not the main thread. - -[Style guide reference](https://google.github.io/styleguide/cppguide.html#Exceptions) - -In general, when introducing a new exception, either via `throw` statement or -calling a function which throws, you must examine all transitive callers and -update their implementation and/or documentation. - -#### Assertions - -We use `CHECK` and `DCHECK` macros from glog library. You are encouraged to -use them as often as possible to both document and validate various pre and -post conditions of a function. - -`CHECK` remains even in release build and should be preferred over it's cousin -`DCHECK` which only exists in debug builds. The primary reason is that you -want to trigger assertions in release builds in case the tests didn't -completely validate all code paths. It is better to fail fast and crash the -program, than to leave it in undefined state and potentially corrupt end -user's work. In cases when profiling shows that `CHECK` is causing visible -slowdown you should switch to `DCHECK`. - -#### Template Parameter Naming - -Template parameter names should start with capital letter 'T' followed by a -short descriptive name. For example: - -```cpp -template -class KeyValueStore -``` - -## Code Formatting - -You should install `clang-format` and run it on code you change or add. The -root of Memgraph's project contains the `.clang-format` file, which specifies -how formatting should behave. Running `clang-format -style=file` in the -project's root will read the file and behave as expected. For ease of use, you -should integrate formatting with your favourite editor. - -The code formatting isn't enforced, because sometimes manual formatting may -produce better results. Though, running `clang-format` is strongly encouraged. - -## Documentation - -Besides following the comment guidelines from [Google Style -Guide](https://google.github.io/styleguide/cppguide.html#Comments), your -documentation of the public API should be -[Doxygen](https://github.com/doxygen/doxygen) compatible. For private parts of -the code or for comments accompanying the implementation, you are free to -break doxygen compatibility. In both cases, you should write your -documentation as full sentences, correctly written in English. - -## Doxygen - -To start a Doxygen compatible documentation string, you should open your -comment with either a JavaDoc style block comment (`/**`) or a line comment -containing 3 slashes (`///`). Take a look at the 2 examples below. - -### Block Comment - -```cpp -/** - * One sentence, brief description. - * - * Long form description. - */ -``` - -### Line Comment - -```cpp -/// One sentence, brief description. -/// -/// Long form description. -``` - -If you only have a brief description, you may collapse the documentation into -a single line. - -### Block Comment - -```cpp -/** Brief description. */ -``` - -### Line Comment - -```cpp -/// Brief description. -``` - -Whichever style you choose, keep it consistent across the whole file. - -Doxygen supports various commands in comments, such as `@file` and `@param`. -These help Doxygen to render specified things differently or to track them for -cross referencing. If you want to learn more, take a look at these two links: - - * http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html - * http://www.stack.nl/~dimitri/doxygen/manual/commands.html - -## Examples - -Below are a few examples of documentation from the codebase. - -### Function - -```cpp -/** - * Removes whitespace characters from the start and from the end of a string. - * - * @param s String that is going to be trimmed. - * - * @return Trimmed string. - */ -inline std::string Trim(const std::string &s); -``` - -### Class - -```cpp -/** Base class for logical operators. - * - * Each operator describes an operation, which is to be performed on the - * database. Operators are iterated over using a @c Cursor. Various operators - * can serve as inputs to others and thus a sequence of operations is formed. - */ -class LogicalOperator - : public ::utils::Visitable { - public: - /** Constructs a @c Cursor which is used to run this operator. - * - * @param GraphDbAccessor Used to perform operations on the database. - */ - virtual std::unique_ptr MakeCursor(GraphDbAccessor &db) const = 0; - - /** Return @c Symbol vector where the results will be stored. - * - * Currently, outputs symbols are only generated in @c Produce operator. - * @c Skip, @c Limit and @c OrderBy propagate the symbols from @c Produce (if - * it exists as input operator). In the future, we may want this method to - * return the symbols that will be set in this operator. - * - * @param SymbolTable used to find symbols for expressions. - * @return std::vector used for results. - */ - virtual std::vector OutputSymbols(const SymbolTable &) const { - return std::vector(); - } - - virtual ~LogicalOperator() {} -}; -``` - -### File Header - -```cpp -/// @file visitor.hpp -/// -/// This file contains the generic implementation of visitor pattern. -/// -/// There are 2 approaches to the pattern: -/// -/// * classic visitor pattern using @c Accept and @c Visit methods, and -/// * hierarchical visitor which also uses @c PreVisit and @c PostVisit -/// methods. -/// -/// Classic Visitor -/// =============== -/// -/// Explanation on the classic visitor pattern can be found from many -/// sources, but here is the link to hopefully most easily accessible -/// information: https://en.wikipedia.org/wiki/Visitor_pattern -/// -/// The idea behind the generic implementation of classic visitor pattern is to -/// allow returning any type via @c Accept and @c Visit methods. Traversing the -/// class hierarchy is relegated to the visitor classes. Therefore, visitor -/// should call @c Accept on children when visiting their parents. To implement -/// such a visitor refer to @c Visitor and @c Visitable classes. -/// -/// Hierarchical Visitor -/// ==================== -/// -/// Unlike the classic visitor, the intent of this design is to allow the -/// visited structure itself to control the traversal. This way the internal -/// children structure of classes can remain private. On the other hand, -/// visitors may want to differentiate visiting composite types from leaf types. -/// Composite types are those which contain visitable children, unlike the leaf -/// nodes. Differentiation is accomplished by providing @c PreVisit and @c -/// PostVisit methods, which should be called inside @c Accept of composite -/// types. Regular @c Visit is only called inside @c Accept of leaf types. -/// To implement such a visitor refer to @c CompositeVisitor, @c LeafVisitor and -/// @c Visitable classes. -/// -/// Implementation of hierarchical visiting is modelled after: -/// http://wiki.c2.com/?HierarchicalVisitorPattern -``` - diff --git a/docs/dev/lcp.md b/docs/dev/lcp.md deleted file mode 100644 index 79f2a680b..000000000 --- a/docs/dev/lcp.md +++ /dev/null @@ -1,1349 +0,0 @@ -# Lisp C++ Preprocessor (LCP) - -In our development process we are using Common Lisp to generate some parts of -the C++ codebase. The idea behind this is supplementing C++ with better -meta-programming capabilities to automate tasks and prevent bugs due to code -duplication. Primary candidate for using more powerful meta-programming is -generating serialization code. Such code is almost always the same: go through -all `struct` or `class` members and invoke the serialization function on them. -Writing such code manually is error prone when adding members, because you may -easily forget to correctly update the serialization code. Thus, the Lisp C++ -Preprocessor was born. It is hooked in our build process as a step before -compilation. The remainder of the document describes how to use LCP and its -features. - -Contents - - * [Running LCP](#running-lcp) - * [Writing LCP](#writing-lcp) - - [Inlining C++ in Common Lisp](#inlining-cpp) - - [C++ Namespaces](#cpp-namespaces) - - [C++ Enumerations](#cpp-enums) - - [C++ Classes & Structs](#cpp-classes) - - [Defining an RPC](#defining-an-rpc) - - [Cap'n Proto Serialization](#capnp-serial) - - [SaveLoadKit Serialization](#slk-serial) - - [Object Cloning](#object-cloning) - -## Running LCP - -You can generate C++ from an LCP file by running the following command. - -`./tools/lcp ` - -The LCP will produce a `path-to-file.hpp` file and potentially a -`path-to-file.lcp.cpp` file. The `.cpp` file is generated if some parts of the -code need to be in the implementation file. This is usually the case when -generating serialization code. Note that the `.cpp` file has the extension -appended to `.lcp`, so that you are free to define your own `path-to-file.cpp` -which includes the generated `path-to-file.hpp`. - -One serialization format uses Cap'n Proto library, but to use it, you need to -provide an ID. The ID is generated by invoking `capnp id`. When you want to -generate Cap'n Proto serialization, you need to pass the generated ID to LCP. - -`./tools/lcp $(capnp id)` - -Generating Cap'n Proto serialization will produce an additional file, -`path-to-file.capnp`, which contains the serialization schema. - -You may wonder why the LCP doesn't invoke `capnp id` itself. Unfortunately, -such behaviour would be wrong when running LCP on the same file multiple -times. Each run would produce a different ID and the serialization code would -be incompatible between versions. - -### CMake - -The LCP is run in CMake using the `add_lcp` function defined in -`CMakeLists.txt`. You can take a look at the function documentation there for -information on how to add your new LCP files to the build system. - -## Writing LCP - -A LCP file should have the `.lcp` extension, but the code written is -completely valid Common Lisp code. This means that you have a complete -language at your disposal before even the C++ is compiled. You can view this -as similar to the C++ templates and macros, but they do not have access to -a complete language. - -Besides Common Lisp, you are allowed to write C++ code verbatim. This means -that C++ and Lisp code coexist in the file. How to do that, as well as other -features are described below. - -### Inlining C++ in Common Lisp {#inlining-cpp} - -To insert C++ code, you need to use a `#>cpp ... cpp<#` block. This is most -often used at the top of the file to write Doxygen documentation and put some -includes. For example: - -```cpp -#>cpp -/// @file My Doxygen style documentation about this file - -#pragma once - -#include -cpp<# -``` - -The above code will be pasted as is into the generated header file. If you -wish to have a C++ block in the `.cpp` implementation file instead, you should -use `lcp:in-impl` function. For example: - -```cpp -(lcp:in-impl -#>cpp -void MyClass::Method(int awesome_number) { - // Do something with awesome_number -} -cpp<#) -``` - -The C++ block also supports string interpolation with a syntax akin to shell -variable access, `${lisp-variable}`. At the moment, only variables are -supported and they have to be pretty printable in Common Lisp (i.e. support -the `~A` format directive). For example, we can make a precomputed sinus -function for integers from 0 to 5: - -```lisp -(let ((sin-from-0-to-5 - (format nil "~{~A~^, ~}" (loop for i from 0 below 5 collect (sin i))))) - #>cpp - static const double kSinFrom0To5[] = {${sin-from-0-to-5}}; - cpp<#) -``` - -The following will be generated. - -```cpp -static const double kSinFrom0To5[] = {0.0, 0.84147096, 0.9092974, 0.14112, -0.7568025}; -``` - -Since you have a complete language at your disposal, this is a powerful tool -to generate tables for computations which would take a very long time during -the execution of the C++ program. - -### C++ Namespaces {#cpp-namespaces} - -Although you can use inline C++ to open and close namespaces, it is -recommended to use `lcp:namespace` and `lcp:pop-namespace` functions. LCP will -report an error if you have an unclosed namespace, unlike Clang and GCC which -most of the times give strange errors due to C++ grammar ambiguity. Additional -benefit is that LCP will track the namespace stack and correctly wrap any C++ -code which should be put in the `.cpp` file. - -For example: - -```lisp -;; example.lcp -(lcp:namespace utils) - -;; Function declaration in header -#>cpp -bool StartsWith(const std::string &string, const std::string &prefix); -cpp<# - -;; Function implementation in implementation file -(lcp:in-impl -#>cpp -bool StartsWith(const std::string &string, const std::string &prefix) { - // Implementation code - return false; -} -cpp<#) - -(lcp:pop-namespace) ;; utils -``` - -The above will produce 2 files, header and implementation: - -```cpp -// example.hpp -namespace utils { - -bool StartsWith(const std::string &string, const std::string &prefix); - -} -``` - -```cpp -// example.lcp.cpp -namespace utils { - -bool StartsWith(const std::string &string, const std::string &prefix) { - // Implementation code - return false; -} - -} -``` - -### C++ Enumerations {#cpp-enums} - -LCP provides a `lcp:define-enum` macro to define a C++ `enum class` type. This -will make LCP aware of the type and all its possible values. This makes it -possible to generate the serialization code. In the future, LCP may generate -"string to enum" and "enum to string" functions. - -Example: - -```lisp -(lcp:define-enum days-in-week - (monday tuesday wednesday thursday friday saturday sunday) - ;; Optional documentation - (:documentation "Enumerates days of the week") - ;; Optional directive to generate serialization code - (:serialize)) -``` - -Produces: - -```cpp -/// Enumerates days of the week -enum class DaysInWeek { - MONDAY, - TUESDAY, - WEDNESDAY, - THURSDAY, - FRIDAY, - SATURDAY, - SUNDAY -}; - -// serialization code ... -``` - -### C++ Classes & Structs {#cpp-classes} - -For defining C++ classes, there is a `lcp:define-class` macro. Its counterpart -for structures is `lcp:define-struct`. They are exactly the same, but -`lcp:define-struct` will put members in public scope by default. Just like in -C++. - -Defining classes is a bit more involved, because they have many customization -options. They syntax follows the syntax of class definition in Common Lisp -(see `defclass`). - -Basic example: - -```lisp -(lcp:define-class my-class () - ((primitive-value :int64_t) - (stl-vector "std::vector")) - ;; Optional documentation - (:documentation "My class documentation") - ;; Define explicitly public, protected or private code. All are optional. - (:public #>cpp // some public code, e.g. methods cpp<#) - (:protected #>cpp // protected cpp<#) - (:private #>cpp //private cpp<#)) -``` - -The above will generate: - -```cpp -/// My class documentation -class MyClass { - public: - // some public code, e.g. methods - - protected: - // protected - - private: - // private - - int64_t primitive_value_; - std::vector stl_vector_; -}; -``` - -As you can see, members in LCP are followed by a type. For primitive types, a -Lisp keyword is used. E.g. `:int64_t`, `:bool`, etc. Other types, like STL -containers use a valid C++ string to specify type. - -C++ supports nesting types inside a class. You can do the same in LCP inside -any of the scoped additions. - -For example: - -```lisp -(lcp:define-class my-class () - ((member "NestedType") - (value "NestedEnum")) - (:private - (lcp:define-enum nested-enum (first-value second-value)) - - (lcp:define-class nested-type () - ((member :int64_t))) - - #>cpp - // Some other C++ code - cpp<#)) -``` - -The above should produce expected results. - -You can add a base classes after the class name. The name should be a Lisp -symbol for base classes defined through `lcp:define-class`, so that LCP tracks -the inheritance. Otherwise, it should be a string. - -For example: - -```lisp -(lcp:define-class derived (my-class "UnknownInterface") - ()) -``` - -Will generate: - -```cpp -class Derived : public MyClass, public UnknownInterface { -}; -``` - -Similarly, you can specify template parameters. Instead of giving just a name -to `define-class`, you give a list where the first element is the name of the -class, while others name the template parameters. - -```lisp -(lcp:define-class (my-map t-key t-value) () - ((underlying-map "std::unordered_map"))) -``` - -The above will generate: - -```cpp -template -class MyMap { - private: - std::unordered_map underlying_map_; -}; -``` - -Other than tweaking the class definition, you can also do additional -configuration of members. The following options are supported. - - * `:initval` -- sets the initial value of a member - * `:reader` -- generates a public getter - * `:scope` -- set the scope of a member, one of `:public`, `:private` or - `:protected` - * `:documentation` -- Doxygen documentation of a member - * various serialization options which are explained later - -For example: - -```lisp -(lcp:define-class my-class () - ((member "std::vector" :scope :protected :initval "1, 2, 3" :reader t - :documentation "Member documentation"))) -``` - -Will generate: - -```cpp -class MyClass { - public: - const auto &member() { return member_; } - - protected: - /// Member documentation - std::vector member_{1, 2, 3}; -}; -``` - -#### TypeInfo - -Defining a class or struct will also generate appropriate `utils::TypeInfo` -instance. This instance will be stored as the `static const` member named -`kType` and the class will also have a `GetTypeInfo` public member function, -for getting `TypeInfo` on an instance. If a class is part of an inheritance -hierarchy, then the `GetTypeInfo` will be `virtual`. - -This mechanism is a portable solution for Run Time Type Information in C++. -Take a look at the documentation of `TypeInfo` in the codebase for additional -information on what is provided with it. - -For example, defining a derived class: - -```lisp -(lcp:define-class derived-class (base-class) - ((member :int64_t))) -``` - -Will generate: - -```cpp -class DerivedClass : public BaseClass { - public: - static const utils::TypeInfo kType; - const utils::TypeInfo &GetTypeInfo() const override { return kType; } - - private: - int64_t member_; -}; -``` - -The generated `TypeInfo` object does not support multiple inheritance, and LCP -will report an error if it tries to generate such information. Additionally, -generating type information for template classes is not supported. In such a -case you will need to write your own description by hand. There are also cases -where you may want to tune the generation of type information. These cases -are described below. - -Sometimes, you may want to avoid having a virtual or overridden call by -treating a derived type as if it is a base type for the purposes of -`TypeInfo`. This can be done by passing the `:type-info :base t` class option. -NOTE: This will potentially break some `TypeInfo` related functions, like -`IsSubtype`. Therefore, this should only be used if the base type does not -have a correctly set `TypeInfo` interface. - -The same example, but with the option enabled: - -```lisp -(lcp:define-class derived-class (base-class) - ((member :int64_t)) - (:type-info :base t)) -``` - -Will generate: - -```cpp -class DerivedClass : public BaseClass { - public: - static const utils::TypeInfo kType; - // Has no override because we pretend this is "base". - // Is not virtual because LCP didn't detect any class inheriting this one. - const utils::TypeInfo &GetTypeInfo() const { return kType; } - - private: - int64_t member_; -}; -``` - -Similarly to `:base t`, when you have multiple inheritance but only want to -track the primary class as super class, you can use the -`:ignore-other-base-classes t` option. NOTE: Similarly to the `:base t` -option, this should only be used if you know it won't break the use cases of -`TypeInfo` for this class hierarchy. - -Again, the same example, but with `:ignore-other-base-classes t`: - -```lisp -(lcp:define-class derived-class (base-class other-base-class) - ((member :int64_t)) - (:type-info :ignore-other-base-classes t)) -``` - -Will generate: - -```cpp -class DerivedClass : public BaseClass, public OtherBaseClass { - public: - static const utils::TypeInfo kType; - // Overrides, because it's expected BaseClass has one. TypeInfo is set to - // track only BaseClass as super class. - const utils::TypeInfo &GetTypeInfo() const override { return kType; } - - private: - int64_t member_; -}; -``` - -### Defining an RPC - -In our codebase, we have implemented remote procedure calls. These are used -for communication between Memgraph instances in a distributed system. Each RPC -is registered by its type and requires serializable data structures. Writing -RPC compliant structure requires a lot of boilerplate. To ease the pain of -defining a new RPC we have a macro, `lcp:define-rpc`. - -Definition consists of 2 parts: request and response. You can specify members -of each part. Member definition is the same as in `lcp:define-class`. - -For example: - -```lisp -(lcp:define-rpc query-result - (:request - ((tx-id "tx::TransactionId") - (query-id :int64_t))) - (:response - ((values "std::vector")))) -``` - -The above will generate relatively large amount of C++ code, which is omitted -here as the details aren't important for understanding the use. Examining the -generated code is left as an exercise for the reader. - -The important detail is that in C++ you will have a `QueryResultRpc` -structure, which is used to register the behaviour of an RPC server. You need -to perform the registration manually. For example: - -```cpp -// somewhere in code you have a server instance -rpc_server.Register( - [](const auto &req_reader, auto *res_builder) { - QueryResultReq request; - Load(&request, req_reader); - // process the request and send the response - QueryResultRes response(values_for_response); - Save(response, res_builder); - }); - - -// somewhere else you have a client which sends the RPC -tx::TransactionId tx_id = ... -int64_t query_id = ... -auto response = rpc_client.template Call(tx_id, query_id); -if (response) { - const auto &values = response->getValues(); - // do something with values -} -``` - -RPC structures use Cap'n Proto for serialization. The above variables -`req_reader` and `res_builder` are used to access Cap'n Proto structures. -Obviously, the LCP will generate the Cap'n Proto schema alongside the C++ -code for serialization. - - -### Cap'n Proto Serialization {#capnp-serial} - -Primary purpose of LCP was to make serialization of types easier. Our -serialization library of choice for C++ is Cap'n Proto. LCP provides -generation and tuning of its serialization code. Previously, LCP supported -Boost.Serialization, but it was removed. - -To specify a class or structure for serialization, you may pass a -`:serialize (:capnp)` option when defining such type. (Note that -`lcp:define-enum` takes `:serialize` without any arguments). - -For example: - -```lisp -(lcp:define-struct my-struct () - ((member :int64_t)) - (:serialize (:capnp))) -``` - -`:serialize` option will generate a Cap'n Proto schema of the class and store -it in the `.capnp` file. C++ code will be generated for saving and loading -members: - -```cpp -// Top level functions -void Save(const MyStruct &self, capnp::MyStruct::Builder *builder); -void Load(MyStruct *self, const capnp::MyStruct::Reader &reader); -``` - -Since we use top level functions, the class needs to have some sort of public -access to its members. - -The schema file will be namespaced in `capnp`. To change add a prefix -namespace use `lcp:capnp-namespace` function. For example, if we use -`(lcp:capnp-namespace "my_namespace")` then the reader and builder would be in -`my_namespace::capnp`. - -Serializing a class hierarchy is also supported. The most basic case with -single inheritance works out of the box. Handling other cases is explained in -later sections. - -For example: - -```lisp -(lcp:define-class base () - ((base-member "std::vector" :scope :public)) - (:serialize (:capnp))) - -(lcp:define-class derived (base) - ((derived-member :bool :scope :public)) - (:serialize (:capnp))) -``` - -Note that all classes need to have the `:serialize` option set. Signatures of -`Save` and `Load` functions are changed to accept reader and builder to the -base class. The `Load` function now takes a `std::unique_ptr *` which is -used to take ownership of a concrete type. This approach transfers the -responsibility of type allocation and construction from the user of `Load` to -`Load` itself. - -```cpp -void Save(const Derived &self, capnp::Base::Builder *builder); -void Load(std::unique_ptr *self, const capnp::Base::Reader &reader); -``` - -#### Multiple Inheritance - -Cap'n Proto does not support any form of inheritance, instead we are -handling it manually. Single inheritance was relatively easy to add to Cap'n -Proto, we simply enumerate all derived types inside the union of a base type. - -Multiple inheritance is a different beast and as such is not directly -supported. - -One way to use multiple inheritance is only to implement the interface of pure -virtual classes without any members (i.e. interface classes). In such a case, -you do not want to serialize any other base class except the primary one. To -let LCP know that is the case, use `:ignore-other-base-classes t`. LCP will -only try to serialize the base class that is the first (leftmost) in the list -of super classes. - -```lisp -(lcp:define-class derived (primary-base some-interface other-interface) - ... - (:serialize (:capnp :ignore-other-base-classes t))) -``` - -Another form of multiple inheritance is reusing some common code. In -actuality, this is a very bad code practice and should be replaced with -composition. If it would take too long to fix such code to use composition -proper, we can tell LCP to treat such inheritance as if they are indeed -composed. This is done via `:inherit-compose` option. - -For example: - -```lisp -(lcp:define-class derived (first-base second-base) - ... - (:serialize (:capnp :inherit-compose '(second-base)))) -``` - -With `:inherit-compose` you can pass a list of parent classes which should be -encoded as composition inside the Cap'n Proto schema. LCP will complain if -there is multiple inheritance but you didn't specify `:inherit-compose`. - -The downside of this approach is that `Save` and `Load` will work only on -`FirstBase`. Serializing a pointer to `SecondBase` would be incorrect. - -#### Inheriting C++ Class Outside of LCP - -Classes defined outside of `lcp:define-class` are not visible to LCP and LCP -will not be able to generate correct serialization code. - -The cases so far have been only with classes that are pure interface and need -no serialization code. This is signaled to LCP by passing the option `:base t` -to `:capnp`. LCP will treat such classes as actually being the base class of a -hierarchy. - -For example: - -```lisp -(lcp:define-class my-class ("utils::TotalOrdering") - (...) - (:serialize (:capnp :base t))) - -(lcp:define-class derived (my-class) - (...) - (:serialize (:capnp))) -``` - -Only the base class for serialization has the `:base t` option set. Derived -classes are defined as usual. This relies on the fact that we do not expect -anyone to have a pointer to `utils::TotalOrdering` and use it for -serialization and deserialization. - -#### Template Classes - -Currently, LCP supports the most primitive form of serializing templated -classes. The template arguments must be provided to specify an explicit -instantiation. Cap'n Proto does support generics, so we may want to upgrade -LCP to use them in the future. - -To specify template arguments, pass a `:type-args` option. For example: - -```lisp -(lcp:define-class (my-container t-value) () - (...) - (:serialize (:capnp :type-args '(my-class)))) -``` - -The above will support serialization of `MyContainer` type. - -The syntax will work even if our templated class inherits from non-templated -classes. All other cases of inheritance with templates are forbidden in LCP -serialization. - -#### Cap'n Proto Schemas and Type Conversions - -You can import other serialization schemas by using `lcp:capnp-import` -function. It expects a name for the import and the path to the schema file. - -For example, to import everything from `utils/serialization.capnp` under the -name `Utils`, you can do the following: - -```lisp -(lcp:capnp-import 'utils "/utils/serialization.capnp") -``` - -To use those types, you need to register a conversion from C++ type to schema -type. There are two options, registering a whole file conversion with -`lcp:capnp-type-conversion` or converting a specific class member. - -For example, you have a class with member of type `Bound` and there is a -schema for it also named `Bound` inside the imported schema. - -You can use `lcp:capnp-type-conversion` like so: - -```lisp -(lcp:capnp-type-conversion "Bound" "Utils.Bound") - -(lcp:define-class my-class () - ((my-bound "Bound"))) -``` - -Specifying only a member conversion can be done with `:capnp-type` member -option: - -```lisp -(lcp:define-class my-class () - ((my-bound "Bound" :capnp-type "Utils.Bound"))) -``` - -#### Custom Save and Load Hooks - -Sometimes the default serialization is not adequate and you may wish to -provide your own serialization code. For those reasons, LCP provides -`:capnp-save`, `:capnp-load` and `:capnp-init` options on each class member. - -The simplest is `:capnp-init` which when set to `nil` will not generate an -`init` call on a builder. Cap'n Proto requires that compound types are -initialized before beginning to serialize its members. `:capnp-init` allows you -to delay the initialization to your custom save code. You rarely want to set -`:capnp-init nil`. - -Custom save code is added as a value of `:capnp-save`. It should be a function -which takes 3 arguments. - - 1. Name of builder variable. - 2. Name of the class (or struct) member. - 3. Name of the member in Cap'n Proto schema. - -The result of the function needs to be a C++ code block. - -You will rarely need to use the 3rd argument, so it should be ignored in most -cases. It is usually needed when you set `:capnp-init nil`, so that you can -correctly initialize the builder. - -Similarly, `:capnp-load` expects a function taking a reader, C++ member and -Cap'n Proto member, then returns a C++ block. - -Example: - -```lisp -(lcp:define-class my-class () - ((my-member "ComplexType" - :capnp-init nil - :capnp-save (lambda (builder member capnp-name) - #>cpp - auto data = ${member}.GetSaveData(); - auto my_builder = ${builder}.init${capnp-name}(); - my_builder.setData(data); - cpp<#) - :capnp-load (lambda (reader member capnp-name) - (declare (ignore capnp-name)) - #>cpp - auto data = ${reader}.getData(); - ${member}.LoadFromData(data); - cpp<#))) - (:serialize (:capnp))) -``` - -With custom serialization code, you may want to get additional details through -extra arguments to `Save` and `Load` functions. This is described in the next -section. - -There are also cases where you always need custom serialization code. LCP -provides helper functions for abstracting some common details. These functions -are listed further down in this document. - -#### Arguments for Save and Load - -Default arguments for `Save` and `Load` function are Cap'n Proto builder and -reader, respectively. In some cases you may wish to send additional arguments. -This is most commonly needed when tracking `shared_ptr` serialization, to -avoid serializing the same pointer multiple times. - -Additional arguments are specified by passing `:save-args` and `:load-args`. -You can specify either of them, but in most cases you want both. - -For example: - -```lisp -;; Class for tracking details during save -(lcp:define-class save-helper () - (...)) - -;; Class for tracking details during load -(lcp:define-class load-helper () - (...)) - -(lcp:define-class my-class () - ((member "std::shared_ptr" - :capnp-save ;; custom save - :capnp-load ;; custom load - )) - (:serialize (:capnp - :save-args '((save-helper "SaveHelper *")) - :load-args '((load-helper "LoadHelper *"))))) -``` - -The custom serialization code will now have access to `save_helper` and -`load_helper` variables in C++. You can add more arguments by expanding the -list of pairs, e.g. - -```lisp -:save-args '((first-helper "SomeType *") (second-helper "OtherType *") ...) -``` - -#### Custom Serialization Helper Functions - -##### Helper for `std::optional` - -When using `std::optional` with primitive C++ types or custom types known to -LCP, you do not need to use any helper. In the example below, things should be -serialized as expected: - -```lisp -(lcp:define-class my-class-with-primitive-optional () - ((primitive-optional "std::experimental::optional")) - (:serialize (:capnp))) - -(lcp:define-class my-class-with-known-type-optional () - ((known-type-optional "std::experimental::optional")) - (:serialize (:capnp))) -``` - -In cases when the value contained in `std::optional` needs custom -serialization code you may use `lcp:capnp-save-optional` and -`lcp:capnp-load-optional`. - -Both functions expect 3 arguments. - - 1. Cap'n Proto type in C++. - 2. C++ type of the value inside `std::optional`. - 3. Optional C++ lambda code. - -The lambda code is optional, because LCP will generate the default -serialization code which invokes `Save` and `Load` function on the value -stored inside the optional. Since most of the serialized classes follow the -convention, you will rarely need to provide this 3rd argument. - -For example: - -```lisp -(lcp:define-class my-class () - ((member "std::experimental::optional" - :capnp-save (lcp:capnp-save-optional - "capnp::SomeType" "SomeType" - "[](auto *builder, const auto &val) { ... }") - :capnp-load (lcp:capnp-load-optional - "capnp:::SomeType" "SomeType" - "[](const auto &reader) { ... return loaded_val; }")))) -``` - -##### Helper for `std::vector` - -For custom serialization of vector elements, you may use -`lcp:capnp-save-vector` and `lcp:capnp-load-vector`. They function exactly the -same as helpers for `std::optional`. - -##### Helper for enumerations - -If the enumeration is defined via `lcp:define-enum`, the default LCP -serialization should generate the correct code. - -However, if LCP cannot infer the serialization code, you can use helper -functions `lcp:capnp-save-enum` and `lcp:capnp-load-enum`. Both functions -require 3 arguments. - - 1. C++ type of equivalent Cap'n Proto enum. - 2. Original C++ enum type. - 3. List of enumeration values. - -Example: - -```lisp -(lcp:define-class my-class () - ((enum-value "SomeEnum" - :capnp-init nil ;; must be set to nil - :capnp-save (lcp:capnp-save-enum - "capnp::SomeEnum" "SomeEnum" - '(first-value second-value)) - :capnp-load (lcp:capnp-load-enum - "capnp::SomeEnum" "SomeEnum" - '(first-value second-value))))) -``` - -### SaveLoadKit Serialization {#slk-serial} - -LCP supports generating serialization code for use with our own simple -serialization framework, SaveLoadKit (SLK). - -To specify a class or structure for serialization, pass a `:serialize (:slk)` -class option. For example: - -```lisp -(lcp:define-struct my-struct () - ((member :int64_t)) - (:serialize (:slk))) -``` - -The above will generate C++ functions for saving and loading all members of -the defined type. The generated code is put inside the `slk` namespace. For -the above example, we would get the following declarations: - -```cpp -namespace slk { -void Save(const MyStruct &self, slk::Builder *builder); -void Load(MyStruct *self, slk::Reader *reader); -} -``` - -Since we use top level (i.e. non-member) functions, the class members need to -have public access. The primary reason why we use non-member functions is the -ability to have them decoupled from types. This in turn allows us to easily -compile the code with and without serialization. The obvious downside is the -requirement of public access which could potentially allow for erroneous use -of classes and its members. Therefore, the recommended way to use -serialization is with plain old data types. The programmer needs be aware of -that and use POD as an immutable type as much as possible. This -recommendation of using POD types will also help minimize the complexity of -serialization code as well as minimize required features in LCP. - -Another requirement on serialized types is that they need to be default -constructible. This keeps the serialization implementation simple and uniform. -Each type is first default constructed, potentially on stack memory. Then the -`slk::Load` function is invoked with the pointer to that instance. We could -add support for having a pointer to an uninitialized memory and perform the -construct in `slk::Load` to allow types which aren't default constructible. -At the moment, implementing this support would needlessly complicate our code -where most of the types can be and are default constructible. - -#### Single Inheritance - -The first and most common step out of the POD zone is having classes with -inheritance. LCP supports serializing classes with single inheritance. - -A minor complication appears when loading a pointer to a base class. When we -have a pointer to a base class, serializing it may save the data of some -concrete, derived type. Loading the pointer back will need to determine which -type was actually serialized. When we know the concrete type, we need to -construct it and load it. Finally, we can return a base pointer to that. For -this reason, we generate 2 loading functions: regular `Load` and -`ConstructAndLoad`. The latter function is used to do the whole process of -determining the type, constructing it and invoking regular `Load`. Since we -cannot know the type of the serialized pointer upfront, we cannot allocate the -exact required memory on the stack. For that reason, `ConstructAndLoad` will -perform a heap allocation for you. Obviously, this could be a performance -issue. In cases when we know the exact concrete type, then we can use the -regular `Load` which expects the pointer to that type. If you are using `Load` -instead of `ConstructAndLoad`, read the next paragraph carefully! - -Determining which type was serialized works by storing the `id` of -`utils::TypeInfo` when saving a class which is anywhere in the inheritance -hierarchy. This is the *first* thing the invocation to `Save` does. Later, -when we call `ConstructAndLoad` it will read that type `id` and dispatch on it -to construct the instance of that type and call the appropriate `Load` -function. Beware when invoking `Load` of polymorphic types yourself! You -*need* to read the type `id` yourself *first* and then invoke the `Load` -function. Things will not work correctly if you forget to do that, because -`Load` expects to read the serialized data members and not the type -information. - -For example: - -```lisp -(lcp:define-class base () - ... - (:serialize (:slk))) - -(lcp:define-class derived (base) - ... - (:serialize (:slk))) -``` - -We get the following declarations generated: - -```cpp -namespace slk { -// Save will correctly forward to derived class using `dynamic_cast`! -void Save(const Base &self, slk::Builder *builder); -// Load only the Base instance, does *not* forward! -void Load(Base *self, slk::Reader *reader); -// Construct the concrete type (could be Base or any derived) and call the -// correct Load. Raises `slk::SlkDecodeException` if an unknown type is -// serialized. -void ConstructAndLoad(std::unique_ptr *self, slk::Reader *reader); - -void Save(const Derived &self, slk::Builder *builder); -void Load(Derived *self, slk::Reader *reader); -// This will raise slk::SlkDecodeException, if something other than `Derived` -// was serialized. `Derived` does not have any subclassses. -void ConstructAndLoad(std::unique_ptr *self, slk::Reader *reader); -``` - -#### Multiple Inheritance - -Serializing classes with multiple inheritance is *not* supported! - -Usually, multiple inheritance is used to satisfy some interface which doesn't -carry data for serialization. In such cases, you can ignore the multiple -inheritance by specifying `:ignore-other-base-classes` option. For example: - -```lisp -(lcp:define-class derived (primary-base some-interface ...) - ... - (:serialize (:slk :ignore-other-base-classes t))) -``` - -The above will produce serialization code as if `derived` is inheriting *only* -from `primary-base`. - -#### Templated Types - -Serializing templated types is *not* supported! - -You may still write your own serialization code in C++, but LCP will not -generate it for you. - -#### Custom Save and Load Hooks - -In cases when default serialization is not adequate, you may wish to provide -your own serialization code. LCP provides `:slk-save` and `:slk-load` options -for each member. - -These hooks for custom serialization expect a function with a single argument, -`member`, representing the member currently being serialized. This allows to -have a more generic function which works with any member of some type. The -return value of the function needs to be C++ code. The generated code may -expect to have `self` and `builder` variables in scope, just like they are -found in the generated `Save` and `Load` declarations. - -For example, one of the most common use cases is saving and loading -a `std::shared_ptr`. You need to provide an argument which is used to track -which pointers were already (de)serialized. Let's take a look how this could -be done in LCP. - -```lisp -(lcp:define-struct my-struct () - ((some-ptr "std::shared_ptr" - :slk-save (lambda (member) - #>cpp - std::vector already_saved; - slk::Save(self.${member}, builder, &already_saved); - cpp<#) - :slk-load (lambda (member) - #>cpp - std::vector> already_loaded; - slk::Load(&self->${member}, reader, &already_loaded); - cpp<#))) - (:serialize (:slk))) -``` - -The above use is very artificial, because we usually have multiple shared -pointers across different members. In such cases we would like to share the -tracking data. One way to do that is explained in the next section. - -#### Additional Arguments to Generated Save and Load - -As you may have noticed, primary arguments for `Save` and `Load` are the type -instance and a `slk::Builder` or a `slk::Reader`. In some cases we would like -to accept additional arguments to help us with the serialization process. -Let's see how this is done in LCP using the `:save-args` and `:load-args` -options for `:slk` serialization. - -Both `:save-args` and `:load-args` options expect a list of pairs. Each pair -designates one argument. The first element of the pair is the argument name -and the second is the C++ type of that argument. - -As mentioned in the previous section, one of the most common cases where -default serialization doesn't cut it is when we have a `std::shared_ptr`. -Here, we would like to track already serialized pointers. Instead of having -some kind of a global variable, we could pass the tracking data as an -additional argument. Let's take the example from the previous section, and -have it take tracking data as an argument to `Save` and `Load` of `my-struct` -type. - -```lisp -(lcp:define-struct my-struct () - ((some-ptr "std::shared_ptr" - :slk-save (lambda (member) - #>cpp - slk::Save(self.${member}, builder, already_saved); - cpp<#) - :slk-load (lambda (member) - #>cpp - slk::Load(&self->${member}, reader, already_loaded); - cpp<#))) - (:serialize (:slk :save-args '((already-saved "std::vector *")) - :load-args '((already-loaded "std::vector> *"))))) -``` - -The generated declarations now look like the following: - -```cpp -void Save(const MyStruct &self, slk::Builder *builder, - std::vector *already_saved); -void Load(MyStruct *self, slk::Builder *builder, - std::vector> *already_loaded); -``` - -This can now be handy when serializing multiple instances of `my-struct`. For -example: - -```lisp -(lcp:define-struct my-array-of-struct () - ((structs "std::vector" - :slk-save (lambda (member) - #>cpp - slk::Save(self.${member}.size(), builder); - std::vector already_saved; - for (const auto &my_struct : structs) - slk::Save(my_struct, builder, &already_saved); - cpp<#) - :slk-load (lambda (member) - #>cpp - size_t size = 0; - slk::Load(&size, reader); - self->${member}.resize(size); - std::vector> already_loaded; - for (size_t i = 0; i < size; ++i) - slk::Load(&self->${member}[i], reader, &already_loaded); - cpp<#))) - (:serialize (:slk))) -``` - -### Object Cloning - -LCP supports automatic generation of cloning (deep copy) code for user-defined -classes. - -A textbook example of an object that would require a deep copy functionality is -a tree structure. The following class represents a node in the binary tree, -carrying an integer value and having pointers to its two children: - -```lisp -(lcp:define-class node () - ((value :int32_t) - (left "std::unique_ptr") - (right "std::unique_ptr")) - (:clone :return-type (lambda (typename) - #>cpp - std::unique_ptr<${typename}> - cpp<#) - :init-object (lambda (var typename) - #>cpp - auto ${var} = std::make_unique<${typename}>(); - cpp<#))) -``` - -The above will generate the following C++ class with a `Clone` function that -can be used for making a deep copy of the binary tree structure: - -```cpp -class Node { - public: - std::unique_ptr Clone() const { - auto object = std::make_unique(); - object->value_ = value_; - object->left_ = left_ ? left_->Clone() : nullptr; - object->right_ = right_ ? right_->Clone() : nullptr; - return object; - } - - private: - int32_t value_; - std::unique_ptr left_; - std::unique_ptr right_; -}; -``` - -To specify that a class is deep copyable, `:clone` class option must be passed. -We have already seen two options that `:clone` accepts: `:return-type` and -`:init-object`. - -`:return-type` expects a function that takes a single argument which is the C++ -type name of the class and produces C++ code, which is a valid C++ type -declaration. Here we used it to specify that `Clone` function should return a -`std::unique_ptr` to the newly created `Node` to override the default behavior. -When `:return-type` option is not provided and class `T` is a member of an -inheritance hierarchy, `Clone` will return `std::unique_ptr`, where -`Base` is the root of that hierarchy. If `T` is not a member of inheritance -hierarchy, `Clone` will return `T` by default. - -`:init-object` expects a function that takes two arguments, first is a variable -name, and the second one is the C++ type name of the class. It must produce C++ -code that initializes an object with the given name of the same type that -`Clone` function returns. Here we had to use it since we are overriding the -default return value of `Clone`. Unless `:init-object` argument is provided, an -object of type `T` will be instantiated with `auto object = -std::make_unique();` if `T` is a member of inheritance hierarchy, and `T -object;` if it is not. As you can see, deep copyable objects must be default -constructible. - - -#### Single Inheritance - -LCP supports deep copying of classes with single inheritance. The root class -will have a virtual `Clone` function that child classes will override. For -example: - -```lisp -(lcp:define-class base () - ((member :int32_t)) - (:clone)) - -(lcp:define-class derived (base) - ((another-member :int32_t)) - (:clone)) -``` - -We get the following code: - -```cpp -class Base { - public: - virtual std::unique_ptr Clone() const { - auto object = std::make_unique(); - object->member_ = member_; - return object; - } - - private: - int32_t member_; -}; - -class Derived : public Base { - public: - std::unique_ptr Clone() const override { - auto object = std::make_unique(); - object->member_ = member_; - object->another_member_ = another_member_; - return object; - } - - private: - int32_t another_member_; -}; -``` - -Notice that the `Clone` function of derived class also returns -`std::unique_ptr`, because C++ doesn't support return type covariance -with smart pointers. - -#### Multiple Inheritance - -Deep copying of classes with multiple inheritance is *not* supported! - -Usually, multiple inheritance is used to satisfy some interface which doesn't -carry data. In such cases, you can ignore the multiple inheritance by -specifying `:ignore-other-base-classes` option. For example: - -```lisp -(lcp:define-class derived (primary-base some-interface ...) - ... - (:clone :ignore-other-base-classes t)) -``` - -The above will produce deep copying code as if `derived` is inheriting *only* -from `primary-base`. - -#### Templated Types - -Deep copying of templated types is *not* supported! - -#### Custom Clone Hooks - -In cases when default deep copying code is not adequate, you may wish to -provide your own. LCP provides `:clone` option that can be specified for each -member. - -These hooks for custom copying expect a function with two arguments, `source` -and `dest`, representing the member location in the cloned struct and member -location in the new struct. This allows to have a more generic function which -works with any member of some type. The return value of the function needs to -be C++ code. - -It is also possible to specify that a member is cloned by copying by passing -`:copy` instead of a function as an argument to `:clone`. - -```lisp -(lcp:define-class my-class () - ((callback "std::function" - :clone :copy) - (widget "Widget" - :clone (lambda (source dest) - #>cpp - ${dest} = WidgetFactory::Create(${source}.type()); - cpp<#))) - (:clone)) -``` - -#### Additional Arguments to Generated Clone Function - -By default, `Clone` function takes no argument. In some cases we would like to -accept additional arguments necessary to create a deep copy. Let's see how this -is done in LCP using the `:args` option. - -`:args` expects a list of pairs. Each pair designates one argument. The first -element of pair is the argument name and the second is the C++ type of that -argument. - -One case where we want to pass additional arguments to `Clone` is when there is -another object that owns all objects being cloned. For example, `AstStorage` -owns all Memgraph AST nodes. For that reason, `Clone` function of all AST node -types takes an `AstStorage \*` argument. Here's a snippet from the actual AST -code: - -```lisp -(lcp:define-class tree () - ((uid :int32_t)) - (:abstractp t) - ... - (:clone :return-type (lambda (typename) - (format nil "~A*" typename)) - :args '((storage "AstStorage *")) - :init-object (lambda (var typename) - (format nil "~A* ~A = storage->Create<~A>();" - typename var typename)))) - -(lcp:define-class expression (tree) - () - (:abstractp t) - ... - (:clone)) - -(lcp:define-class where (tree) - ((expression "Expression *" :initval "nullptr" :scope :public)) - (:clone)) -``` - -`:args` option is only passed to the root class in inheritance hierarchy. By -default, the same extra arguments will be passed to all class members that are -cloned using `Clone` metehod. The generated code is: - -```cpp -class Tree { - public: - virtual Tree *Clone(AstStorage *storage) const = 0; - private: - int32_t uid_; -}; - -class Expression : public Tree { - public: - Expression *Clone(AstStorage *storage) const override = 0; -}; - -class Where : public Tree { - public: - Expression *expression_{nullptr}; - - Where *Clone(AstStorage *storage) const override { - Where *object = storage->Create(); - object->uid_ = uid_; - object->expression_ = expression_ ? expression_->Clone(storage) : nullptr; - return object; - } -}; -``` diff --git a/docs/dev/other-code-conventions.md b/docs/dev/other-code-conventions.md deleted file mode 100644 index 21d8a6f0a..000000000 --- a/docs/dev/other-code-conventions.md +++ /dev/null @@ -1,15 +0,0 @@ -# Other Code Conventions - -While we are mainly programming in C++, we do use other programming languages -when appropriate. This chapter describes conventions for such code. - -## Python - -Code written in Python should adhere to -[PEP 8](https://www.python.org/dev/peps/pep-0008/). You should run `flake8` on -your code to automatically check compliance. - -## Common Lisp - -Code written in Common Lisp should adhere to -[Google Common Lisp Style](https://google.github.io/styleguide/lispguide.xml). diff --git a/docs/dev/query/.gitignore b/docs/dev/query/.gitignore deleted file mode 100644 index 5ccff1a6b..000000000 --- a/docs/dev/query/.gitignore +++ /dev/null @@ -1 +0,0 @@ -html/ diff --git a/docs/dev/query/contents.md b/docs/dev/query/contents.md deleted file mode 100644 index ad5a8cb0b..000000000 --- a/docs/dev/query/contents.md +++ /dev/null @@ -1,34 +0,0 @@ -# Query Parsing, Planning and Execution - -This part of the documentation deals with query execution. - -Memgraph currently supports only query interpretation. Each new query is -parsed, analysed and translated into a sequence of operations which are then -executed on the main database storage. Query execution is organized into the -following phases: - - 1. [Lexical Analysis (Tokenization)](parsing.md) - 2. [Syntactic Analysis (Parsing)](parsing.md) - 3. [Semantic Analysis and Symbol Generation](semantic.md) - 4. [Logical Planning](planning.md) - 5. [Logical Plan Execution](execution.md) - -The main entry point is `Interpreter::operator()`, which takes a query text -string and produces a `Results` object. To instantiate the object, -`Interpreter` needs to perform the above steps from 1 to 4. If any of the -steps fail, a `QueryException` is thrown. The complete `LogicalPlan` is -wrapped into a `CachedPlan` and stored for reuse. This way we can skip the -whole process of analysing a query if it appears to be the same as before. - -When we have valid plan, the client code can invoke `Results::PullAll` with a -stream object. The `Results` instance will then execute the plan and fill the -stream with the obtained results. - -Since we want to optionally run Memgraph as a distributed database, we have -hooks for creating a different plan of logical operators. -`DistributedInterpreter` inherits from `Interpreter` and overrides -`MakeLogicalPlan` method. This method needs to return a concrete instance of -`LogicalPlan`, and in case of distributed database that will be -`DistributedLogicalPlan`. - -![Intepreter Class Diagram](interpreter-class.png) diff --git a/docs/dev/query/execution.md b/docs/dev/query/execution.md deleted file mode 100644 index 675bf5010..000000000 --- a/docs/dev/query/execution.md +++ /dev/null @@ -1,373 +0,0 @@ -# Logical Plan Execution - -We implement classical iterator style operators. Logical operators define -operations on database. They encapsulate the following info: what the input is -(another `LogicalOperator`), what to do with the data, and how to do it. - -Currently logical operators can have zero or more input operations, and thus a -`LogicalOperator` tree is formed. Most `LogicalOperator` types have only one -input, so we are mostly working with chains instead of full fledged trees. -You can find information on each operator in `src/query/plan/operator.lcp`. - -## Cursor - -Logical operators do not perform database work themselves. Instead they create -`Cursor` objects that do the actual work, based on the info in the operator. -Cursors expose a `Pull` method that gets called by the cursor's consumer. The -consumer keeps pulling as long as the `Pull` returns `true` (indicating it -successfully performed some work and might be eligible for another `Pull`). -Most cursors will call the `Pull` function of their input provided cursor, so -typically a cursor chain is created that is analogue to the logical operator -chain it's created from. - -## Frame - -The `Frame` object contains all the data of the current `Pull` chain. It -serves for communicating data between cursors. - -For example, in a `MATCH (n) RETURN n` query the `ScanAllCursor` places a -vertex on the `Frame` for each `Pull`. It places it on the place reserved for -the `n` symbol. Then the `ProduceCursor` can take that same value from the -`Frame` because it knows the appropriate symbol. `Frame` positions are indexed -by `Symbol` objects. - -## ExpressionEvaluator - -Expressions results are not placed on the `Frame` since they do not need to be -communicated between different `Cursors`. Instead, expressions are evaluated -using an instance of `ExpressionEvaluator`. Since generally speaking an -expression can be defined by a tree of subexpressions, the -`ExpressionEvaluator` is implemented as a tree visitor. There is a performance -sub-optimality here because a stack is used to communicate intermediary -expression results between elements of the tree. This is one of the reasons -why it's planned to use `Frame` for intermediary expression results as well. -The other reason is that it might facilitate compilation later on. - -## Cypher Execution Semantics - -Cypher query execution has *mostly* well-defined semantics. Some are -explicitly defined by openCypher and its TCK, while others are implicitly -defined by Neo4j's implementation of Cypher that we want to be generally -compatible with. - -These semantics can in short be described as follows: a Cypher query consists -of multiple clauses some of which modify it. Generally, every clause in the -query, when reading it left to right, operates on a consistent state of the -property graph, untouched by subsequent clauses. This means that a `MATCH` -clause in the beginning operates on a graph-state in which modifications by -the subsequent `SET` are not visible. - -The stated semantics feel very natural to the end-user, and Neo seems to -implement them well. For Memgraph the situation is complex because -`LogicalOperator` execution (through a `Cursor`) happens one `Pull` at a time -(generally meaning all the query clauses get executed for every top-level -`Pull`). This is not inherently consistent with Cypher semantics because a -`SET` clause can modify data, and the `MATCH` clause that precedes it might -see the modification in a subsequent `Pull`. Also, the `RETURN` clause might -want to stream results to the user before all `SET` clauses have been -executed, so the user might see some intermediate graph state. There are many -edge-cases that Memgraph does its best to avoid to stay true to Cypher -semantics, while at the same time using a high-performance streaming approach. -The edge-cases are enumerated in this document along with the implementation -details they imply. - -## Implementation Peculiarities - -### Once - -An operator that does nothing but whose `Cursor::Pull` returns `true` on the -first `Pull` and `false` on subsequent ones. This operator is used when -another operator has an optional input, because in Cypher a clause will -typically execute once for every input from the preceding clauses, or just -once if there was no preceding input. For example, consider the `CREATE` -clause. In the query `CREATE (n)` only one node is created, while in the query -`MATCH (n) CREATE (m)` a node is created for each existing node. Thus in our -`CreateNode` logical operator the input is either a `ScanAll` operator, or a -`Once` operator. - -### storage::View - -In the previous section, [Cypher Execution -Semantics](#cypher-execution-semantics), we mentioned how the preceding -clauses should not see changes made in subsequent ones. For that reason, some -operators take a `storage::View` enum value. This value determines which state of -the graph an operator sees. - -Consider the query `MATCH (n)--(m) WHERE n.x = 0 SET m.x = 1`. Naive streaming -could match a vertex `n` on the given criteria, expand to `m`, update it's -property, and in the next iteration consider the vertex previously matched to -`m` and skip it because it's newly set property value does not qualify. This -is not how Cypher works. To handle this issue properly, Memgraph designed the -`VertexAccessor` class that tracks two versions of data: one that was visible -before the current transaction+command, and the optional other that was -created in the current transaction+command. The `MATCH` clause will be planned -as `ScanAll` and `Expand` operations using `storage::View::OLD` value. This -will ensure modifications performed in the same query do not affect it. The -same applies to edges and the `EdgeAccessor` class. - -### Existing Record Detection - -It's possible that a pattern element has already been declared in the same -pattern, or a preceding pattern. For example `MATCH (n)--(m), (n)--(l)` or a -cycle-detection match `MATCH (n)-->(n) RETURN n`. Implementation-wise, -existing record detection just checks that the expanded record is equal to the -one already on the frame. - -### Why Not Use Separate Expansion Ops for Edges and Vertices? - -Expanding an edge and a vertex in separate ops is not feasible when matching a -cycle in bi-directional expansions. Consider the query `MATCH (n)--(n) RETURN -n`. Let's try to expand first the edge in one op, and vertex in the next. The -vertex expansion consumes the edge expansion input. It takes the expanded edge -from the frame. It needs to detect a cycle by comparing the vertex existing on -the frame with one of the edge vertices (`from` or `to`). But which one? It -doesn't know, and can't ensure correct cycle detection. - -### Data Visibility During and After SET - -In Cypher, setting values always works on the latest version of data (from -preceding or current clause). That means that within a `SET` clause all the -changes from previous clauses must be visible, as well as changes done by the -current `SET` clause. Also, if there is a clause after `SET` it must see *all* -the changes performed by the preceding `SET`. Both these things are best -illustrated with the following queries executed on an empty database: - - CREATE (n:A {x:0})-[:EdgeType]->(m:B {x:0}) - MATCH (n)--(m) SET m.x = n.x + 1 RETURN labels(n), n.x, labels(m), m.x - -This returns: - -+---------+---+---------+---+ -|labels(n)|n.x|labels(m)|m.x| -+:=======:+:=:+:=======:+:=:+ -|[A] |2 |[B] |1 | -+---------+---+---------+---+ -|[B] |1 |[A] |2 | -+---------+---+---------+---+ - -The obtained result implies the following operations: - - 1. In the first iteration set the value of the `B.x` to 1 - 2. In the second iteration the we observe `B.x` with the value of 1 and set - `A.x` to 2 - 3. In `RETURN` we see all the changes made in both iterations - -To implement the desired behavior Memgraph utilizes two techniques. First is -the already mentioned tracking of two versions of data in vertex accessors. -Using this approach ensures that the second iteration in the example query -sees the data modification performed by the preceding iteration. The second -technique is the `Accumulate` operation that accumulates all the iterations -from the preceding logical op before passing them to the next logical op. In -the example query, `Accumulate` ensures that the results returned to the user -reflect changes performed in all iterations of the query (naive streaming -could stream results at the end of first iteration producing inconsistent -results). Note that `Accumulate` is demanding regarding memory and slows down -query execution. For that reason it should be used only when necessary, for -example it does not have to be used in a query that has `MATCH` and `SET` but -no `RETURN`. - -### Neo4j Inconsistency on Multiple SET Clauses - -Considering the preceding example it could be expected that when a query has -multiple `SET` clauses all the changes from those preceding one are visible. -This is not the case in Neo4j's implementation. Consider the following queries -executed on an empty database: - - CREATE (n:A {x:0})-[:EdgeType]->(m:B {x:0}) - MATCH (n)--(m) SET n.x = n.x + 1 SET m.x = m.x * 2 - RETURN labels(n), n.x, labels(m), m.x - -This returns: - -+---------+---+---------+---+ -|labels(n)|n.x|labels(m)|m.x| -+:=======:+:=:+:=======:+:=:+ -|[A] |2 |[B] |1 | -+---------+---+---------+---+ -|[B] |1 |[A] |2 | -+---------+---+---------+---+ - -If all the iterations of the first `SET` clause were executed before executing -the second, all the resulting values would be 2. This not being the case, we -conclude that Neo4j does not use a barrier-like mechanism between `SET` -clauses. It is Memgraph's current vision that this is inconsistent and we -plan to reduce Neo4j compliance in favour of operation consistency. - -### Double Deletion - -It's possible to match the same graph element multiple times in a single query -and delete it. Neo supports this, and so do we. The relevant implementation -detail is in the `GraphDbAccessor` class, where the record deletion functions -reside, and not in the logical plan execution. It comes down to checking if a -record has already been deleted in the current transaction+command and not -attempting to do it again (results in a crash). - -### Set + Delete Edge-case - -It's legal for a query to combine `SET` and `DELETE` clauses. Consider the -following queries executed on an empty database: - - - CREATE ()-[:T]->() - MATCH (n)--(m) SET n.x = 42 DETACH DELETE m - -Due to the `MATCH` being undirected the second pull will attempt to set data -on a deleted vertex. This is not a legal operation in Memgraph storage -implementation. For that reason the logical operator for `SET` must check if -the record it's trying to set something on has been deleted by the current -transaction+command. If so, the modification is not executed. - -### Deletion Accumulation - -Sometimes it's necessary to accumulate deletions of all the matches before -attempting to execute them. Consider this the following. Start with an empty -database and execute queries: - - CREATE ()-[:T]->()-[:T]->() - MATCH (a)-[r1]-(b)-[r2]-(c) DELETE r1, b, c - -Note that the `DELETE` clause attempts to delete node `c`, but it does not -detach it by deleting edge `r2`. However, due to undirected edge in the -`MATCH`, both edges get pulled and deleted. - -Currently Memgraph does not support this behavior, Neo does. There are a few -ways that we could do this. - - * Accumulate on deletion (that sucks because we have to keep track of - everything that gets returned after the deletion). - * Maybe we could stream through the deletion op, but defer actual deletion - until plan-execution end. - * Ignore this because it's very edgy (this is the currently selected option). - -### Aggregation Without Input - -It is necessary to define what aggregation ops return when they receive no -input. Following is a table that shows what Neo4j's Cypher implementation and -SQL produce. - - -+-------------+------------------------+---------------------+---------------------+------------------+ -| \ | 1. Cypher, no group-by | 2. Cypher, group-by | 3. SQL, no group-by | 4. SQL, group-by | -+=============+:======================:+:===================:+:===================:+:================:+ -| Count(\*) | 0 | \ | 0 | \ | -+-------------+------------------------+---------------------+---------------------+------------------+ -| Count(prop) | 0 | \ | 0 | \ | -+-------------+------------------------+---------------------+---------------------+------------------+ -| Sum | 0 | \ | NULL | \ | -+-------------+------------------------+---------------------+---------------------+------------------+ -| Avg | NULL | \ | NULL | \ | -+-------------+------------------------+---------------------+---------------------+------------------+ -| Min | NULL | \ | NULL | \ | -+-------------+------------------------+---------------------+---------------------+------------------+ -| Max | NULL | \ | NULL | \ | -+-------------+------------------------+---------------------+---------------------+------------------+ -| Collect | [] | \ | N/A | N/A | -+-------------+------------------------+---------------------+---------------------+------------------+ - -Where: - - 1. `MATCH (n) RETURN (n.prop)` - 2. `MATCH (n) RETURN (n.prop), (n.prop2)` - 3. `SELECT (prop) FROM Table` - 4. `SELECT (prop), prop2 FROM Table GROUP BY prop2` - -Neo's Cypher implementation diverges from SQL only when performing `SUM`. -Memgraph implements SQL-like behavior. It is considered that `SUM` of -arbitrary elements should not be implicitly 0, especially in a property graph -without a strict schema (the property in question can contain values of -arbitrary types, or no values at all). - -### OrderBy - -The `OrderBy` logical operator sorts the results in the desired order. It -occurs in Cypher as part of a `WITH` or `RETURN` clause. Both the concept and -the implementation are straightforward. It's necessary for the logical op to -`Pull` everything from its input so it can be sorted. It's not necessary to -keep the whole `Frame` state of each input, it is sufficient to keep a list of -`TypedValues` on which the results will be sorted, and another list of values -that need to be remembered and recreated on the `Frame` when yielding. - -The sorting itself is made to reflect that of Neo's implementation which comes -down to these points. - - * `Null` comes last (as if it's greater than anything). - * Primitive types compare naturally, with no implicit casting except from - `int` to `double`. - * Complex types are not comparable. - * Every unsupported comparison results in an exception that gets propagated - to the end user. - -### Limit in Write Queries - -`Limit` can be used as part of a write query, in which case it will *not* -reduce the amount of performed updates. For example, consider a database that -has 10 vertices. The query `MATCH (n) SET n.x = 1 RETURN n LIMIT 3` will -result in all vertices having their property value changed, while returning -only the first to the client. This makes sense from the implementation -standpoint, because `Accumulate` is planned after `SetProperty` but before -`Produce` and `Limit` operations. Note that this behavior can be -non-deterministic in some queries, since it relies on the order of iteration -over nodes which is undefined when not explicitly specified. - -### Merge - -`MERGE` in Cypher attempts to match a pattern. If it already exists, it does -nothing and subsequent clauses like `RETURN` can use the matched pattern -elements. If the pattern can't match to any data, it creates it. For detailed -information see Neo4j's [merge -documentation.](https://neo4j.com/docs/developer-manual/current/cypher/clauses/merge/) - -An important thing about `MERGE` is visibility of modified data. `MERGE` takes -an input (typically a `MATCH`) and has two additional *phases*: the merging -part, and the subsequent set parts (`ON MATCH SET` and `ON CREATE SET`). -Analysis of Neo4j's behavior indicates that each of these three phases (input, -merge, set) does not see changes to the graph state done by subsequent phase. -The input phase does not see data created by the merge phase, nor the set -phase. This is consistent with what seems like the general Cypher philosophy -that query clause effects aren't visible in the preceding clauses. - -We define the `Merge` logical operator as a *routing* operator that uses three -logical operator branches. - - 1. The input from a preceding clause. - - For example in `MATCH (n), (m) MERGE (n)-[:T]-(m)`. This input is - optional because `MERGE` is allowed to be the first clause in a query. - - 2. The `merge_match` branch. - - This logical operator branch is `Pull`-ed from until exhausted for each - successful `Pull` from the input branch. - - 3. The `merge_create` branch. - - This branch is `Pull`ed when the `merge_match` branch does not match - anything (no successful `Pull`s) for an input `Pull`. It is `Pull`ed only - once in such a situation, since only one creation needs to occur for a - failed match. - -The `ON MATCH SET` and `ON CREATE SET` parts of the `MERGE` clause are -included in the `merge_match` and `merge_create` branches respectively. They -are placed on the end of their branches so that they execute only when those -branches succeed. - -Memgraph strives to be consistent with Neo in its `MERGE` implementation, -while at the same time keeping performance as good as possible. Consistency -with Neo w.r.t. graph state visibility is not trivial. Documentation for -`Expand` and `Set` describe how Memgraph keeps track of both the updated -version of an edge/vertex and the old one, as it was before the current -transaction+command. This technique is also used in `Merge`. The input -phase/branch of `Merge` always looks at the old data. The merge phase needs to -see the new data so it doesn't create more data then necessary. - -For example, consider the query. - - MATCH (p:Person) MERGE (c:City {name: p.lives_in}) - -This query needs to create a city node only once for each unique `p.lives_in`. -Finally the set phase of a `MERGE` clause should not affect the merge phase. -To achieve this the `merge_match` branch of the `Merge` operator should see -the latest created nodes, but filter them on their old state (if those nodes -were not created by the `create_branch`). Implementation-wise that means that -`ScanAll` and `Expand` operators in the `merge_branch` need to look at the new -graph state, while `Filter` operators the old, if available. diff --git a/docs/dev/query/interpreter-class.dot b/docs/dev/query/interpreter-class.dot deleted file mode 100644 index 0b728ccf4..000000000 --- a/docs/dev/query/interpreter-class.dot +++ /dev/null @@ -1,23 +0,0 @@ -digraph interpreter { - node [fontname="dejavusansmono"] - edge [fontname="dejavusansmono"] - node [shape=record] - edge [dir=back,arrowtail=empty,arrowsize=1.5] - Interpreter [label="{\N|+ operator(query : string, ...) : Results\l| - # MakeLogicalPlan(...) : LogicalPlan\l| - - plan_cache_ : Map(QueryHash, CachedPlan)\l}"] - Interpreter -> DistributedInterpreter - Results [label="{\N|+ PullAll(stream) : void\l|- plan_ : CachedPlan\l}"] - Interpreter -> Results - [dir=forward,style=dashed,arrowhead=open,label="<>"] - CachedPlan -> Results - [dir=forward,arrowhead=odiamond,taillabel="1",headlabel="*"] - Interpreter -> CachedPlan [arrowtail=diamond,taillabel="1",headlabel="*"] - CachedPlan -> LogicalPlan [arrowtail=diamond] - LogicalPlan [label="{\N|+ GetRoot() : LogicalOperator - \l+ GetCost() : double\l}"] - LogicalPlan -> SingleNodeLogicalPlan [style=dashed] - LogicalPlan -> DistributedLogicalPlan [style=dashed] - DistributedInterpreter -> DistributedLogicalPlan - [dir=forward,style=dashed,arrowhead=open,label="<>"] -} diff --git a/docs/dev/query/interpreter-class.png b/docs/dev/query/interpreter-class.png deleted file mode 100644 index b36d223f30343d0d30d296186b88b3375a21a5e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56219 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 ^$(?fJh_Lzt*qd%R?-+~9?sTrjkVe8 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

#^bkP#evqFGMc?h*SVl- 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 U-5ol2wU3_t2VC+e$^ZZW diff --git a/docs/dev/query/parsing.md b/docs/dev/query/parsing.md deleted file mode 100644 index 3db3c7f49..000000000 --- a/docs/dev/query/parsing.md +++ /dev/null @@ -1,62 +0,0 @@ -# Lexical and Syntactic Analysis - -## Antlr - -We use Antlr for lexical and syntax analysis of Cypher queries. Antrl uses -grammar file `Cypher.g4` downloaded from http://www.opencypher.org to generate -the parser and the visitor for the Cypher parse tree. Even though the provided -grammar is not very pleasant to work with we decided not to do any drastic -changes to it so that our transition to newly published versions of -`Cypher.g4` would be easier. Nevertheless, we had to fix some bugs and add -features, so our version is not completely the same. - -In addition to using `Cypher.g4`, we have `MemgraphCypher.g4`. This grammar -file defines Memgraph specific extensions to the original grammar. Most -notable example is the inclusion of syntax for handling authorization. At the -moment, some extensions are also found in `Cypher.g4`. For example, the syntax -for using a lambda function in relationship patterns. These extensions should -be moved out of `Cypher.g4`, so that it remains as close to the original -grammar as possible. Additionally, having `MemgraphCypher.g4` may not be -enough if we wish to split the functionality for community and enterprise -editions of Memgraph. - -## Abstract Syntax Tree (AST) - -Since Antlr generated visitor and the official openCypher grammar are not very -practical to use, we translate the Antlr's AST to our own AST. Currently there -are ~40 types of nodes in our AST. Their definitions can be found in -`src/query/frontend/ast/ast.lcp`. - -Major groups of types can be found under the following base types. - - * `Expression` --- types corresponding to Cypher expressions. - * `Clause` --- types corresponding to Cypher clauses. - * `PatternAtom` --- node or edge related information. - * `Query` --- different kinds of queries, allows extending the language with - Memgraph specific query syntax. - -Memory management of created AST nodes is done with `AstStorage`. Each type -must be created by invoking `AstStorage::Create` method. This way all of the -pointers to nodes and their children are raw pointers. The only owner of -allocated memory is the `AstStorage`. When the storage goes out of scope, the -pointers become invalid. It may be more natural to handle tree ownership via -`unique_ptr`, i.e. each node owns its children. But there are some benefits to -having a custom storage and allocation scheme. - -The primary reason we opted for not using `unique_ptr` is the requirement of -Antlr's base visitor class that the resulting values must by copyable. The -result is wrapped in `antlr::Any` so that the derived visitor classes may -return any type they wish when visiting Antlr's AST. Unfortunately, -`antlr::Any` does not work with non-copyable types. - -Another benefit of having `AstStorage` is that we can easily add a different -allocation scheme for AST nodes. The interface of node creation would not -change. - -### AST Translation - -The translation process is done via `CypherMainVisitor` class, which is -derived from Antlr generated visitor. Besides instancing our AST types, a -minimal number of syntactic checks are done on a query. These checks handle -the cases which were valid in original openCypher grammar, but may be invalid -when combined with other syntax elements. diff --git a/docs/dev/query/planning.md b/docs/dev/query/planning.md deleted file mode 100644 index a44678112..000000000 --- a/docs/dev/query/planning.md +++ /dev/null @@ -1,526 +0,0 @@ -# Logical Planning - -After the semantic analysis and symbol generation, the AST is converted to a -tree of logical operators. This conversion is called *planning* and the tree -of logical operators is called a *plan*. The whole planning process is done in -the following steps. - - 1. [AST Preprocessing](#ast-preprocessing) - - The first step is to preprocess the AST by collecting - information on filters, divide the query into parts, normalize patterns - in `MATCH` clauses, etc. - - 2. [Logical Operator Planning](#logical-operator-planning) - - After the preprocess step, the planning can be done via 2 planners: - `VariableStartPlanner` and `RuleBasedPlanner`. The first planner will - generate multiple plans where each plan has different starting points for - searching the patterns in `MATCH` clauses. The second planner produces a - single plan by mapping the query parts as they are to logical operators. - - 3. [Logical Plan Postprocessing](#logical-plan-postprocessing) - - In this stage, we perform various transformations on the generated logical - plan. Here we want to optimize the operations in order to improve - performance during the execution. Naturally, transformations need to - preserve the semantic behaviour of the original plan. - - 4. [Cost Estimation](#cost-estimation) - - After the generation, the execution cost of each plan is estimated. This - estimation is used to select the best plan which will be executed. - -The implementation can be found in the `query/plan` directory, with the public -entry point being `query/plan/planner.hpp`. - -## AST Preprocessing - -Each openCypher query consists of at least 1 **single query**. Multiple single -queries are chained together using a **query combinator**. Currently, there is -only one combinator, `UNION`. The preprocessing step starts in the -`CollectQueryParts` function. This function will take a look at each single -query and divide it into parts. Each part is separated with `RETURN` and -`WITH` clauses. For example: - - MATCH (n) CREATE (m) WITH m MATCH (l)-[]-(m) RETURN l - | | | - |------- part 1 -----------+-------- part 2 --------| - | | - |-------------------- single query -----------------| - -Each part is created by collecting all `MATCH` clauses and *normalizing* their -patterns. Pattern normalization is the process of converting an arbitrarily -long pattern chain of nodes and edges into a list of triplets `(start node, -edge, end node)`. The triplets should preserve the semantics of the match. For -example: - - MATCH (a)-[p]-(b)-[q]-(c)-[r]-(d) - -is equivalent to: - - MATCH (a)-[p]-(b), (b)-[q]-(c), (c)-[r]-(d) - -With this representation, it becomes easier to reorder the triplets and choose -different strategies for pattern matching. - -In addition to normalizing patterns, all of the filter expressions in patterns -and inside of the `WHERE` clause (of the accompanying `MATCH`) are extracted -and stored separately. During the extraction, symbols used in the filter -expression are collected. This allows for planning filters in a valid order, -as the matching for triplets is being done. Another important benefit of -having extra information on filters, is to recognize when a database index -could be used. - -After each `MATCH` is processed, they are all grouped, so that even the whole -`MATCH` clauses may be reordered. The important thing is to remember which -symbols were used to name edges in each `MATCH`. With those symbols we can -plan for *cyphermorphism*, i.e. ensure different edges in the search pattern -of a single `MATCH` map to different edges in the graph. This preserves the -semantic of the query, even though we may have reordered the matching. The -same steps are done for `OPTIONAL MATCH`. - -Another clause which needs processing is `MERGE`. Here we normalize the -pattern, since the `MERGE` is a bit like `MATCH` and `CREATE` in one. - -All the other clauses are left as is. - -In the end, each query part consists of: - - * processed and grouped `MATCH` clauses; - * processed and grouped `OPTIONAL MATCH` clauses; - * processed `MERGE` matching pattern and - * unchanged remaining clauses. - -The last stored clause is guaranteed to be either `WITH` or `RETURN`. - -## Logical Operator Planning - -### Variable Start Planner - -The `VariableStartPlanner` generates multiple plans for a single query. Each -plan is generated by selecting a different starting point for pattern -matching. - -The algorithm works as follows. - - 1. For each query part: - 1. For each node in triplets of collected `MATCH` clauses: - i. Add the node to a set of `expanded` nodes - ii. Select a triplet `(start node, edge, end node)` whose `start node` is - in the `expanded` set - iii. If no triplet was selected, choose a new starting node that isn't in - `expanded` and continue expanding - iv. Repeat steps ii. -- iii. until all triplets have been selected - and store that as a variation of the `MATCH` clauses - 2. Do step 1.1. for `OPTIONAL MATCH` and `MERGE` clauses - 3. Take all combinations of the generated `MATCH`, `OPTIONAL MATCH` and - `MERGE` and store them as variations of the query part. - 2. For each combination of query part variations: - 1. Generate a plan using the rule based planner - -### Rule Based Planner - -The `RuleBasedPlanner` generates a single plan for a single query. A plan is -generated by following hardcoded rules for producing logical operators. The -following sections are an overview on how each openCypher clause is converted -to a `LogicalOperator`. - -#### MATCH - -`MATCH` clause is used to specify which patterns need to be searched for in -the database. These patterns are normalized in the preprocess step to be -represented as triplets `(start node, edge, end node)`. When there is no edge, -then the triplet is reduced only to the `start node`. Generating the operators -is done by looping over these triplets. - -##### Searching for Nodes - -The simplest search is finding standalone nodes. For example, `MATCH (n)` -will find all the nodes in the graph. This is accomplished by generating a -`ScanAll` operator and forwarding the node symbol which should store the -results. In this case, all the nodes will be referenced by `n`. - -Multiple nodes can be specified in a single match, e.g. `MATCH (n), (m)`. -Planning is done by repeating the same steps for each sub pattern (separated -by a comma). In this case, we would get 2 `ScanAll` operators chained one -after the other. An optimization can be obtained if the node in the pattern is -already searched for. In `MATCH (n), (n)` we can drop the second `ScanAll` -operator since we have already generated it for the first node. - -##### Searching for Relationships - -A more advanced search includes finding nodes with relationships. For example, -`MATCH (n)-[r]-(m)` should find every pair of connected nodes in the database. -This means, that if a single node has multiple connections, it will be -repeated for each combination of pairs. The generation of operators starts -from the first node in the pattern. If we are referencing a new starting node, -we need to generate a `ScanAll` which finds all the nodes and stores them -into `n`. Then, we generate an `Expand` operator which reads the `n` and -traverses all the edges of that node. The edge is stored into `r`, while the -destination node is stored in `m`. - -Matching multiple relationships proceeds similarly, by repeating the same -steps. The only difference is that we need to ensure different edges in the -search pattern, map to different edges in the graph. This means that after each -`Expand` operator, we need to generate an `EdgeUniquenessFilter`. We provide -this operator with a list of symbols for the previously matched edges and the -symbol for the current edge. - -For example. - - MATCH (n)-[r1]-(m)-[r2]-(l) - -The above is preprocessed into - - MATCH (n)-[r1]-(m), (m)-[r2]-(l) - -Then we look at each triplet in order and perform the described steps. This -way, we would generate: - - ScanAll (n) > Expand (n, r1, m) > Expand (m, r2, l) > - EdgeUniquenessFilter ([r1], r2) - -Note that we don't need to make `EdgeUniquenessFilter` after the first -`Expand`, since there are no edges to compare to. This filtering needs to work -across multiple pattern, but inside a *single* `MATCH` clause. - -Let's take a look at the following. - - MATCH (n)-[r1]-(m), (m)-[r2]-(l) - -We would also generate the exact same operators. - - ScanAll (n) > Expand (n, r1, m) > Expand (m, r2, l) > - EdgeUniquenessFilter ([r1], r2) - -On the other hand, - - MATCH (n)-[r1]-(m) MATCH (m)-[r2]-(l)-[r3]-(i) - -would reset the uniqueness filtering at the start of the second match. This -would mean that we output the following: - - ScanAll (n) > Expand (n, r1, m) > Expand (m, r2, l) > Expand (l, r3, i) > - EdgeUniquenessFilter ([r2], r3) - -There is a difference in how we handle edge uniqueness compared to Neo4j. -Neo4j does not allow searching for a single edge multiple times, but we've -decided to support that. - -For example, the user can say the following. - - MATCH (n)-[r]-(m)-[r]-l - -We would ensure that both `r` variables match to the same edge. In our -terminology, we call this the *edge cycle*. For the above example, we would -generate this plan. - - ScanAll (n) > Expand (n, r, m) > Expand (m, r, l) - -We do not put an `EdgeUniquenessFilter` operator between 2 `Expand` -operators and we tell the 2nd `Expand` that it is an edge cycle. This, 2nd -`Expand` will ensure we have matched both the same edges. - -##### Filtering - -To narrow the search down, the patterns in `MATCH` can have filtered labels -and properties. A more general filtering is done using the accompanying -`WHERE` clause. During the preprocess step, all filters are collected and -extracted into expressions. Additional information on which symbols are used -is also stored. This way, each time we generate a `ScanAll` or `Expand`, we -look at all the filters to see if any of them can be used. I.e. if the symbols -they use have been bound by a newly produced operator. If a filter expression -can be used, we immediately add a `Filter` operator with that expression. - -For example. - - MATCH (n)-[r]-(m :label) WHERE n.prop = 42 - -We would produce: - - ScanAll (n) > Filter (n.prop) > Expand (n, r, m) > Filter (m :label) - -This means that the same plan is generated for the query: - - MATCH (n {prop: 42})-[r]-(m :label) - -#### OPTIONAL - -If a `MATCH` clause is preceded by `OPTIONAL`, then we need to generate a plan -such that we produce results even if we fail to match anything. This is -accomplished by generating an `Optional` operator, which takes 2 operator -trees: - - * input operation and - * optional operation. - -The input is the operation we generated for the part of the query before -`OPTIONAL MATCH`. For the optional operation, we simply generate the `OPTIONAL -MATCH` part just like we would for regular `MATCH`. In addition to operations, -we need to send the symbols which are set during optional matching to the -`Optional` operator. The operator will reset values of those symbols to -`null`, when the optional part fails to match. - -#### RETURN & WITH - -`RETURN` and `WITH` clauses are very similar to each other. The only -difference is that `WITH` separates parts of the query and can be paired with -`WHERE` clause. - -The common part is generating operators for the body of the clause. Separation -of query parts is mostly done in semantic analysis, which checks that only the -symbols exposed through `WITH` are visible in the query parts after the -clause. The minor part is done in planning. - -##### Named Results - -Both clauses contain multiple named expressions (`expr AS name`) which are -used to generate `Produce` operator. - -##### Aggregations - -If an expression contains an aggregation operator (`sum`, `avg`, ...) we need -to plan the `Aggregate` operator as input to `Produce`. This case is more -complex, because aggregation in openCypher can perform implicit grouping of -results used for aggregation. - -For example, `WITH/RETURN sum(n.x) AS s, n.y AS group` will implicitly group -by `n.y` expression. - -Another, obscure grouping can be achieved with `RETURN sum(n.a) + n.b AS s`. -Here, the `n.b` will be used for grouping, even though both the `sum` and -`n.b` are in the same named expression. - -Therefore, we need to collect all expressions which do not contain -aggregations and use them for grouping. You may have noticed that in the last -example `sum` is actually a sub-expression of `+`. `Aggregate` operator does -not see that (nor it should), so the responsibility of evaluating that falls -on `Produce`. One way is for `Aggregate` to store results of grouping -expressions on the frame in addition to aggregation results. Unfortunately, -this would require rewiring named expressions in `Produce` to reference -already evaluated expressions. In the current implementation, we opted for -`Aggregate` to store only aggregation results on the frame, while `Produce` -will re-evaluate all the other (grouping) expressions. To handle that, symbols -which are used in expressions are passed to `Aggregate`, so that they can be -remembered. `Produce` will read those symbols from the frame and use it to -re-evaluate the needed expressions. - -##### Accumulation - -After we have `Produce` and potentially `Aggregate`, we need to handle a -special case when the part of the query before `RETURN` or `WITH` performs -updates. For that, we want to run that part of the query fully, so that we get -the latest results. This is accomplished by adding `Accumulate` operator as -input to `Aggregate` or `Produce` (if there is no aggregation). Accumulation -will store all the values for all the used symbols inside `RETURN` and `WITH`, -so that they can be used in the operator which follows. This way, only parts -of the frame are copied, instead of the whole frame. Here is a minor -difference between planning `WITH`, compared to `RETURN`. Since `WITH` can -separate writing from reading, we need to advance the transaction command. -This enables the later, read parts of the query to obtain the newest changes. -This is supported by passing `advance_command` flag to `Accumulate` operator. - -In the simplest case, common to both clauses, we have `Accumulate > Aggregate -> Produce` operators, where `Accumulate` and `Aggregate` may be left out. - -##### Ordering - -Planning `ORDER BY` is simple enough. Since it may see new symbols (filled in -`Produce`), we add the `OrderBy` operator at the end. The operator will change -the order of produced results, so we pass it the ordering expressions and the -output symbols of named expressions. - -##### Filtering - -A final difference in `WITH`, is when it contains a `WHERE` clause. For that, -we simply generate the `Filter` operator, appended after `Produce` or -`OrderBy` (depending which operator is last). - -##### Skipping and Limiting - -If we have `SKIP` or `LIMIT`, we generate `Skip` or `Limit` operators, -respectively. These operators are put at the end of the clause. - -This placement may have some unexpected behaviour when combined with -operations that update the graph. For example. - - MATCH (n) SET n.x = n.x + 1 RETURN n LIMIT 1 - -The above query may be interpreted as if the `SET` will be done only once. -Since this is a write query, we need to accumulate results, so the part before -`RETURN` will execute completely. The accumulated results will be yielded up -to the given limit, and the user would get only the first `n` that was -updated. This may confuse the user because in reality, every node in the -database had been updated. - -Note that `Skip` always comes before `Limit`. In the current implementation, -they are generated directly one after the other. - -#### CREATE - -`CREATE` clause is used to create nodes and edges (relationships). - -For multiple `CREATE` clauses or multiple creation patterns in a single -clause, we perform the same, following steps. - -##### Creating a Single Node - -A node is created by simply specifying a node pattern. - -For example `CREATE (n :label {property: "value"}), ()` would create 2 nodes. -The 1st one would be created with a label and a property. This node could be -referenced later in the query, by using the variable `n`. The 2nd node cannot -be referenced and it would be created without any labels nor properties. For -node creation, we generate a `CreateNode` operator and pass it all the details -of node creation: variable symbol, labels and properties. In the mentioned -example, we would have `CreateNode > CreateNode`. - -##### Creating a Relationship - -To create a relationship, the `CREATE` clause must contain a pattern with a -directed edge. Compared to creating a single node, this case is a bit more -complicated, because either side of the edge may not exist. By exist, we mean -that the endpoint is a variable which already references a node. - -For example, `MATCH (n) CREATE (n)-[r]->(m)` would create an edge `r` and a -node `m` for each matched node `n`. If we focus on the `CREATE` part, we -generate `CreateExpand (n, r, m)` where `n` already exists (refers to matched -node) and `m` would be newly created along with edge `r`. If we had only -`CREATE (n)-[r]->(m)`, then we would need to create both nodes of the edge -`r`. This is done by generating `CreateNode (n) > CreateExpand(n, r, m)`. The -final case is when both endpoints refer to an existing node. For example, when -adding a node with a cyclical connection `CREATE (n)-[r]->(n)`. In this case, -we would generate `CreateNode (n) > CreateExpand (n, r, n)`. We would tell -`CreateExpand` to only create the edge `r` between the already created `n`. - -#### MERGE - -Although the merge operation is complex, planning turns out to be relatively -simple. The pattern inside the `MERGE` clause is used for both matching and -creating. Therefore, we create 2 operator trees, one for each action. - -For example. - - MERGE (n)-[r:r]-(m) - -We would generate a single `Merge` operator which has the following. - - * No input operation (since it is not preceded by any other clause). - - * On match operation - - `ScanAll (n) > Expand (n, r, m) > Filter (r)` - - * On create operation - - `CreateNode (n) > CreateExpand (n, r, m)` - -In cases when `MERGE` contains `ON MATCH` and `ON CREATE` parts, we simply -append their operations to the respective operator trees. - -Observe the following example. - - MERGE (n)-[r:r]-(m) ON MATCH SET n.x = 42 ON CREATE SET m :label - -The `Merge` would be generated with the following. - - * No input operation (again, since there is no clause preceding it). - - * On match operation - - `ScanAll (n) > Expand (n, r, m) > Filter (r) > SetProperty (n.x, 42)` - - * On create operation - - `CreateNode (n) > CreateExpand (n, r, m) > SetLabels (n, :label)` - -When we have preceding clauses, we simply put their operator as input to -`Merge`. - - MATCH (n) MERGE (n)-[r:r]-(m) - -The above would be generated as - - ScanAll (n) > Merge (on_match_operation, on_create_operation) - -Here we need to be careful to recognize which symbols are already declared. -But, since the `on_match_operation` uses the same algorithm for generating a -`Match`, that problem is handled there. The same should hold for -`on_create_operation`, which uses the process of generating a `Create`. So, -finally for this example, the `Merge` would have: - - * Input operation - - `ScanAll (n)` - - * On match operation - - `Expand (n, r, m) > Filter (r)` - - Note that `ScanAll` is not needed since we get the nodes from input. - - * On create operation - - `CreateExpand (n, r, m)` - - Note that `CreateNode` is dropped, since we want to expand the existing one. - -## Logical Plan Postprocessing - -Postprocessing of a logical plan is done by rewriting the original plan into -a more efficient one while preserving the original semantic of operations. -The rewriters are found in `query/plan/rewrite` directory, and currently we -only have one -- `IndexLookupRewriter`. - -### IndexLookupRewriter - -The job of this rewriter is to merge `Filter` and `ScanAll` operations into -equivalent `ScanAllBy` operations. In almost all cases using indexed -lookup will be faster than regular lookup, so `IndexLookupRewriter` simply -does the transformations whenever possible. The simplest case being the -following, assuming we have an index over `id`. - - * Original Plan - - `ScanAll (n) > Filter (id(n) == 42) > Produce (n)` - - * Rewritten Plan - - `ScanAllById (n, id=42) > Produce (n)` - -Naturally, there are some cases we need to be careful about. - - 1. Operators with Multiple Branches - - Here we may not carry `Filter` operations outside of the operator into - its branches, so the branches are rewritten as stand alone plans with a - branch new `IndexLookupRewriter`. Some of the operators with multiple - branches are `Merge`, `Optional`, `Cartesian` and `Union`. - - 2. Expand Operators - - Expand operations aren't that tricky to handle, but they have a special - case where we want to use an indexed lookup of the destination so that the - expansion is performed between known nodes. This decision may depend on - various parameters which may need further tweaking as we encounter more - use-cases of Cypher queries. - -## Cost Estimation - -Cost estimation is the final step of processing a logical plan. The -implementation can be found in `query/plan/cost_estimator.hpp`. We give each -operator a cost based on the estimated cardinality of results of that operator -and on the preset coefficient of the runtime performance of that operator. - -This scheme is rather simple and works quite well, but there are couple of -improvements we may want to do at some point. - - * Track more information about the stored graph and use that to improve the - estimates. - * Do a quick, partial run of the plan and tweak the estimation based on how - much each operator produced results. This may require us having some kind - of representative subset of the stored graph. - * Write micro benchmarks for each operator and based on the results create - sensible preset coefficients. This would replace the current coefficients - which are just assumptions on how each operator implementation performs. diff --git a/docs/dev/query/semantic.md b/docs/dev/query/semantic.md deleted file mode 100644 index ff10cbb5e..000000000 --- a/docs/dev/query/semantic.md +++ /dev/null @@ -1,134 +0,0 @@ -# Semantic Analysis and Symbol Generation - -In this phase, various semantic and variable type checks are performed. -Additionally, we generate symbols which map AST nodes to stored values -computed from evaluated expressions. - -## Symbol Generation - -Implementation can be found in `query/frontend/semantic/symbol_generator.cpp`. - -Symbols are generated for each AST node that represents data that needs to -have storage. Currently, these are: - - * `NamedExpression` - * `CypherUnion` - * `Identifier` - * `Aggregation` - -You may notice that the above AST nodes may not correspond to something named -by a user. For example, `Aggregation` can be a part of larger expression and -thus remain unnamed. The reason we still generate symbols is to have a uniform -behaviour when executing a query as well as allow for caching the results of -expression evaluation. - -AST nodes do not actually store a `Symbol` instance, instead they have a -`int32_t` index identifying the symbol in the `SymbolTable` class. This is -done to minimize the size of AST types as well as allow easier sharing of same -symbols with multiple instances of AST nodes. - -The storage for evaluated data is represented by the `Frame` class. Each -symbol determines a unique position in the frame. During interpretation, -evaluation of expressions which have a symbol will either read or store values -in the frame. For example, instance of an `Identifier` will use the symbol to -find and read the value from `Frame`. On the other hand, `NamedExpression` -will take the result of evaluating its own expression and store it in the -`Frame`. - -When a symbol is created, context of creation is used to assign a type to that -symbol. This type is used for simple type checking operations. For example, -`MATCH (n)` will create a symbol for variable `n`. Since the `MATCH (n)` -represents finding a vertex in the graph, we can set `Symbol::Type::Vertex` -for that symbol. Later, for example in `MATCH ()-[n]-()` we see that variable -`n` is used as an edge. Since we already have a symbol for that variable, we -detect this type mismatch and raise a `SemanticException`. - -Basic rule of symbol generation, is that variables inside `MATCH`, `CREATE`, -`MERGE`, `WITH ... AS` and `RETURN ... AS` clauses establish new symbols. - -### Symbols in Patterns - -Inside `MATCH`, symbols are created only if they didn't exist before. For -example, patterns in `MATCH (n {a: 5})--(m {b: 5}) RETURN n, m` will create 2 -symbols: one for `n` and one for `m`. `RETURN` clause will, in turn, reference -those symbols. Symbols established in a part of pattern are immediately bound -and visible in later parts. For example, `MATCH (n)--(n)` will create a symbol -for variable `n` for 1st `(n)`. That symbol is referenced in 2nd `(n)`. Note -that the symbol is not bound inside 1st `(n)` itself. What this means is that, -for example, `MATCH (n {a: n.b})` should raise an error, because `n` is not -yet bound when encountering `n.b`. On the other hand, -`MATCH (n)--(n {a: n.b})` is fine. - -The `CREATE` is similar to `MATCH`, but it *always* establishes symbols for -variables which create graph elements. What this means is that, for example -`MATCH (n) CREATE (n)` is not allowed. `CREATE` wants to create a new node, -for which we already have a symbol. In such a case, we need to throw an error -that the variable `n` is being redeclared. On the other hand `MATCH (n) CREATE -(n)-[r :r]->(n)` is fine, because `CREATE` will only create the edge `r`, -connecting the already existing node `n`. Remaining behaviour is the same as -in `MATCH`. This means that we can simplify `CREATE` to be like `MATCH` with 2 -special cases. - - 1. Are we creating a node, i.e. `CREATE (n)`? If yes, then the symbol for - `n` must not have been created before. Otherwise, we reference the - existing symbol. - 2. Are we creating an edge, i.e. we encounter a variable for an edge inside - `CREATE`? If yes, then that variable must not reference a symbol. - -The `MERGE` clause is treated the same as `CREATE` with regards to symbol -generation. The only difference is that we allow bidirectional edges in the -pattern. When creating such a pattern, the direction of the created edge is -arbitrarily determined. - -### Symbols in WITH and RETURN - -In addition to patterns, new symbols are established in the `WITH` clause. -This clause makes the new symbols visible *only* to the rest of the query. -For example, `MATCH (old) WITH old AS new RETURN new, old` should raise an -error that `old` is unbound inside `RETURN`. - -There is a special case with symbol visibility in `WHERE` and `ORDER BY`. They -need to see both the old and the new symbols. Therefore `MATCH (old) RETURN -old AS new ORDER BY old.prop` needs to work. On the other hand, if we perform -aggregations inside `WITH` or `RETURN`, then the old symbols should not be -visible neither in `WHERE` nor in `ORDER BY`. Since the aggregation has to go -through all the results in order to generate the final value, it makes no -sense to store old symbols and their values. A query like `MATCH (old) WITH -SUM(old.prop) AS sum WHERE old.prop = 42 RETURN sum` needs to raise an error -that `old` is unbound inside `WHERE`. - -For cases when `SKIP` and `LIMIT` appear, we disallow any identifiers from -appearing in their expressions. Basically, `SKIP` and `LIMIT` can only be -constant expressions[^1]. For example, `MATCH (old) RETURN old AS new SKIP -new.prop` needs to raise that variables are not allowed in `SKIP`. It makes no -sense to allow variables, since their values may vary on each iteration. On -the other hand, we could support variables to constant expressions, but for -simplicity we do not. For example, `MATCH (old) RETURN old, 2 AS limit_var -LIMIT limit_var` would still throw an error. - -Finally, we generate symbols for names created in `RETURN` clause. These -symbols are used for the final results of a query. - -NOTE: New symbols in `WITH` and `RETURN` should be unique. This means that -`WITH a AS same, b AS same` is not allowed, neither is a construct like -`RETURN 2, 2` - -### Symbols in Functions which Establish New Scope - -Symbols can also be created in some functions. These functions usually take an -expression, bind a single variable and run the expression inside the newly -established scope. - -The `all` function takes a list, creates a variable for list element and runs -the predicate expression. For example: - - MATCH (n) RETURN n, all(n IN n.prop_list WHERE n < 42) - -We create a new symbol for use inside `all`, this means that the `WHERE n < -42` uses the `n` which takes values from a `n.prop_list` elements. The -original `n` bound by `MATCH` is not visible inside the `all` function, but it -is visible outside. Therefore, the `RETURN n` and `n.prop_list` reference the -`n` from `MATCH`. - -[^1]: Constant expressions are expressions for which the result can be - computed at compile time. diff --git a/docs/dev/quick-start.md b/docs/dev/quick-start.md deleted file mode 100644 index 1b578fec7..000000000 --- a/docs/dev/quick-start.md +++ /dev/null @@ -1,107 +0,0 @@ -# Quick Start - -A short chapter on downloading the Memgraph source, compiling and running. - -## Obtaining the Source Code - -Memgraph uses `git` for source version control. You will need to install `git` -on your machine before you can download the source code. - -On Debian systems, you can do it inside a terminal with the following -command: - - apt install git - -After installing `git`, you are now ready to fetch your own copy of Memgraph -source code. Run the following command: - - git clone https://github.com/memgraph/memgraph.git - -The above will create a `memgraph` directory and put all source code there. - -## Compiling Memgraph - -With the source code, you are now ready to compile Memgraph. Well... Not -quite. You'll need to download Memgraph's dependencies first. - -In your terminal, position yourself in the obtained memgraph directory. - - cd memgraph - -### Installing Dependencies - -Dependencies that are required by the codebase should be checked by running the -`init` script: - - ./init - -If the script fails, dependencies installation scripts could be found under -`environment/os/`. The directory contains dependencies management script for -each supported operating system. E.g. if your system is **Debian 10**, run the -following to install all required build packages: - - ./environment/os/debian-10.sh install MEMGRAPH_BUILD_DEPS - -Once everything is installed, rerun the `init` script. - -Once the `init` script is successfully finished, issue the following commands: - - mkdir -p build - ./libs/setup.sh - -### Compiling - -Memgraph is compiled using our own custom toolchain that can be obtained from -the toolchain repository. You should read the `environment/README.txt` file -in the repository and install the apropriate toolchain for your distribution. -After you have installed the toolchain you should read the instructions for the -toolchain in the toolchain install directory (`/opt/toolchain-vXYZ/README.md`) -and install dependencies that are necessary to run the toolchain. - -When you want to compile Memgraph you should activate the toolchain using the -prepared toolchain activation script that is also described in the toolchain -`README`. - -NOTE: You **must** activate the toolchain every time you want to compile -Memgraph! - -You should now activate the toolchain in your console. - - source /opt/toolchain-vXYZ/activate - -With all of the dependencies installed and the build environment set-up, you -need to configure the build system. To do that, execute the following: - - cd build - cmake .. - -If everything went OK, you can now, finally, compile Memgraph. - - make -j$(nproc) - -### Running - -After the compilation verify that Memgraph works: - - ./memgraph --version - -To make extra sure, run the unit tests: - - ctest -R unit -j$(nproc) - -## Problems - -If you have any trouble running the above commands, contact your nearest -developer who successfully built Memgraph. Ask for help and insist on getting -this document updated with correct steps! - -## Next Steps - -Familiarise yourself with our code conventions and guidelines: - - * [C++ Code](cpp-code-conventions.md) - * [Other Code](other-code-conventions.md) - * [Code Review Guidelines](code-review.md) - -Take a look at the list of [required reading](required-reading.md) for -brushing up on technical skills. diff --git a/docs/dev/required-reading.md b/docs/dev/required-reading.md deleted file mode 100644 index 128360fac..000000000 --- a/docs/dev/required-reading.md +++ /dev/null @@ -1,129 +0,0 @@ -# Required Reading - -This chapter lists a few books that should be read by everyone working on -Memgraph. Since Memgraph is developed primarily with C++, Python and Common -Lisp, books are oriented around those languages. Of course, there are plenty -of general books which will help you improve your technical skills (such as -"The Pragmatic Programmer", "The Mythical Man-Month", etc.), but they are not -listed here. This way the list should be kept short and the *required* part in -"Required Reading" more easily honored. - -Some of these books you may find in our office, so feel free to pick them up. -If any are missing and you would like a physical copy, don't be afraid to -request the book for our office shelves. - -Besides reading, don't get stuck in a rut and be a -[Blub Programmer](http://www.paulgraham.com/avg.html). - -## Effective C++ by Scott Meyers - -Required for C++ developers. - -The book is a must-read as it explains most common gotchas of using C++. After -reading this book, you are good to write competent C++ which will pass code -reviews easily. - -## Effective Modern C++ by Scott Meyers - -Required for C++ developers. - -This is a continuation of the previous book, it covers updates to C++ which -came with C++11 and later. The book isn't as imperative as the previous one, -but it will make you aware of modern features we are using in our codebase. - -## Practical Common Lisp by Peter Siebel - -Required for Common Lisp developers. - -Free: http://www.gigamonkeys.com/book/ - -We use Common Lisp to generate C++ code and make our lives easier. -Unfortunately, not many developers are familiar with the language. This book -will make you familiar very quickly as it has tons of very practical -exercises. E.g. implementing unit testing library, serialization library and -bundling all that to create a mp3 music server. - -## Effective Python by Brett Slatkin - -(Almost) required reading for Python developers. - -Why the "almost"? Well, Python is relatively easy to pick up and you will -probably learn all the gotchas during code review from someone more -experienced. This makes the book less necessary for a newcomer to Memgraph, -but the book is not advanced enough to delegate it to -[Advanced Reading](#advanced-reading). The book is written in similar vein as -the "Effective C++" ones and will make you familiar with nifty Python features -that make everyone's lives easier. - -# Advanced Reading - -The books listed below are not required reading, but you may want to read them -at some point when you feel comfortable enough. - -## Design Patterns by Gamma et. al. - -Recommended for C++ developers. - -This book is highly divisive because it introduced a culture centered around -design patterns. The main issues is overuse of patterns which complicates the -code. This has made many Java programs to serve as examples of highly -complicated, "enterprise" code. - -Unfortunately, design patterns are pretty much missing -language features. This is most evident in dynamic languages such as Python -and Lisp, as demonstrated by -[Peter Norvig](http://www.norvig.com/design-patterns/). - -Or as [Paul Graham](http://www.paulgraham.com/icad.html) put it: - -``` -This practice is not only common, but institutionalized. For example, in the -OO world you hear a good deal about "patterns". I wonder if these patterns are -not sometimes evidence of case (c), the human compiler, at work. When I see -patterns in my programs, I consider it a sign of trouble. The shape of a -program should reflect only the problem it needs to solve. Any other -regularity in the code is a sign, to me at least, that I'm using abstractions -that aren't powerful enough-- often that I'm generating by hand the expansions -of some macro that I need to write -``` - -After presenting the book so negatively, why you should even read it then? -Well, it is good to be aware of those design patterns and use them when -appropriate. They can improve modularity and reuse of the code. You will also -find examples of such patterns in our code, primarily Strategy and Visitor -patterns. The book is also a good stepping stone to more advanced reading -about software design. - -## Modern C++ Design by Andrei Alexandrescu - -Recommended for C++ developers. - -This book can be treated as a continuation of the previous "Design Patterns" -book. It introduced "dark arts of template meta-programming" to the world. -Many of the patterns are converted to use C++ templates which makes them even -better for reuse. But, like the previous book, there are downsides if used too -much. You should approach it with a critical eye and it will help you -understand ideas that are used in some parts of our codebase. - -## Large Scale C++ Software Design by John Lakos - -Recommended for C++ developers. - -An old book, but well worth the read. Lakos presents a very pragmatic view of -writing modular software and how it affects both development time as well as -program runtime. Some things are outdated or controversial, but it will help -you understand how the whole C++ process of working in a large team, compiling -and linking affects development. - -## On Lisp by Paul Graham - -Recommended for Common Lisp developers. - -Free: http://www.paulgraham.com/onlisp.html - -An excellent continuation to "Practical Common Lisp". It starts of slow, as if -introducing the language, but very quickly picks up speed. The main meat of -the book are macros and their uses. From using macros to define cooperative -concurrency to including Prolog as if it's part of Common Lisp. The book will -help you understand more advanced macros that are occasionally used in our -Lisp C++ Preprocessor (LCP). diff --git a/docs/dev/storage/v1/accessors.md b/docs/dev/storage/v1/accessors.md deleted file mode 100644 index 2a8fac6ce..000000000 --- a/docs/dev/storage/v1/accessors.md +++ /dev/null @@ -1,110 +0,0 @@ -# DatabaseAccessor - -A `DatabaseAccessor` actually wraps a transactional access to database -data, for a single transaction. In that sense the naming is bad. It -encapsulates references to the database and the transaction object. - -It contains logic for working with database content (graph element -data) in the context of a single transaction. All CRUD operations are -performed within a single transaction (as Memgraph is a transactional -database), and therefore iteration over data, finding a specific graph -element etc are all functionalities of a `GraphDbAccessor`. - -In single-node Memgraph the database accessor also defined the lifetime -of a transaction. Even though a `Transaction` object was owned by the -transactional engine, it was `GraphDbAccessor`'s lifetime that object -was bound to (the transaction was implicitly aborted in -`GraphDbAccessor`'s destructor, if it was not explicitly ended before -that). - -# RecordAccessor - -It is important to understand data organization and access in the -storage layer. This discussion pertains to vertices and edges as graph -elements that the end client works with. - -Memgraph uses MVCC (documented on it's own page). This means that for -each graph element there could be different versions visible to -different currently executing transactions. When we talk about a -`Vertex` or `Edge` as a data structure we typically mean one of those -versions. In code this semantic is implemented so that both those classes -inherit `mvcc::Record`, which in turn inherits `mvcc::Version`. - -Handling MVCC and visibility is not in itself trivial. Next to that, -there is other book-keeping to be performed when working with data. For -that reason, Memgraph uses "accessors" to define an API of working with -data in a safe way. Most of the code in Memgraph (for example the -interpretation code) should work with accessors. There is a -`RecordAccessor` as a base class for `VertexAccessor` and -`EdgeAccessor`. Following is an enumeration of their purpose. - -### Data Access - -The client interacts with Memgraph using the Cypher query language. That -language has certain semantics which imply that multiple versions of the -data need to be visible during the execution of a single query. For -example: expansion over the graph is always done over the graph state as -it was at the beginning of the transaction. - -The `RecordAccessor` exposes functions to switch between the old and the new -versions of the same graph element (intelligently named `SwitchOld` and -`SwitchNew`) within a single transaction. In that way the client code -(mostly the interpreter) can avoid dealing with the underlying MVCC -version concepts. - -### Updates - -Data updates are also done through accessors. Meaning: there are methods -on the accessors that modify data, the client code should almost never -interact directly with `Vertex` or `Edge` objects. - -The accessor layer takes care of creating version in the MVCC layer and -performing updates on appropriate versions. - -Next, for many kinds of updates it is necessary to update the relevant -indexes. There are implicit indexes for vertex labels, as -well as user-created indexes for (label, property) pairs. The accessor -layer takes care of updating the indexes when these values are changed. - -Each update also triggers a log statement in the write-ahead log. This -is also handled by the accessor layer. - -### Distributed - -In distributed Memgraph accessors also contain a lot of the remote graph -element handling logic. More info on that is available in the -documentation for distributed. - -### Deferred MVCC Data Lookup for Edges - -Vertices and edges are versioned using MVCC. This means that for each -transaction an MVCC lookup needs to be done to determine which version -is visible to that transaction. This tends to slow things down due to -cache invalidations (version lists and versions are stored in arbitrary -locations on the heap). - -However, for edges, only the properties are mutable. The edge endpoints -and type are fixed once the edge is created. For that reason both edge -endpoints and type are available in vertex data, so that when expanding -it is not mandatory to do MVCC lookups of versioned, mutable data. This -logic is implemented in `RecordAccessor` and `EdgeAccessor`. - -### Exposure - -The original idea and implementation of graph element accessors was that -they'd prevent client code from ever interacting with raw `Vertex` or -`Edge` data. This however turned out to be impractical when implementing -distributed Memgraph and the raw data members have since been exposed -(through getters to old and new version pointers). However, refrain from -working with that data directly whenever possible! Always consider the -accessors to be the first go-to for interacting with data, especially -when in the context of a transaction. - -# Skiplist Accessor - -The term "accessor" is also used in the context of a skiplist. Every -operation on a skiplist must be performed within on an -accessor. The skiplist ensures that there will be no physical deletions -of an object during the lifetime of an accessor. This mechanism is used -to ensure deletion correctness in a highly concurrent container. -We only mention that here to avoid confusion regarding terminology. diff --git a/docs/dev/storage/v1/contents.md b/docs/dev/storage/v1/contents.md deleted file mode 100644 index e378d1379..000000000 --- a/docs/dev/storage/v1/contents.md +++ /dev/null @@ -1,6 +0,0 @@ -# Storage v1 - -* [Accessors](accessors.md) -* [Indexes](indexes.md) -* [Property Storage](property-storage.md) -* [Durability](durability.md) diff --git a/docs/dev/storage/v1/durability.md b/docs/dev/storage/v1/durability.md deleted file mode 100644 index 6648a3dc9..000000000 --- a/docs/dev/storage/v1/durability.md +++ /dev/null @@ -1,80 +0,0 @@ -# Durability - -## Write-ahead Logging - -Typically WAL denotes the process of writing a "log" of database -operations (state changes) to persistent storage before committing the -transaction, thus ensuring that the state can be recovered (in the case -of a crash) for all the transactions which the database committed. - -The WAL is a fine-grained durability format. It's purpose is to store -database changes fast. It's primary purpose is not to provide -space-efficient storage, nor to support fast recovery. For that reason -it's often used in combination with a different persistence mechanism -(in Memgraph's case the "snapshot") that has complementary -characteristics. - -### Guarantees - -Ensuring that the log is written before the transaction is committed can -slow down the database. For that reason this guarantee is most often -configurable in databases. - -Memgraph offers two options for the WAL. The default option, where the WAL is -flushed to the disk periodically and transactions do not wait for this to -complete, introduces the risk of database inconsistency because an operating -system or hardware crash might lead to missing transactions in the WAL. Memgraph -will handle this as if those transactions never happened. The second option, -called synchronous commit, will instruct Memgraph to wait for the WAL to be -flushed to the disk when a transactions completes and the transaction will wait -for this to complete. This option can be turned on with the -`--synchronous-commit` command line flag. - -### Format - -The WAL file contains a series of DB state changes called `StateDelta`s. -Each of them describes what the state change is and in which transaction -it happened. Also some kinds of meta-information needed to ensure proper -state recovery are recorded (transaction beginnings and commits/abort). - -The following is guaranteed w.r.t. `StateDelta` ordering in -a single WAL file: -- For two ops in the same transaction, if op A happened before B in the - database, that ordering is preserved in the log. -- Transaction begin/commit/abort messages also appear in exactly the - same order as they were executed in the transactional engine. - -### Recovery - -The database can recover from the WAL on startup. This works in -conjunction with snapshot recovery. The database attempts to recover from -the latest snapshot and then apply as much as possible from the WAL -files. Only those transactions that were not recovered from the snapshot -are recovered from the WAL, for speed efficiency. It is possible (but -inefficient) to recover the database from WAL only, provided all the WAL -files created from DB start are available. It is not possible to recover -partial database state (i.e. from some suffix of WAL files, without the -preceding snapshot). - -## Snapshots - -A "snapshot" is a record of the current database state stored in permanent -storage. Note that the term "snapshot" is used also in the context of -the transaction engine to denote a set of running transactions. - -A snapshot is written to the file by Memgraph periodically if so -configured. The snapshot creation process is done within a transaction created -specifically for that purpose. The transaction is needed to ensure that -the stored state is internally consistent. - -The database state can be recovered from the snapshot during startup, if -so configured. This recovery works in conjunction with write-ahead log -recovery. - -A single snapshot contains all the data needed to recover a database. In -that sense snapshots are independent of each other and old snapshots can -be deleted once the new ones are safely stored, if it is not necessary -to revert the database to some older state. - -The exact format of the snapshot file is defined inline in the snapshot -creation code. diff --git a/docs/dev/storage/v1/indexes.md b/docs/dev/storage/v1/indexes.md deleted file mode 100644 index b623d13d3..000000000 --- a/docs/dev/storage/v1/indexes.md +++ /dev/null @@ -1,116 +0,0 @@ -# Label Indexes - -These are unsorted indexes that contain all the vertices that have the label -the indexes are for (one index per label). These kinds of indexes get -automatically generated for each label used in the database. - -### Updating the Indexes - -Whenever something gets added to the record we update the index (add that -record to index). We keep an index which might contain garbage (not relevant -records, because the value got removed or something similar) but we will -filter it out when querying the index. We do it like this because we don't -have to do bookkeeping and deciding if we update the index on the end of the -transaction (commit/abort phase), moreover current interpreter advances the -command in transaction and as such assumes that the indexes now contain -objects added in the previous command inside this transaction, so we need to -update over the whole scope of transaction (whenever something is added to the -record). - -### Index Entries Label - -These kinds of indexes are internally keeping track of pair (record, vlist). -Why do we need to keep track of exactly those two things? - -Problems with two different approaches - -1) Keep track of just the record: - - - We need the `VersionList` for creating an accessor (this in itself is a - deal-breaker). - - Semantically it makes sense. An edge/vertex maps bijectionally to a - `VersionList`. - - We might try to access some members of record while the record is being - modified from another thread. - - A vertex/edge could get updated, thus expiring the record in the index. - The newly created record should be present in the index, but it's not. - Without the `VersionList` we can't reach the newly created record. - - Probably there are even more reasons... It should be obvious by now that - we need the `VersionList` in the index. - -2) Keep track of just the version list: - - - Removing from an index is a problem for two major reasons. First, if we - only have the `VersionList`, checking if it should be removed implies - checking all the reachable records, which is not thread-safe. Second, - there are issues with concurrent removal and insertion. The cleanup thread - could determine the vertex/edge should be removed from the index and - remove it, while in between those ops another thread attempts to insert - the `VersionList` into the index. The insertion does nothing because the - `VersionList` is already in, but it gets removed immediately after. - -Because of inability to keep track of just the record, or value, we need to -keep track of both of them. Resolution of problems mentioned above, in the -same order, with (record, vlist) pair - - - simple `vlist.find(current transaction)` will get us the newest visible - record - - we'll never try to access some record if it's still being written since we - will always operate on vlist.find returned record - - newest record will contain that label - - since we have (record, vlist) pair as the key in the index when we update - and delete in the same time we will never delete the same record, vlist - pair we are adding because the record, vlist pair we are deleting is - already superseded by a newer record and as such won't be inserted while - it's being deleted - -### Querying the Index - -We run through the index for the given label and do `vlist.find` operation for -the current transaction, and check if the newest return record has that -label. If it has it then we return it. By now you are probably wondering -aren't we sometimes returning duplicate vlist entries? And you are wondering -correctly, we would be returning them, but we are making sure that the entires -in the index are sorted by their `vlist*` and as such we can filter consecutive -duplicate `vlist*` to only return one of those while still being able to create -an iterator to index. - -### Cleaning the Index - -Cleaning the index is not as straightforward as it seems as a lot of garbage -can accumulate, but it's hard to know when exactly can we delete some (record, -vlist) pair. First, let's assume that we are doing the cleaning process at -some `transaction_id`, `id` such that there doesn't exist an active transaction -with an id lower than `id`. - -We scan through the whole index and for each (record, vlist) pair we first -check if it was deleted before the id (i.e. no transaction with an id >= `id` -will ever again see that record), if it was deleted before we might naively -say that it's safe to delete it, but, we must take into account that when some -new record is created from this record (update operation), that record still -contains the label but by deleting this record we won't be able to see that -vlist because that new record won't add again to index because we didn't -explicitly add that label again to it. - -Because of this we have to 'update' this index (record, vlist) pair. We have -to update the record to now point to a newer record in vlist, the one that is -not deleted yet. We can do that by querying the `version_list` for the last -record inside (oldest it has — remember that `mvcc_gc` will re-link not -visible records so the last record will be visible for the current GC id). -When updating the record inside the index, it's not okay to just update the -pointer and leave the index as it is, because with updating the `record*` we -might change the relative order of entries inside the index. We first have to -re-insert it with new `record*`, and then delete the old entry. And we need to -do insertion before the remove operation! Otherwise it could happen that the -vlist with a newer record with that label won't exist while some transaction -is querying the index. - -Records which we added as a consequence of deleting older records will be -eventually removed from the index if they don't contain label because if we -see that the record is not deleted we try to check if that record still -contains the label. We also need to be careful here because we can't check -that while the record is being potentially updated by some transaction (race -condition), so we need can check if records still contain label if it's -creation id is smaller than our `id`, as that implies that the creating -transaction either aborted or committed as our `id` is equal to the oldest -active transaction in time of starting the GC. diff --git a/docs/dev/storage/v1/property-storage.md b/docs/dev/storage/v1/property-storage.md deleted file mode 100644 index 947c4d8b3..000000000 --- a/docs/dev/storage/v1/property-storage.md +++ /dev/null @@ -1,131 +0,0 @@ -# Property Storage - -Although the reader is probably familiar with properties in *Memgraph*, let's -briefly recap. - -Both vertices and edges can store an arbitrary number of properties. Properties -are, in essence, ordered pairs of property names and property values. Each -property name within a single graph element (edge/node) can store a single -property value. Property names are represented as strings, while property values -must be one of the following types: - - Type | Description ------------|------------ - `Null` | Denotes that the property has no value. This is the same as if the property does not exist. - `String` | A character string, i.e. text. - `Boolean` | A boolean value, either `true` or `false`. - `Integer` | An integer number. - `Float` | A floating-point number, i.e. a real number. - `List` | A list containing any number of property values of any supported type. It can be used to store multiple values under a single property name. - `Map` | A mapping of string keys to values of any supported type. - -Property values are modeled in a class conveniently called `PropertyValue`. - -## Mapping Between Property Names and Property Keys. - -Although users think of property names in terms of descriptive strings -(e.g. "location" or "department"), *Memgraph* internally converts those names -into property keys which are, essentially, unsigned 16-bit integers. - -Property keys are modelled by a not-so-conveniently named class called -`Property` which can be found in `storage/types.hpp`. The actual conversion -between property names and property keys is done within the `ConcurrentIdMapper` -but the internals of that implementation are out of scope for understanding -property storage. - -## PropertyValueStore - -Both `Edge` and `Vertex` objects contain an instance of `PropertyValueStore` -object which is responsible for storing properties of a corresponding graph -element. - -An interface of `PropertyValueStore` is as follows: - - Method | Description ------------|------------ - `at` | Returns the `PropertyValue` for a given `Property` (key). - `set` | Stores a given `PropertyValue` under a given `Property` (key). - `erase` | Deletes a given `Property` (key) alongside its corresponding `PropertyValue`. - `clear` | Clears the storage. - `iterator`| Provides an extension of `std::input_iterator` that iterates over storage. - -## Storage Location - -By default, *Memgraph* is an in-memory database and all properties are therefore -stored in working memory unless specified otherwise by the user. User has an -option to specify via the command line which properties they wish to be stored -on disk. - -Storage location of each property is encapsulated within a `Property` object -which is ensured by the `ConcurrentIdMapper`. More precisely, the unsigned 16-bit -property key has the following format: - -``` -|---location--|------id------| -|-Memory|Disk-|-----2^15-----| -``` - -In other words, the most significant bit determines the location where the -property will be stored. - -### In-memory Storage - -The underlying implementation of in-memory storage for the time being is -`std::vector>`. Implementations of`at`, `set` -and `erase` are linear in time. This implementation is arguably more efficient -than `std::map` or `std::unordered_map` when the average number of properties of -a record is relatively small (up to 10) which seems to be the case. - -### On-disk Storage - -#### KVStore - -Disk storage is modeled by an abstraction of key-value storage as implemented in -`storage/kvstore.hpp'. An interface of this abstraction is as follows: - - Method | Description -----------------|------------ - `Put` | Stores the given value under the given key. - `Get` | Obtains the given value stored under the given key. - `Delete` | Deletes a given (key, value) pair from storage.. - `DeletePrefix` | Deletes all (key, value) pairs where key begins with a given prefix. - `Size` | Returns the size of the storage or, optionally, the number of stored pairs that begin with a given prefix. - `iterator` | Provides an extension of `std::input_iterator` that iterates over storage. - -Keys and values in this context are of type `std::string`. - -The actual underlying implementation of this abstraction uses -[RocksDB]{https://rocksdb.org} — a persistent key-value store for fast -storage. - -It is worthy to note that the custom iterator implementation allows the user -to iterate over a given prefix. Otherwise, the implementation follows familiar -c++ constructs and can be used as follows: - -``` -KVStore storage = ...; -for (auto it = storage.begin(); it != storage.end(); ++it) {} -for (auto kv : storage) {} -for (auto it = storage.begin("prefix"); it != storage.end("prefix"); ++it) {} -``` - -Note that it is not possible to scan over multiple prefixes. For instance, one -might assume that you can scan over all keys that fall in a certain -lexicographical range. Unfortunately, that is not the case and running the -following code will result in an infinite loop with a touch of undefined -behavior. - -``` -KVStore storage = ...; -for (auto it = storage.begin("alpha"); it != storage.end("omega"); ++it) {} -``` - -#### Data Organization on Disk - -Each `PropertyValueStore` instance can access a static `KVStore` object that can -store `(key, value)` pairs on disk. The key of each property on disk consists of -two parts — a unique identifier (unsigned 64-bit integer) of the current -record version (see mvcc docummentation for further clarification) and a -property key as described above. The actual value of the property is serialized -into a bytestring using bolt `BaseEncoder`. Similarly, deserialization is -performed by bolt `Decoder`. diff --git a/docs/dev/storage/v2/contents.md b/docs/dev/storage/v2/contents.md deleted file mode 100644 index 33496731e..000000000 --- a/docs/dev/storage/v2/contents.md +++ /dev/null @@ -1,3 +0,0 @@ -# Storage v2 - -TODO(gitbuda): Write documentation. diff --git a/docs/dev/workflow.md b/docs/dev/workflow.md deleted file mode 100644 index aef6dd158..000000000 --- a/docs/dev/workflow.md +++ /dev/null @@ -1,166 +0,0 @@ -# Memgraph Workflow - -This chapter describes the usual workflow for working on Memgraph. - -## Git - -Memgraph uses [git](https://git-scm.com/) for source version control. If you -obtained the source, you probably already have it installed. Before you can -track new changes, you need to setup some basic information. - -First, tell git your name: - - git config --global user.name "FirstName LastName" - -Then, set your Memgraph email: - - git config --global user.email "my.email@memgraph.com" - -Finally, make git aware of your favourite editor: - - git config --global core.editor "vim" - -## Github - -All of the code in Memgraph needs to go through code review before it can be -accepted in the codebase. This is done through [Github](https://github.com/). -You should already have it installed if you followed the steps in [Quick -Start](quick-start.md). - -## Working on Your Feature Branch - -Git has a concept of source code **branches**. The `master` branch contains all -of the changes which were reviewed and accepted in Memgraph's code base. The -`master` branch is selected by default. - -### Creating a Branch - -When working on a new feature or fixing a bug, you should create a new branch -out of the `master` branch. There are two branch types, **epic** and **task** -branches. The epic branch is created when introducing a new feature or any work -unit requiring more than one commit. More commits are required to split the -work into chunks to be able to easier review code or find a bug (in each -commit, there could be various problems, e.g., related to performance or -concurrency issues, which are the hardest to track down). Each commit on the -master or epic branch should be a compilable and well-documented set of -changes. Task branches should be created when a smaller work unit has to be -integrated into the codebase. The task branch could be branched out of the -master or an epic branch. We manage epics and tasks on the project management -tool called [Airtable](https://airtable.com/tblTUqycq8sHTTkBF). Each epic is -prefixed by `Exyz-MG`, on the other hand, each task has `Tabcd-MG` prefix. -Examples on how to create branches follow: - -``` -git checkout master -git checkout -b T0025-MG-fix-a-problem -... -git checkout master -git checkout -b E025-MG-huge-feature -... -git checkout E025-MG-huge-feature -git checkout -b T0123-MG-add-feature-part -``` - -Note that a branch is created from the currently selected branch. So, if you -wish to create another branch from `master` you need to switch to `master` -first. - -### Making and Committing Changes - -When you have a branch for your new addition, you can now actually start -implementing it. After some amount of time, you may have created new files, -modified others and maybe even deleted unused files. You need to tell git to -track those changes. This is accomplished with `git add` and `git rm` -commands. - - git add path-to-new-file path-to-modified-file - git rm path-to-deleted-file - -To check that everything is correctly tracked, you may use the `git status` -command. It will also print the name of the currently selected branch. - -If everything seems OK, you should commit these changes to git. - - git commit - -You will be presented with an editor where you need to type the commit -message. Writing a good commit message is an art in itself. You should take a -look at the links below. We try to follow these conventions as much as -possible. - - * [How to Write a Git Commit Message](http://chris.beams.io/posts/git-commit/) - * [A Note About Git Commit Messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) - * [stopwritingramblingcommitmessages](http://stopwritingramblingcommitmessages.com/) - -### Sending Changes on a Review - -After finishing your work on your feature branch, you will want to send it on -code review. This is done by pushing the branch to Github and creating a pull -request. You can find all PRs -[here](https://github.com/memgraph/memgraph/pulls). - -### Code Integration - -When working, you have to integrate some changes to your work or push your work -to be available for others. To pull changes into a local `branch`, usually run -the following: - - git checkout {{branch}} - git pull origin {{branch}} - -To push your changes, usually run the following: - - git checkout {{branch}} - git push origin {{branch}} - -Sometimes, things could get a little bit more complicated. Diagram below shows -which git operation should be performed if a piece of code has to be integrated -from one branch to another. Note, `main_branch` is the **master** branch in our -case. - -``` - |<---------------------------| - | squash merge | - |--------------------------->| - | merge | - | | - |<-----------|<--------------| - | merge | squash merge | - | | | - |----------->|-------------->| - | rebase | merge | - | | rebase --onto | - | | | - main_branch epic_branch task_branch -``` - -There are a couple of cases: - -* If a code has to be integrated from a task branch to the main branch, use - **squash merge**. While you were working on a task, you probably committed a -couple of cleanup commits that are not relevant to the main branch. In the -other direction, while integrating the main branch to a task branch, the -**regular merge** is ok because changes from the task branch will later be -squash merged. - -* You should use **squash merge** when integrating changes from task to epic - branch (task might have irrelevant commits). On the other hand, you should -use a **regular merge** when an epic is completed and has to be integrated into -the main branch. Epic is a more significant piece of work, decoupled in -compilable and testable commits. All these commits should be preserved to be -able to find potential issues later on. - -* You should use **rebase** when integrating changes from main to an epic - branch. The epic branch has to be as clean as possible, avoid pure merge -commits. Once you rebase epic on main, all commits on the epic branch will -change the hashes. The implications are: 1) you have to force push your local -branch to the origin, 2) if you made a task branch out of the epic branch, you -would have to use **rebase --onto** (please refer to `git help rebase` for -details). In simple cases, **regular merge** should be sufficient to integrate -changes from epic to a task branch (that can even be done via GitHub web -interface). - -During any code integration, you may get reports that some files have -conflicting changes. If you need help resolving them, don't be afraid to ask -around! After you've resolved them, mark them as done with `git add` command. -You may then continue with `git {{action}} --continue`. diff --git a/docs/feature_spec/active/python-query-modules.md b/docs/feature_spec/active/python-query-modules.md deleted file mode 100644 index f70d4eac0..000000000 --- a/docs/feature_spec/active/python-query-modules.md +++ /dev/null @@ -1,185 +0,0 @@ -# Python 3 Query Modules - -## Introduction - -Memgraph exposes a C API for writing the so called Query Modules. These -modules contain definitions of procedures which can be invoked through the -query language using the `CALL ... YIELD ...` syntax. This mechanism allows -database users to extend Memgraph with their own algorithms and -functionalities. - -Using a low level language like C can be quite cumbersome for writing modules, -so it seems natural to add support for a higher level language on top of the -existing C API. - -There are languages written exactly for this purpose of extending C with high -level constructs, for example Lua and Guile. Instead of those, we have chosen -Python 3 to be the first high level language we will support. The primary reason -being that it's very popular, so more people should be able to write modules. -Another benefit of Python which comes out of its popularity is the large -ecosystem of libraries, especially graph algorithm related ones like NetworkX. -Python does have significant performance and implementation downsides compared -to Lua and Guile, but these are described in more detail later in this -document. - -## Python 3 API Overview - -The Python 3 API should be as user friendly as possible as well as look -Pythonic. This implies that some functions from the C API will not map to the -exact same functions. The most obvious case for a Pythonic approach is -registering procedures of a query module. Let's take a look at the C example -and its transformation to Python. - -```c -static void procedure(const struct mgp_list *args, - const struct mgp_graph *graph, struct mgp_result *result, - struct mgp_memory *memory); - -int mgp_init_module(struct mgp_module *module, struct mgp_memory *memory) { - struct mgp_proc *proc = - mgp_module_add_read_procedure(module, "procedure", procedure); - if (!proc) return 1; - if (!mgp_proc_add_arg(proc, "required_arg", - mgp_type_nullable(mgp_type_any()))) - return 1; - struct mgp_value *null_value = mgp_value_make_null(memory); - if (!mgp_proc_add_opt_arg(proc, "optional_arg", - mgp_type_nullable(mgp_type_any()), null_value)) { - mgp_value_destroy(null_value); - return 1; - } - mgp_value_destroy(null_value); - if (!mgp_proc_add_result(proc, "result", mgp_type_string())) return 1; - if (!mgp_proc_add_result(proc, "args", - mgp_type_list(mgp_type_nullable(mgp_type_any())))) - return 1; - return 0; -} -``` - -In Python things should be a lot simpler. - -```Python -# mgp.read_proc obtains the procedure name via __name__ attribute of a function. -@mgp.read_proc(# Arguments passed to multiple mgp_proc_add_arg calls - (('required_arg', mgp.Nullable(mgp.Any)), ('optional_arg', mgp.Nullable(mgp.Any), None)), - # Result fields passed to multiple mgp_proc_add_result calls - (('result', str), ('args', mgp.List(mgp.Nullable(mgp.Any))))) -def procedure(args, graph, result, memory): - pass -``` - -Here we have replaced `mgp_module_*` and `mgp_proc_*` C API with a much -simpler decorator function in Python -- `mgp.read_proc`. The types of -arguments and result fields can both be our types as well as Python builtin -types which can map to supported `mgp_value` types. The expected builtin types -we ought to support are: `bool`, `str`, `int`, `float` and `map`. While the -rest of the types are provided via our Python API. Optionally, we can add -convenience support for `object` type which would map to -`mgp.Nullable(mgp.Any)` and `list` which would map to -`mgp.List(mgp.Nullable(mgp.Any))`. Also, it makes sense to take a look if we -can leverage Python's `typing` module here. - -Another Pythonic change is to remove `mgp_value` C API from Python altogether. -This means that the arguments a Python procedure receives are not `mgp_value` -instances but rather `PyObject` instances. In other words, our implementation -would immediately marshal `mgp_value` to corresponding type in Python. -Obviously we would need to provide our own Python types for non-builtin -things like `mgp.Vertex` (equivalent to `mgp_vertex`) and other. - -Continuing from our example above, let's say the procedure was invoked through -Cypher using the following query. - - MATCH (n) CALL py_module.procedure(42, n) YIELD *; - -The Python procedure could then do the following and complete without throwing -neither the AssertionError nor the ValueError. - -```Python -def procedure(args, graph, result, memory): - assert isinstance(args, list) - # Unpacking throws ValueError if args does not contain exactly 2 values. - required_arg, optional_arg = args - assert isintance(required_arg, int) - assert isinstance(optional_arg, mgp.Vertex) -``` - -The rest of the C API should naturally map to either top level functions or -class methods as appropriate. - -## Loading Python Query Modules - -Our current mechanism for loading the modules is to look for `.so` files in -the directory specified by `--query-modules` flag. This is done when Memgraph -is started. We can extend this mechanism to look for `.py` files in addition -to `.so` files in the same directory and import them in the embedded Python -interpreter. The only issue is embedding the interpreter in Memgraph. There -are multiple choices: - - 1. Building Memgraph and statically linking to Python. - 2. Building Memgraph and dynamically linking to Python, and distributing - Python with Memgraph's installation. - 3. Building Memgraph and dynamically linking to Python, but without - distributing the Python library. - 4. Building Memgraph and optionally loading Python library by trying to - `dlopen` it. - -The first two options are only viable if the Python license allows, and this -will need further investigation. - -The third option adds Python as an installation dependency for Memgraph, and -without it Memgraph will not run. This is problematic for users which cannot -or do not want to install Python 3. - -The fourth option avoids all of the issues present in the first 3 options, but -comes at a higher implementation cost. We would need to try to `dlopen` the -Python library and setup function pointers. If we succeed we would import -`.py` files from the `--query-modules` directory. On the other hand, if the -user does not have Python, `dlopen` would fail and Memgraph would run without -Python support. - -After live discussion, we've decided to go with option 3. This way we don't -have to worry about mismatching Python versions we support and what the users -expect. Also, we should target Python 3.5 as that should be common between -Debian and CentOS for which we ship installation packages. - -## Performance and Implementation Problems - -As previously mentioned, embedding Python introduces usability issues compared -to other embeddable languages. - -The first, major issue is Global Interpreter Lock (GIL). Initializing Python -will start a single global interpreter and running multiple threads will -require acquiring GIL. In practice, this means that when multiple users run a -procedure written in Python in parallel the execution will not actually be -parallel. Python's interpreter will jump between executing one user's -procedure and the other's. This can be quite an issue for long running -procedures when multiple users are querying Memgraph. The solution for this -issue is Python's API for sub-interpreters. Unfortunately, the support for -them is rather poor and the API contains a lot of critical bugs when we tried -to use them. For the time being, we will have to accept GIL and its downsides. -Perhaps in the future we will gain more knowledge on how we could reduce the -acquire rate of GIL or the sub-interpreter API will get improved. - -Another major issue is memory allocation. Python's C API does not have support -for setting up a temporary allocator during execution of a single function. -It only has support for setting up a global heap allocator. This obviously -impacts our control of memory during a query procedure invocation. Besides -potential performance penalty, a procedure could allocate much more memory -than we would actually allow for execution of a single query. This means that -options controlling the memory limit during query execution are useless. On -the bright side, Python does use block style allocators and reference -counting, so the performance penalty and global memory usage should not be -that terrible. - -The final issue that isn't as major as the ones above is the global state of -the interpreter. In practice this means that any registered procedure and -imported module has access to any other procedure and module. This may pollute -the namespace for other users, but it should not be much of a problem because -Python always has things under a module scope. The other, slightly bigger -downside is that a malicious user could use this knowledge to modify other -modules and procedures. This seems like a major issue, but if we take the -bigger picture into consideration, we already have a security issue in general -by invoking `dlopen` on `.so` and potentially running arbitrary code. This was -the trade off we chose to allow users to extend Memgraph. It's up to the users -to write sane extensions and protect their servers from access. diff --git a/docs/feature_spec/active/tensorflow-op.md b/docs/feature_spec/active/tensorflow-op.md deleted file mode 100644 index ddabc34e0..000000000 --- a/docs/feature_spec/active/tensorflow-op.md +++ /dev/null @@ -1,198 +0,0 @@ -# Tensorflow Op - Technicalities - -The final result should be a shared object (".so") file that can be dynamically -loaded by the Tensorflow runtime in order to directly access the bolt client. - -## About Tensorflow - -Tensorflow is usually used with Python such that the Python code is used to -define a directed acyclic computation graph. Basically no computation is done -in Python. Instead, values from Python are copied into the graph structure as -constants to be used by other Ops. The directed acyclic graph naturally ends up -with two sets of border nodes, one for inputs, one for outputs. These are -sometimes called "feeds". - -Following the Python definition of the graph, during training, the entire data -processing graph/pipeline is called from Python as a single expression. This -leads to lazy evaluation since the called result has already been defined for a -while. - -Tensorflow internally works with tensors, i.e. n-dimensional arrays. That means -all of its inputs need to be matrices as well as its outputs. While it is -possible to feed data directly from Python's numpy matrices straight into -Tensorflow, this is less desirable than using the Tensorflow data API (which -defines data input and processing as a Tensorflow graph) because: - - 1. The data API is written in C++ and entirely avoids Python and as such is - faster - 2. The data API, unlike Python is available in "Tensorflow serving". The - default way to serve Tensorflow models in production. - -Once the entire input pipeline is defined via the tf.data API, its input is -basically a list of node IDs the model is supposed to work with. The model, -through the data API knows how to connect to Memgraph and execute openCypher -queries in order to get the remaining data it needs. (For example features of -neighbouring nodes.) - -## The Interface - -I think it's best you read the official guide... - And especially the addition -that specifies how data ops are special - - -## Compiling the TF Op - -There are two options for compiling a custom op. One of them involves pulling -the TF source, adding your code to it and compiling via bazel. This is -probably awkward to do for us and would significantly slow down compilation. - -The other method involves installing Tensorflow as a Python package and pulling -the required headers from for example: -`/usr/local/lib/python3.6/site-packages/tensorflow/include` We can then compile -our Op with our regular build system. - -This is practical since we can copy the required headers to our repo. If -necessary, we can have several versions of the headers to build several -versions of our Op for every TF version which we want to support. (But this is -unlikely to be required as the API should be stable). - -## Example for Using the Bolt Client Tensorflow Op - -### Dynamic Loading - -``` python3 -import tensorflow as tf - -mg_ops = tf.load_op_library('/usr/bin/memgraph/tensorflow_ops.so') -``` - -### Basic Usage - -``` python3 -dataset = mg_ops.OpenCypherDataset( - # This is probably unfortunate as the username and password - # get hardcoded into the graph, but for the simple case it's fine - "hostname:7687", auth=("user", "pass"), - - # Our query - ''' - MATCH (n:Train) RETURN n.id, n.features - ''', - - # Cast return values to these types - (tf.string, tf.float32)) - -# Some Tensorflow data api boilerplate -iterator = dataset.make_one_shot_iterator() -next_element = iterator.get_next() - -# Up to now we have only defined our computation graph which basically -# just connects to Memgraph -# `next_element` is not really data but a handle to a node in the Tensorflow -# graph, which we can and do evaluate -# It is a Tensorflow tensor with shape=(None, 2) -# and dtype=(tf.string, tf.float) -# shape `None` means the shape of the tensor is unknown at definition time -# and is dynamic and will only be known once the tensor has been evaluated - -with tf.Session() as sess: - node_ids = sess.run(next_element) - # `node_ids` contains IDs and features of all the nodes - # in the graph with the label "Train" - # It is a numpy.ndarray with a shape ($n_matching_nodes, 2) -``` - -### Memgraph Client as a Generic Tensorflow Op - -Other than the Tensorflow Data Op, we'll want to support a generic Tensorflow -Op which can be put anywhere in the Tensorflow computation Graph. It takes in -an arbitrary tensor and produces a tensor. This would be used in the GraphSage -algorithm to fetch the lowest level features into Tensorflow - -```python3 -requested_ids = np.array([1, 2, 3]) -ids_placeholder = tf.placeholder(tf.int32) - -model = mg_ops.OpenCypher() - "hostname:7687", auth=("user", "pass"), - """ - UNWIND $node_ids as nid - MATCH (n:Train {id: nid}) - RETURN n.features - """, - - # What to call the input tensor as an openCypher parameter - parameter_name="node_ids", - - # Type of our resulting tensor - dtype=(tf.float32) -) - -features = model(ids_placeholder) - -with tf.Session() as sess: - result = sess.run(features, - feed_dict={ids_placeholder: requested_ids}) -``` - -This is probably easier to implement than the Data Op, so it might be a good -idea to start with. - -### Production Usage - -During training, in the GraphSage algorithm at least, Memgraph is at the -beginning and at the end of the Tensorflow computation graph. At the -beginning, the Data Op provides the node IDs which are fed into the generic -Tensorflow Op to find their neighbours and their neighbours and their features. - -Production usage differs in that we don't use the Data Op. The Data Op is -effectively cut off and the initial input is fed by Tensorflow serving, with -the data found in the request. - -For example a JSON request to classify a node might look like: - -`POST http://host:port/v1/models/GraphSage/versions/v1:classify` - -With the contents: - -```json -{ - "examples": [ - {"node_id": 1}, - {"node_id": 2} - ], -} -``` - -Every element of the "examples" list is an example to be computed. Each is -represented by a dict with keys matching names of feeds in the Tensorflow graph -and values being the values we want fed in for each example. - -The REST API then replies in kind with the classification result in JSON. - -Note about adding our custom Op to Tensorflow serving. Our Ops .so can be -added into the Bazel build to link with Tensorflow serving or it can be -dynamically loaded by starting Tensorflow serving with a flag -`--custom_op_paths`. - -### Considerations - -There might be issues here that the url to connect to Memgraph is hardcoded -into the op and would thus be wrong when moved to production, requiring some -type of a hack to make work. We probably want to solve this by having the -client op take in another tf.Variable as an input which would contain a -connection url and username/password. We have to research whether this makes -it easy enough to move to production, as the connection string variable is -still a part of the graph, but maybe easier to replace. - -It is probably the best idea to utilize openCypher parameters to make our -queries flexible. The exact API as to how to declare the parameters in Python -is open to discussion. - -The Data Op might not even be necessary to implement as it is not key for -production use. It can be replaced in training mode with feed dicts and either - - 1. Getting the initial list of nodes via a Python Bolt client - 2. Creating a separate Tensorflow computation graph that gets all the relevant - node IDs into Python diff --git a/docs/feature_spec/contents.md b/docs/feature_spec/contents.md deleted file mode 100644 index 58afc346c..000000000 --- a/docs/feature_spec/contents.md +++ /dev/null @@ -1,33 +0,0 @@ -# Feature Specifications - -## Active - -* [Python Query Modules](active/python-query-modules.md) -* [Tensorflow Op](active/tensorflow-op.md) - -## Draft - -* [A-star Variable-length Expand](draft/a-star-variable-length-expand.md) -* [Cloud-native Graph Store](draft/cloud-native-graph-store.md) -* [Compile Filter Expressions](draft/compile-filter-expressions.md) -* [Database Triggers](draft/database-triggers.md) -* [Date and Time Data Types](draft/date-and-time-data-types.md) -* [Distributed Query Execution](draft/distributed-query-execution.md) -* [Edge Create or Update Queries](draft/edge-create-or-update-queries.md) -* [Extend Variable-length Filter Expressions](draft/extend-variable-length-filter-expression.md) -* [Geospatial Data Types](draft/geospatial-data-types.md) -* [Hybrid Storage Engine](draft/hybrid-storage-engine.md) -* [Load Data Queries](draft/load-data-queries.md) -* [Multitenancy](draft/multitenancy.md) -* [Query Compilation](draft/query-compilation.md) -* [Release Log Levels](draft/release-log-levels.md) -* [Rust Query Modules](draft/rust-query-modules.md) -* [Sharded Graph Store](draft/sharded-graph-store.md) -* [Storage Memory Management](draft/storage-memory-management.md) -* [Vectorized Query Execution](draft/vectorized-query-execution.md) - -## Obsolete - -* [Distributed](obsolete/distributed.md) -* [High-availability](obsolete/high-availability.md) -* [Kafka Integration](obsolete/kafka-integration.md) diff --git a/docs/feature_spec/draft/a-star-variable-length-expand.md b/docs/feature_spec/draft/a-star-variable-length-expand.md deleted file mode 100644 index 98667104b..000000000 --- a/docs/feature_spec/draft/a-star-variable-length-expand.md +++ /dev/null @@ -1,15 +0,0 @@ -# A-star Variable-length Expand - -Like DFS/BFS/WeightedShortestPath, it should be possible to support the A-star -algorithm in the format of variable length expansion. - -Syntactically, the query should look like the following one: -``` -MATCH (start)-[ - *aStar{{hops}} {{heuristic_expression} {{weight_expression}} {{aggregated_weight_variable}} {{filtering_expression}} - ]-(end) -RETURN {{aggregated_weight_variable}}; -``` - -It would be convenient to add geospatial data support before because A-star -works well with geospatial data (heuristic function might exist). diff --git a/docs/feature_spec/draft/cloud-native-graph-store.md b/docs/feature_spec/draft/cloud-native-graph-store.md deleted file mode 100644 index 038f92cb8..000000000 --- a/docs/feature_spec/draft/cloud-native-graph-store.md +++ /dev/null @@ -1,7 +0,0 @@ -# Cloud-native Graph Store - -The biggest problem with the current in-memory storage is the total cost of -ownership for large datasets non-frequently updated. An idea to solve that is a -decoupled storage and compute inside a cloud environment. E.g., on AWS, a -database instance could use EC2 machines to run the query execution against -data stored inside S3. diff --git a/docs/feature_spec/draft/compile-filter-expressions.md b/docs/feature_spec/draft/compile-filter-expressions.md deleted file mode 100644 index b3b4879f7..000000000 --- a/docs/feature_spec/draft/compile-filter-expressions.md +++ /dev/null @@ -1,40 +0,0 @@ -# Compile Filter Expressions - -Memgraph evaluates filter expression by traversing the abstract syntax tree of -the given filter. Filtering is a general operation in query execution. - -Some simple examples are: -``` -MATCH (n:Person {name: "John"}) WHERE n.age > 20 AND n.age < 40 RETURN n; -MATCH (a {id: 723})-[*bfs..10 (e, n | e.x > 12 AND n.y < 3)]-() RETURN *; -``` - -More real-world example looks like this (Ethereum network analysis): -``` -MATCH (a: Address {addr: ''})-[]->(t: Transaction)-[]->(b: Address) -RETURN DISTINCT b.addr -UNION -MATCH (a: Address {addr: ''})-[]->(t: Transaction)-[]->(b1: Address)-[]->(t2: Transaction)-[]->(b: Address) -WHERE t2.timestamp > t.timestamp -RETURN DISTINCT b.addr -UNION -MATCH (a: Address {addr: ''})-[]->(t: Transaction)-[]->(b1: Address)-[]->(t2: Transaction)-[]->(b2: Address)-[]->(t3: Transaction)-[]->(b: Address) -WHERE t2.timestamp > t.timestamp AND t3.timestamp > t2.timestamp -return distinct b.addr -UNION -MATCH (a: Address {addr: ''})-[]->(t: Transaction)-[]->(b1: Address)-[]->(t2: Transaction)-[]->(b2: Address)-[]->(t3: Transaction)-[]->(b3: Address)-[]->(t4: Transaction)-[]->(b: Address) -WHERE t2.timestamp > t.timestamp AND t3.timestamp > t2.timestamp AND t4.timestamp > t3.timestamp -RETURN DISTINCT b.addr -UNION -MATCH (a: Address {addr: ''})-[]->(t: Transaction)-[]->(b1: Address)-[]->(t2: Transaction)-[]->(b2: Address)-[]->(t3: Transaction)-[]->(b3: Address)-[]->(t4: Transaction)-[]->(b4: Address)-[]->(t5: Transaction)-[]->(b: Address) -WHERE t2.timestamp > t.timestamp AND t3.timestamp > t2.timestamp AND t4.timestamp > t3.timestamp AND t5.timestamp > t4.timestamp -RETURN DISTINCT b.addr; -``` - -Filtering may take a significant portion of query execution, which means it has -to be fast. - -The first step towards improvement might be to expose an API under which a -developer can implement its filtering logic (it's OK to support only C++ in the -beginning). Later on, we can introduce an automatic compilation of filtering -expressions. diff --git a/docs/feature_spec/draft/database-triggers.md b/docs/feature_spec/draft/database-triggers.md deleted file mode 100644 index 6ea613609..000000000 --- a/docs/feature_spec/draft/database-triggers.md +++ /dev/null @@ -1,14 +0,0 @@ -# Database Triggers - -Memgraph doesn't have any built-in notification mechanism yet. In the case a -user wants to get notified about anything happening inside Memgraph, the only -option is some pull mechanism from the client code. In many cases, that might -be suboptimal. - -A natural place to start would be put to some notification code on each update -action inside Memgraph. It's probably too early to send a notification -immediately after WAL delta gets created, but at some point after transaction -commits or after WAL deltas are written to disk might be a pretty good place. -Furthermore, Memgraph has the query module infrastructure. The first -implementation might call a user-defined query module procedure and pass -whatever gets created or updated during the query execution. diff --git a/docs/feature_spec/draft/date-and-time-data-types.md b/docs/feature_spec/draft/date-and-time-data-types.md deleted file mode 100644 index c4990c584..000000000 --- a/docs/feature_spec/draft/date-and-time-data-types.md +++ /dev/null @@ -1,13 +0,0 @@ -# Date and Time Data Types - -Neo4j offers the following functionality: - -* https://neo4j.com/docs/cypher-manual/current/syntax/temporal/ -* https://neo4j.com/docs/cypher-manual/current/functions/temporal/ - -The question is, how are we going to support equivalent capabilities? We need -something very similar because these are, in general, very well defined types. - -A note about the storage is that Memgraph has a limit on the total number of -different data types, 16 at this point. We have to be mindful of that during -the design phase. diff --git a/docs/feature_spec/draft/distributed-query-execution.md b/docs/feature_spec/draft/distributed-query-execution.md deleted file mode 100644 index 5eacdd0f8..000000000 --- a/docs/feature_spec/draft/distributed-query-execution.md +++ /dev/null @@ -1,10 +0,0 @@ -# Distributed Query Execution - -Add the ability to execute graph algorithms on a cluster of machines. The scope -of this is ONLY the query execution without changing the underlying storage -because that's much more complex. The first significant decision here is to -figure out do we implement our own distributed execution engine or deploy -something already available, like [Giraph](https://giraph.apache.org). An -important part is that Giraph by itself isn't enough because people want to -update data on the fly. The final solution needs to provide some updating -capabilities. diff --git a/docs/feature_spec/draft/edge-create-or-update-queries.md b/docs/feature_spec/draft/edge-create-or-update-queries.md deleted file mode 100644 index fb52c84c0..000000000 --- a/docs/feature_spec/draft/edge-create-or-update-queries.md +++ /dev/null @@ -1,14 +0,0 @@ -# Edge Create or Update Queries - -The old semantic of the `MERGE` clause is quite tricky. The new semantic of -`MERGE` is explained -[here](https://blog.acolyer.org/2019/09/18/updating-graph-databases-with-cypher/). - -Similar to `MERGE`, but maybe simpler is to define clauses and semantics that -apply only to a single edge. In the case an edge between two nodes doesn't -exist, it should be created. On the other hand, if it exists, it should be -updated. The syntax should look similar to the following: - -``` -MERGE EDGE (a)-[e:Type {props}]->(b) [ON CREATE SET expression ON UPDATE SET expression] ... -``` diff --git a/docs/feature_spec/draft/extend-variable-length-filter-expression.md b/docs/feature_spec/draft/extend-variable-length-filter-expression.md deleted file mode 100644 index 5c9bdcd65..000000000 --- a/docs/feature_spec/draft/extend-variable-length-filter-expression.md +++ /dev/null @@ -1,12 +0,0 @@ -# Extend Variable-length Filter Expressions - -Variable-length filtering (DFS/BFS/WeightedShortestPath) can to be arbitrarily -complex. At this point, the filtering expression only gets currently visited -node and edge: - -``` -MATCH (a {id: 723})-[*bfs..10 (e, n | e.x > 12 AND n.y < 3)]-() RETURN *; -``` - -If a user had the whole path available, he would write more complex filtering -logic. diff --git a/docs/feature_spec/draft/geospatial-data-types.md b/docs/feature_spec/draft/geospatial-data-types.md deleted file mode 100644 index 38bff5cb9..000000000 --- a/docs/feature_spec/draft/geospatial-data-types.md +++ /dev/null @@ -1,28 +0,0 @@ -# Geospatial Data Types - -Neo4j offers the following functionality: - -* https://neo4j.com/docs/cypher-manual/current/syntax/spatial/ -* https://neo4j.com/docs/cypher-manual/current/functions/spatial/ - -The question is, how are we going to support equivalent capabilities? We need -something very similar because these are, in general, very well defined types. - -The main reasons for implementing this feature are: - 1. Ease of use. At this point, users have to encode/decode time data types - manually. - 2. Memory efficiency in some cases because user defined encoding could still - be more efficient. - -The number of functionalities that could be built on top of geospatial types is -huge. Probably some C/C++ libraries should be used: - * https://github.com/OSGeo/gdal. - * http://geostarslib.sourceforge.net/ Furthermore, the query engine could use - these data types during query execution (specific for query execution). - * https://www.cgal.org. -Also, the storage engine could have specialized indices for these types of -data. - -A note about the storage is that Memgraph has a limit on the total number of -different data types, 16 at this point. We have to be mindful of that during -the design phase. diff --git a/docs/feature_spec/draft/hybrid-storage-engine.md b/docs/feature_spec/draft/hybrid-storage-engine.md deleted file mode 100644 index 0a4130393..000000000 --- a/docs/feature_spec/draft/hybrid-storage-engine.md +++ /dev/null @@ -1,20 +0,0 @@ -# Hybrid Storage Engine - -The goal here is easy to improve Memgraph storage massively! Please take a look -[here](http://cidrdb.org/cidr2020/papers/p29-neumann-cidr20.pdf) for the -reasons. - -The general idea is to store edges on disk by using an LSM like data structure. -Storing edge properties will be tricky because strict schema also has to be -introduced. Otherwise, it's impossible to store data on disk optimally (Neo4j -already has a pretty optimized implementation of that). Furthermore, we have to -introduce the paging concept. - -This is a complex feature because various aspects of the core engine have to be -considered and probably updated (memory management, garbage collection, -indexing). - -## References - -* [On Disk IO, Part 3: LSM Trees](https://medium.com/databasss/on-disk-io-part-3-lsm-trees-8b2da218496f) -* [2020-04-13 On-disk Edge Store Research](https://docs.google.com/document/d/1avoR2g9dNWa4FSFt9NVn4JrT6uOAH_ReNeUoNVsJ7J4) diff --git a/docs/feature_spec/draft/load-data-queries.md b/docs/feature_spec/draft/load-data-queries.md deleted file mode 100644 index 3206674cd..000000000 --- a/docs/feature_spec/draft/load-data-queries.md +++ /dev/null @@ -1,17 +0,0 @@ -# Load Data Queries - -Loading data into Memgraph is a challenging task. We have to implement -something equivalent to the [Neo4j LOAD -CSV](https://neo4j.com/developer/guide-import-csv/#import-load-csv). This -feature seems relatively straightforward to implement because `LoadCSV` could -be another operator that would yield row by row. By having the operator, the -operation would be composable with the rest of the `CREATE`|`MERGE` queries. -The composability is the key because users would be able to combine various -clauses to import data. - -A more general concept is [SingleStore -Pipelines](https://docs.singlestore.com/v7.1/reference/sql-reference/pipelines-commands/create-pipeline). - -We already tried with [Graph Streams](../obsolete/kafka-integration.md). An option -is to migrate that code as a standalone product -[here](https://github.com/memgraph/mgtools). diff --git a/docs/feature_spec/draft/multitenancy.md b/docs/feature_spec/draft/multitenancy.md deleted file mode 100644 index 02a7a189e..000000000 --- a/docs/feature_spec/draft/multitenancy.md +++ /dev/null @@ -1,15 +0,0 @@ -# Multitenancy - -[Multitenancy](https://en.wikipedia.org/wiki/Multitenancy) is a feature mainly -in the domain of ease of use. Neo4j made a great move by introducing -[Fabric](https://neo4j.com/developer/multi-tenancy-worked-example). - -Memgraph first step in a similar direction would be to add an abstraction layer -containing multiple `Storage` instances + the ability to specify a database -instance per client session or database transaction. - -## Replication Context - -Each transaction has to encode on top of which database it's getting executed. -Once a replica gets delta objects containing database info, the replica engine -could apply changes locally. diff --git a/docs/feature_spec/draft/query-compilation.md b/docs/feature_spec/draft/query-compilation.md deleted file mode 100644 index bc25b4745..000000000 --- a/docs/feature_spec/draft/query-compilation.md +++ /dev/null @@ -1,14 +0,0 @@ -# Query Compilation - -Memgraph supports the interpretation of queries in a pull-based way. An -advantage of interpreting queries is a fast time until the execution, which is -convenient when a user wants to test a bunch of queries in a short time. The -downside is slow runtime. The runtime could be improved by compiling query -plans. - -## Research Area 1 - -The easiest route to the query compilation might be generating [virtual -constexpr](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1064r0.html) -pull functions, making a dynamic library out of the entire compiled query plan, -and swapping query plans during the database runtime. diff --git a/docs/feature_spec/draft/release-log-levels.md b/docs/feature_spec/draft/release-log-levels.md deleted file mode 100644 index f944d3417..000000000 --- a/docs/feature_spec/draft/release-log-levels.md +++ /dev/null @@ -1,17 +0,0 @@ -# Release Log Levels - -It's impossible to control the log level in Memgraph Community. That means it's -tough to debug issues in interacting with Memgraph. At least three log levels -should be available to the user: - -* Log nothing (as it is now). -* Log each executed query. -* Log Bolt server states. - -Memgraph Enterprise has the audit log feature. The audit log provides -additional info about each query (user, source, etc.), but it's only available -in the Enterprise edition. Furthermore, the intention of audit logs isn't -debugging. - -An important note is that the logged queries should be stripped out because, in -the Memgraph cloud context, we shouldn't log sensitive data. diff --git a/docs/feature_spec/draft/rust-query-modules.md b/docs/feature_spec/draft/rust-query-modules.md deleted file mode 100644 index 160056283..000000000 --- a/docs/feature_spec/draft/rust-query-modules.md +++ /dev/null @@ -1,15 +0,0 @@ -# Rust Query Modules - -Memgraph provides the query modules infrastructure. It's possible to write -query modules in -[C/C++](https://docs.memgraph.com/memgraph/reference-overview/query-modules/c-api) -and -[Python](https://docs.memgraph.com/memgraph/reference-overview/query-modules/python-api). -The problem with C/C++ is that it's very error-prone and time-consuming. -Python's problem is that it's slow and has a bunch of other limitations listed -in the [feature spec](../active/python-query-modules.md). - -On the other hand, Rust is fast and much less error-prone compared to C. It -should be possible to use [bindgen](https://github.com/rust-lang/rust-bindgen) -to generate bindings out of the current C API and write wrapper code for Rust -developers to enjoy. diff --git a/docs/feature_spec/draft/sharded-graph-store.md b/docs/feature_spec/draft/sharded-graph-store.md deleted file mode 100644 index 72ea5e3e6..000000000 --- a/docs/feature_spec/draft/sharded-graph-store.md +++ /dev/null @@ -1,8 +0,0 @@ -# Sharded Graph Store - -Add the ability to shard graph data across machines in a cluster. The scope of -this is ONLY changing to the storage engine. - -## References - -* [Spinner: Scalable Graph Partitioning in the Cloud](https://arxiv.org/pdf/1404.3861.pdf) diff --git a/docs/feature_spec/draft/storage-memory-management.md b/docs/feature_spec/draft/storage-memory-management.md deleted file mode 100644 index 0915e76f1..000000000 --- a/docs/feature_spec/draft/storage-memory-management.md +++ /dev/null @@ -1,13 +0,0 @@ -# Storage Memory Management - -If Memgraph uses too much memory, OS will kill it. There has to be an internal -mechanism to control memory usage. - -Since C++17, polymorphic allocators are an excellent way to inject custom -memory management while having a modular code. Memgraph already uses PMR in the -query execution. Also, refer to [1] on how to start with PMR in the storage -context. - -## Resources - -[1] [PMR: Mistakes Were Made](https://www.youtube.com/watch?v=6BLlIj2QoT8) diff --git a/docs/feature_spec/draft/vectorized-query-execution.md b/docs/feature_spec/draft/vectorized-query-execution.md deleted file mode 100644 index 7cf5cdfcd..000000000 --- a/docs/feature_spec/draft/vectorized-query-execution.md +++ /dev/null @@ -1,9 +0,0 @@ -# Vectorized Query Execution - -Memgraph query engine pulls one by one record during query execution. A more -efficient way would be to pull multiple records in an array. Adding that -shouldn't be complicated, but it wouldn't be advantageous without vectorizing -fetching records from the storage. - -On the query engine level, the array could be part of the frame. In other -words, the frame and the code dealing with the frame has to be changed. diff --git a/docs/feature_spec/obsolete/distributed.md b/docs/feature_spec/obsolete/distributed.md deleted file mode 100644 index 8d91f01bd..000000000 --- a/docs/feature_spec/obsolete/distributed.md +++ /dev/null @@ -1,148 +0,0 @@ -# Distributed Memgraph specs -This document describes reasnonings behind Memgraphs distributed concepts. - -## Distributed state machine -Memgraphs distributed mode introduces two states of the cluster, recovering and -working. The change between states shouldn't happen often, but when it happens -it can take a while to make a transition from one to another. - -### Recovering -This state is the default state for Memgraph when the cluster starts with -recovery flags. If the recovery finishes successfully, the state changes to -working. If recovery fails, the user will be presented with a message that -explains what happened and what are the next steps. - -Another way to enter this state is failure. If the cluster encounters a failure, -the master will enter the Recovering mode. This time, it will wait for all -workers to respond with a message saying they are alive and well, and making -sure they all have consistent state. - -### Working -This state should be the default state of Memgraph most of the time. When in -this state, Memgraph accepts connections from Bolt clients and allows query -execution. - -If distributed execution fails for a transaction, that transaction, and all -other active transactions will be aborted and the cluster will enter the -Recovering state. - -## Durability -One of the important concepts in distributed Memgraph is durability. - -### Cluster configuration -When running Memgraph in distributed mode, the master will store cluster -metadata in a persistent store. If fore some reason the cluster shuts down, -recovering Memgraph from durability files shouldn't require any additional -flags. - -### Database ID -Each new and clean run of Memgraph should generate a new globally unique -database id. This id will associate all files that have persisted with this -run. Adding the database id to snapshots, write-ahead logs and cluster metadata -files ties them a specific Memgraph run, and it makes recovery easier to reason -about. - -When recovering, the cluster won't generate a new id, but will reuse the one -from the snapshot/wal that it was able to recover from. - -### Durability files -Memgraph uses snapshots and write-ahead logs for durability. - -When Memgraph recovers it has to make sure all machines in the cluster recover -to the same recovery point. This is done by finding a common snapshot and -finding common transactions in per-machine available write-ahead logs. - -Since we can not be sure that each machine persisted durability files, we need -to be able to negotiate a common recovery point in the cluster. Possible -durability file failures could require to start the cluster from scratch, -purging everything from storage and recovering from existing durability files. - -We need to ensure that we keep wal files containing information about -transactions between all existing snapshots. This will provide better durability -in the case of a random machine durability file failure, where the cluster can -find a common recovery point that all machines in the cluster have. - -Also, we should suggest and make clear docs that anything less than two -snapshots isn't considered safe for recovery. - -### Recovery -The recovery happens in following steps: -* Master enables worker registration. -* Master recovers cluster metadata from the persisted storage. -* Master waits all required workers to register. -* Master broadcasts a recovery request to all workers. -* Workers respond with with a set of possible recovery points. -* Master finds a common recovery point for the whole cluster. -* Master broadcasts a recovery request with the common recovery point. -* Master waits for the cluster to recover. -* After a successful cluster recovery, master can enter Working state. - -## Dynamic Graph Partitioning (abbr. DGP) - -### Implemented parameters - ---dynamic-graph-partitioner-enabled (If the dynamic graph partitioner should be - enabled.) type: bool default: false (start time) ---dgp-improvement-threshold (How much better should specific node score be - to consider a migration to another worker. This represents the minimal - difference between new score that the vertex will have when migrated - and the old one such that it's migrated.) type: int32 default: 10 - (start time) ---dgp-max-batch-size (Maximal amount of vertices which should be migrated - in one dynamic graph partitioner step.) type: int32 default: 2000 - (start time) - -### Design decisions - -* Each partitioning session has to be a new transaction. -* When and how does an instance perform the moves? - * Periodically. - * Token sharing (round robin, exactly one instance at a time has an - opportunity to perform the moves). -* On server-side serialization error (when DGP receives an error). - -> Quit partitioning and wait for the next turn. -* On client-side serialization error (when end client receives an error). - -> The client should never receive an error because of any - internal operation. - -> For the first implementation, it's good enough to wait until data becomes - available again. - -> It would be nice to achieve that DGP has lower priority than end client - operations. - -### End-user parameters - -* --dynamic-graph-partitioner-enabled (execution time) -* --dgp-improvement-threshold (execution time) -* --dgp-max-batch-size (execution time) -* --dgp-min-batch-size (execution time) - -> Minimum number of nodes that will be moved in each step. -* --dgp-fitness-threshold (execution time) - -> Do not perform moves if partitioning is good enough. -* --dgp-delta-turn-time (execution time) - -> Time between each turn. -* --dgp-delta-step-time (execution time) - -> Time between each step. -* --dgp-step-time (execution time) - -> Time limit per each step. - -### Testing - -The implementation has to provide good enough results in terms of: - * How good the partitioning is (numeric value), aka goodness. - * Workload execution time. - * Stress test correctness. - -Test cases: - * N not connected subgraphs - -> shuffle nodes to N instances - -> run partitioning - -> test perfect partitioning. - * N connected subgraph - -> shuffle nodes to N instance - -> run partitioning - -> test partitioning. - * Take realistic workload (Long Running, LDBC1, LDBC2, Card Fraud, BFS, WSP) - -> measure exec time - -> run partitioning - -> test partitioning - -> measure exec time (during and after partitioning). diff --git a/docs/feature_spec/obsolete/high-availability.md b/docs/feature_spec/obsolete/high-availability.md deleted file mode 100644 index 44cd24d8b..000000000 --- a/docs/feature_spec/obsolete/high-availability.md +++ /dev/null @@ -1,275 +0,0 @@ -# High Availability (abbr. HA) - -## High Level Context - -High availability is a characteristic of a system which aims to ensure a -certain level of operational performance for a higher-than-normal period. -Although there are multiple ways to design highly available systems, Memgraph -strives to achieve HA by elimination of single points of failure. In essence, -this implies adding redundancy to the system so that a failure of a component -does not imply the failure of the entire system. To ensure this, HA Memgraph -implements the [Raft consensus algorithm](https://raft.github.io/). - -Correct implementation of the algorithm guarantees that the cluster will be -fully functional (available) as long as any strong majority of the servers are -operational and can communicate with each other and with clients. For example, -clusters of three or four machines can tolerate the failure of a single server, -clusters of five and six machines can tolerate the failure of any two servers, -and so on. Therefore, we strongly recommend a setup of an odd-sized cluster. - -### Performance Implications - -Internally, Raft achieves high availability by keeping a consistent replicated -log on each server within the cluster. Therefore, we must successfully replicate -a transaction on the majority of servers within the cluster before we actually -commit it and report the result back to the client. This operation represents -a significant performance hit when compared with single node version of -Memgraph. - -Luckily, the algorithm can be tweaked in a way which allows read-only -transactions to perform significantly better than those which modify the -database state. That being said, the performance of read-only operations -is still not going to be on par with single node Memgraph. - -This section will be updated with exact numbers once we integrate HA with -new storage. - -With the old storage, write throughput was almost five times lower than read -throughput (~30000 reads per second vs ~6000 writes per second). - -## User Facing Setup - -### How to Setup HA Memgraph Cluster? - -First, the user needs to install `memgraph_ha` package on each machine -in their cluster. HA Memgraph should be available as a Debian package, -so its installation on each machine should be as simple as: - -```plaintext -dpkg -i /path/to/memgraph_ha_.deb -``` - -After successful installation of the `memgraph_ha` package, the user should -finish its configuration before attempting to start the cluster. - -There are two main things that need to be configured on every node in order for -the cluster to be able to run: - -1. The user has to edit the main configuration file and specify the unique node - ID to each server in the cluster -2. The user has to create a file that describes all IP addresses of all servers - that will be used in the cluster - -The `memgraph_ha` binary loads all main configuration parameters from -`/etc/memgraph/memgraph_ha.conf`. On each node of the cluster, the user should -uncomment the `--server-id=0` parameter and change its value to the `server_id` -of that node. - -The last step before starting the server is to create a `coordination` -configuration file. That file is already present as an example in -`/etc/memgraph/coordination.json.example` and you have to copy it to -`/etc/memgraph/coordination.json` and edit it according to your cluster -configuration. The file contains coordination info consisting of a list of -`server_id`, `ip_address` and `rpc_port` lists. The assumed contents of the -`coordination.json` file are: - -```plaintext -[ - [1, "192.168.0.1", 10000], - [2, "192.168.0.2", 10000], - [3, "192.168.0.3", 10000] -] -``` -Here, each line corresponds to coordination of one server. The first entry is -that server's ID, the second is its IP address and the third is the RPC port it -listens to. This port should not be confused with the port used for client -interaction via the Bolt protocol. - -The `ip_address` entered for each `server_id` *must* match the exact IP address -that belongs to that server and that will be used to communicate to other nodes -in the cluster. The coordination configuration file *must* be identical on all -nodes in the cluster. - -After the user has set the `server_id` on each node in -`/etc/memgraph/memgraph_ha.conf` and provided the same -`/etc/memgraph/coordination.json` file to each node in the cluster, they can -start the Memgraph HA service by issuing the following command on each node in -the cluster: - -```plaintext -systemctl start memgraph_ha -``` - -### How to Configure Raft Parameters? - -All Raft configuration parameters can be controlled by modifying -`/etc/memgraph/raft.json`. The assumed contents of the `raft.json` file are: - -```plaintext -{ - "election_timeout_min": 750, - "election_timeout_max": 1000, - "heartbeat_interval": 100, - "replication_timeout": 20000, - "log_size_snapshot_threshold": 50000 -} -``` - -The meaning behind each entry is demystified in the following table: - -Flag | Description -------------------------------|------------ -`election_timeout_min` | Lower bound for the randomly sampled reelection timer given in milliseconds -`election_timeout_max` | Upper bound for the randomly sampled reelection timer given in milliseconds -`heartbeat_interval` | Time interval between consecutive heartbeats given in milliseconds -`replication_timeout` | Time interval allowed for data replication given in milliseconds -`log_size_snapshot_threshold` | Allowed number of entries in Raft log before its compaction - -### How to Query HA Memgraph via Proxy? - -This chapter describes how to query HA Memgraph using our proxy server. -Note that this is not intended to be a long-term solution. Instead, we will -implement a proper Memgraph HA client which is capable of communicating with -the HA cluster. Once our own client is implemented, it will no longer be -possible to query HA Memgraph using other clients (such as neo4j client). - -The Bolt protocol that is exposed by each Memgraph HA node is an extended -version of the standard Bolt protocol. In order to be able to communicate with -the highly available cluster of Memgraph HA nodes, the client must have some -logic implemented in itself so that it can communicate correctly with all nodes -in the cluster. To facilitate a faster start with the HA cluster we will build -the Memgraph HA proxy binary that communicates with all nodes in the HA cluster -using the extended Bolt protocol and itself exposes a standard Bolt protocol to -the user. All standard Bolt clients (libraries and custom systems) can -communicate with the Memgraph HA proxy without any code modifications. - -The HA proxy should be deployed on each client machine that is used to -communicate with the cluster. It can't be deployed on the Memgraph HA nodes! - -When using the Memgraph HA proxy, the communication flow is described in the -following diagram: - -```plaintext -Memgraph HA node 1 -----+ - | -Memgraph HA node 2 -----+ Memgraph HA proxy <---> any standard Bolt client (C, Java, PHP, Python, etc.) - | -Memgraph HA node 3 -----+ -``` - -To setup the Memgraph HA proxy the user should install the `memgraph_ha_proxy` -package. - -After its successful installation, the user should enter all endpoints of the -HA Memgraph cluster servers into the configuration before attempting to start -the HA Memgraph proxy server. - -The HA Memgraph proxy server loads all of its configuration from -`/etc/memgraph/memgraph_ha_proxy.conf`. Assuming that the cluster is set up -like in the previous examples, the user should uncomment and enter the following -value into the `--endpoints` parameter: - -```plaintext ---endpoints=192.168.0.1:7687,192.168.0.2:7687,192.168.0.3:7687 -``` - -Note that the IP addresses used in the example match the individual cluster -nodes IP addresses, but the ports used are the Bolt server ports exposed by -each node (currently the default value of `7687`). - -The user can now start the proxy by using the following command: - -```plaintext -systemctl start memgraph_ha_proxy -``` - -After the proxy has been started, the user can query the HA cluster by -connecting to the HA Memgraph proxy IP address using their favorite Bolt -client. - -## Integration with Memgraph - -The first thing that should be defined is a single instruction within the -context of Raft (i.e. a single entry in a replicated log). -These instructions should be completely deterministic when applied -to the state machine. We have therefore decided that the appropriate level -of abstraction within Memgraph corresponds to `Delta`s (data structures -which describe a single change to the Memgraph state, used for durability -in WAL). Moreover, a single instruction in a replicated log will consist of a -batch of `Delta`s which correspond to a single transaction that's about -to be **committed**. - -Apart from `Delta`s, there are certain operations within the storage called -`StorageGlobalOperations` which do not conform to usual transactional workflow -(e.g. Creating indices). Since our storage engine implementation guarantees -that at the moment of their execution no other transactions are active, we can -safely replicate them as well. In other words, no additional logic needs to be -implemented because of them. - -Therefore, we will introduce a new `RaftDelta` object which can be constructed -both from storage `Delta` and `StorageGlobalOperation`. Instead of appending -these to WAL (as we do in single node), we will start to replicate them across -our cluster. Once we have replicated the corresponding Raft log entry on -majority of the cluster, we are able to safely commit the transaction or execute -a global operation. If for any reason the replication fails (leadership change, -worker failures, etc.) the transaction will be aborted. - -In the follower mode, we need to be able to apply `RaftDelta`s we got from -the leader when the protocol allows us to do so. In that case, we will use the -same concepts from durability in storage v2, i.e., applying deltas maps -completely to recovery from WAL in storage v2. - -## Test and Benchmark Strategy - -We have already implemented some integration and stress tests. These are: - -1. leader election -- Tests whether leader election works properly. -2. basic test -- Tests basic leader election and log replication. -3. term updates test -- Tests a specific corner case (which used to fail) - regarding term updates. -4. log compaction test -- Tests whether log compaction works properly. -5. large log entries -- Tests whether we can successfully replicate relatively - large log entries. -6. index test -- Tests whether index creation works in HA. -7. normal operation stress test -- Long running concurrent stress test under - normal conditions (no failures). -8. read benchmark -- Measures read throughput in HA. -9. write benchmark -- Measures write throughput in HA. - -At the moment, our main goal is to pass existing tests and have a stable version -on our stress test. We should also implement a stress test which occasionally -introduces different types of failures in our cluster (we did this kind of -testing manually thus far). Passing these tests should convince us that we have -a "stable enough" version which we can start pushing to our customers. - -Additional (proper) testing should probably involve some ideas from -[here](https://jepsen.io/analyses/dgraph-1-0-2) - -## Possible Future Changes/Improvements/Extensions - -There are two general directions in which we can alter HA Memgraph. The first -direction assumes we are going to stick with the Raft protocol. In that case -there are a few known ways to extend the basic algorithm in order to gain -better performance or achieve extra functionality. In no particular order, -these are: - -1. Improving read performance using leader leases [Section 6.4 from Raft thesis] -2. Introducing cluster membership changes [Chapter 4 from Raft thesis] -3. Introducing a [learner mode](https://etcd.io/docs/v3.3.12/learning/learner/). -4. Consider different log compaction strategies [Chapter 5 from Raft thesis] -5. Removing HA proxy and implementing our own HA Memgraph client. - -On the other hand, we might decide in the future to base our HA implementation -on a completely different protocol which might even offer different guarantees. -In that case we probably need to do a bit more of market research and weigh the -trade-offs of different solutions. -[This](https://www.postgresql.org/docs/9.5/different-replication-solutions.html) -might be a good starting point. - -## Reading materials - -1. [Raft paper](https://raft.github.io/raft.pdf) -2. [Raft thesis](https://github.com/ongardie/dissertation) (book.pdf) -3. [Raft playground](https://raft.github.io/) -4. [Leader Leases](https://blog.yugabyte.com/low-latency-reads-in-geo-distributed-sql-with-raft-leader-leases/) -5. [Improving Raft ETH](https://pub.tik.ee.ethz.ch/students/2017-FS/SA-2017-80.pdf) diff --git a/docs/feature_spec/obsolete/kafka-integration.md b/docs/feature_spec/obsolete/kafka-integration.md deleted file mode 100644 index f3b9af447..000000000 --- a/docs/feature_spec/obsolete/kafka-integration.md +++ /dev/null @@ -1,117 +0,0 @@ -# Kafka Integration - -## openCypher clause - -One must be able to specify the following when importing data from Kafka: - -* Kafka URI -* Kafka topic -* Transform [script](transform.md) URI - - -Minimum required syntax looks like: -```opencypher -CREATE STREAM stream_name AS LOAD DATA KAFKA 'URI' - WITH TOPIC 'topic' - WITH TRANSFORM 'URI'; -``` - - -The full openCypher clause for creating a stream is: -```opencypher -CREATE STREAM stream_name AS - LOAD DATA KAFKA 'URI' - WITH TOPIC 'topic' - WITH TRANSFORM 'URI' - [BATCH_INTERVAL milliseconds] - [BATCH_SIZE count] -``` -The `CREATE STREAM` clause happens in a transaction. - -`WITH TOPIC` parameter specifies the Kafka topic from which we'll stream -data. - -`WITH TRANSFORM` parameter should contain a URI of the transform script. - -`BATCH_INTERVAL` parameter defines the time interval in milliseconds -which is the time between two successive stream importing operations. - -`BATCH_SIZE` parameter defines the count of Kafka messages that will be -batched together before import. - -If both `BATCH_INTERVAL` and `BATCH_SIZE` parameters are given, the condition -that is satisfied first will trigger the batched import. - -Default value for `BATCH_INTERVAL` is 100 milliseconds, and the default value -for `BATCH_SIZE` is 10; - -The `DROP` clause deletes a stream: -```opencypher -DROP STREAM stream_name; -``` - -The `SHOW` clause enables you to see all configured streams: -```opencypher -SHOW STREAMS; -``` - -You can also start/stop streams with the `START` and `STOP` clauses: -```opencypher -START STREAM stream_name [LIMIT count BATCHES]; -STOP STREAM stream_name; -``` -A stream needs to be stopped in order to start it and it needs to be started in -order to stop it. Starting a started or stopping a stopped stream will not -affect that stream. - -There are also convenience clauses to start and stop all streams: -```opencypher -START ALL STREAMS; -STOP ALL STREAMS; -``` - -Before the actual import, you can also test the stream with the `TEST -STREAM` clause: -```opencypher -TEST STREAM stream_name [LIMIT count BATCHES]; -``` -When a stream is tested, data extraction and transformation occurs, but no -output is inserted in the graph. - -A stream needs to be stopped in order to test it. When the batch limit is -omitted, `TEST STREAM` will run for only one batch by default. - -## Data Transform - -The transform script is a user defined script written in Python. The script -should be aware of the data format in the Kafka message. - -Each Kafka message is byte length encoded, which means that the first eight -bytes of each message contain the length of the message. - -A sample code for a streaming transform script could look like this: - -```python -def create_vertex(vertex_id): - return ("CREATE (:Node {id: $id})", {"id": vertex_id}) - - -def create_edge(from_id, to_id): - return ("MATCH (n:Node {id: $from_id}), (m:Node {id: $to_id}) "\ - "CREATE (n)-[:Edge]->(m)", {"from_id": from_id, "to_id": to_id}) - - -def stream(batch): - result = [] - for item in batch: - message = item.decode('utf-8').strip().split() - if len(message) == 1: - result.append(create_vertex(message[0]))) - else: - result.append(create_edge(message[0], message[1])) - return result - -``` - -The script should output openCypher query strings based on the type of the -records. diff --git a/docs/feature_spec/replication.md b/docs/feature_spec/replication.md deleted file mode 100644 index 218897f03..000000000 --- a/docs/feature_spec/replication.md +++ /dev/null @@ -1,222 +0,0 @@ -# Replication - -## High Level Context - -Replication is a method that ensures that multiple database instances are -storing the same data. To enable replication, there must be at least two -instances of Memgraph in a cluster. Each instance has one of either two roles: -main or replica. The main instance is the instance that accepts writes to the -database and replicates its state to the replicas. In a cluster, there can only -be one main. There can be one or more replicas. None of the replicas will accept -write queries, but they will always accept read queries (there is an exception -to this rule and is described below). Replicas can also be configured to be -replicas of replicas, not necessarily replicas of the main. Each instance will -always be reachable using the standard supported communication protocols. The -replication will replicate WAL data. All data is transported through a custom -binary protocol that will try remain backward compatible, so that replication -immediately allows for zero downtime upgrades. - -Each replica can be configured to accept replicated data in one of the following -modes: - - synchronous - - asynchronous - - semi-synchronous - -### Synchronous Replication - -When the data is replicated to a replica synchronously, all of the data of a -currently pending transaction must be sent to the synchronous replica before the -transaction is able to commit its changes. - -This mode has a positive implication that all data that is committed to the -main will always be replicated to the synchronous replica. It also has a -negative performance implication because non-responsive replicas could grind all -query execution to a halt. - -This mode is good when you absolutely need to be sure that all data is always -consistent between the main and the replica. - -### Asynchronous Replication - -When the data is replicated to a replica asynchronously, all pending -transactions are immediately committed and their data is replicated to the -asynchronous replica in the background. - -This mode has a positive performance implication in which it won't slow down -query execution. It also has a negative implication that the data between the -main and the replica is almost never in a consistent state (when the data is -being changed). - -This mode is good when you don't care about consistency and only need an -eventually consistent cluster, but you care about performance. - -### Semi-synchronous Replication - -When the data is replicated to a replica semi-synchronously, the data is -replicated using both the synchronous and asynchronous methodology. The data is -always replicated synchronously, but, if the replica for any reason doesn't -respond within a preset timeout, the pending transaction is committed and the -data is replicated to the replica asynchronously. - -This mode has a positive implication that all data that is committed is -*mostly* replicated to the semi-synchronous replica. It also has a negative -performance implication as the synchronous replication mode. - -This mode is useful when you want the replication to be synchronous to ensure -that the data within the cluster is consistent, but you don't want the main -to grind to a halt when you have a non-responsive replica. - -### Addition of a New Replica - -Each replica, when added to the cluster (in any mode), will first start out as -an asynchronous replica. That will allow replicas that have fallen behind to -first catch-up to the current state of the database. When the replica is in a -state that it isn't lagging behind the main it will then be promoted (in a brief -stop-the-world operation) to a semi-synchronous or synchronous replica. Slaves -that are added as asynchronous replicas will remain asynchronous. - -## User Facing Setup - -### How to Setup a Memgraph Cluster with Replication? - -Replication configuration is done primarily through openCypher commands. This -allows the cluster to be dynamically rearranged (new leader election, addition -of a new replica, etc.). - -Each Memgraph instance when first started will be a main. You have to change -the role of all replica nodes using the following openCypher query before you -can enable replication on the main: - -```plaintext -SET REPLICATION ROLE TO (MAIN|REPLICA) WITH PORT ; -``` - -Note that the "WITH PORT " part of the query sets the replication port, -but it applies only to the replica. In other words, if you try to set the -replication port as the main, a semantic exception will be thrown. -After you have set your replica instance to the correct operating role, you can -enable replication in the main instance by issuing the following openCypher -command: -```plaintext -REGISTER REPLICA name (SYNC|ASYNC) [WITH TIMEOUT 0.5] TO ; -``` - -The socket address must be a string of the following form: - -```plaintext -"IP_ADDRESS:PORT_NUMBER" -``` - -where IP_ADDRESS is a valid IP address, and PORT_NUMBER is a valid port number, -both given in decimal notation. -Note that in this case they must be separated by a single colon. -Alternatively, one can give the socket address as: - -```plaintext -"IP_ADDRESS" -``` - -where IP_ADDRESS must be a valid IP address, and the port number will be -assumed to be the default one (we specify it to be 10000). - -Each Memgraph instance will remember what the configuration was set to and will -automatically resume with its role when restarted. - - -### How to See the Current Replication Status? - -To see the replication ROLE of the current Memgraph instance, you can issue the -following query: - -```plaintext -SHOW REPLICATION ROLE; -``` - -To see the replicas of the current Memgraph instance, you can issue the -following query: - -```plaintext -SHOW REPLICAS; -``` - -To delete a replica, issue the following query: - -```plaintext -DROP REPLICA 'name'; -``` - -### How to Promote a New Main? - -When you have an already set-up cluster, to promote a new main, just set the -replica that you want to be a main to the main role. - -```plaintext -SET REPLICATION ROLE TO MAIN; # on desired replica -``` - -After the command is issued, if the original main is still alive, it won't be -able to replicate its data to the replica (the new main) anymore and will enter -an error state. You must ensure that at any given point in time there aren't -two mains in the cluster. - -## Limitations and Potential Features - -Currently, we do not support chained replicas, i.e. a replica can't have its -own replica. When this feature becomes available, the user will be able to -configure scenarios such as the following one: - -```plaintext -main -[asynchronous]-> replica 1 -[semi-synchronous]-> replica 2 -``` - -To configure the above scenario, the user will be able to issue the following -commands: -```plaintext -SET REPLICATION ROLE TO REPLICA WITH PORT ; # on replica 1 -SET REPLICATION ROLE TO REPLICA WITH PORT ; # on replica 2 - -REGISTER REPLICA replica1 ASYNC TO "replica1_ip_address:port1"; # on main -REGISTER REPLICA replica2 SYNC WITH TIMEOUT 0.5 - TO "replica2_ip_address:port2"; # on replica 1 -``` - -In addition, we do not yet support advanced recovery mechanisms. For example, -if a main crashes, a suitable replica will take its place as the new main. If -the crashed main goes back online, it will not be able to reclaim its previous -role, but will be forced to be a replica of the new main. -In the upcoming releases, we might be adding more advanced recovery mechanisms. -However, users are able to setup their own recovery policies using the basic -recovery mechanisms we currently provide, that can cover a wide range of -real-life scenarios. - -Also, we do not yet support the replication of authentication configurations, -rendering access control replication unavailable. - -The query and authentication modules, as well as audit logs are not replicated. - -## Integration with Memgraph - -WAL `Delta`s are replicated between the replication main and replica. With -`Delta`s, all `StorageGlobalOperation`s are also replicated. Replication is -essentially the same as appending to the WAL. - -Synchronous replication will occur in `Commit` and each -`StorageGlobalOperation` handler. The storage itself guarantees that `Commit` -will be called single-threadedly and that no `StorageGlobalOperation` will be -executed during an active transaction. Asynchronous replication will load its -data from already written WAL files and transmit the data to the replica. All -data will be replicated using our RPC protocol (SLK encoded). - -For each replica the replication main (or replica) will keep track of the -replica's state. That way, it will know which operations must be transmitted to -the replica and which operations can be skipped. When a replica is very stale, -a snapshot will be transmitted to it so that it can quickly synchronize with -the current state. All following operations will transmit WAL deltas. - -## Reading materials - -1. [PostgreSQL comparison of different solutions](https://www.postgresql.org/docs/12/different-replication-solutions.html) -2. [PostgreSQL docs](https://www.postgresql.org/docs/12/runtime-config-replication.html) -3. [MySQL reference manual](https://dev.mysql.com/doc/refman/8.0/en/replication.html) -4. [MySQL docs](https://dev.mysql.com/doc/refman/8.0/en/replication-setup-slaves.html) -5. [MySQL master switch](https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-switch.html) diff --git a/docs/presentation/latex-template/README.md b/docs/presentation/latex-template/README.md deleted file mode 100644 index d649be4a9..000000000 --- a/docs/presentation/latex-template/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Memgraph LaTeX Beamer Template - -This folder contains all of the needed files for creating a presentation with -Memgraph styling. You should use this style for any public presentations. - -Feel free to improve it according to style guidelines and raise issues if you -find any. - -## Usage - -Copy the contents of this folder (excluding this README file) to where you -want to write your own presentation. After copying, you can start editing the -`template.tex` with your content. - -To compile the presentation to a PDF, run `latexmk -pdf -xelatex`. Some -directives require XeLaTeX, so you need to pass `-xelatex` as the final option -of `latexmk`. You may also need to install some packages if the compilation -complains about missing packages. - -To clean up the generated files, use `latexmk -C`. This will also delete the -generated PDF. If you wish to remove generated files except the PDF, use -`latexmk -c`. diff --git a/docs/presentation/latex-template/mg-beamer.cls b/docs/presentation/latex-template/mg-beamer.cls deleted file mode 100644 index 2f4569c77..000000000 --- a/docs/presentation/latex-template/mg-beamer.cls +++ /dev/null @@ -1,82 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesClass{mg-beamer}[2018/03/26 Memgraph Beamer] - -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{beamer}} - -\ProcessOptions \relax - -\LoadClass{beamer} - -\usetheme{Pittsburgh} - -% Memgraph color palette -\definecolor{mg-purple}{HTML}{720096} -\definecolor{mg-red}{HTML}{DD2222} -\definecolor{mg-orange}{HTML}{FB6E00} -\definecolor{mg-yellow}{HTML}{FFC500} -\definecolor{mg-gray}{HTML}{857F87} -\definecolor{mg-black}{HTML}{231F20} - -\RequirePackage{fontspec} -% Title fonts -\setbeamerfont{frametitle}{family={\fontspec[Path = ./mg-style/fonts/]{EncodeSansSemiCondensed-Regular.ttf}}} -\setbeamerfont{title}{family={\fontspec[Path = ./mg-style/fonts/]{EncodeSansSemiCondensed-Regular.ttf}}} -% Body font -\RequirePackage[sfdefault,light]{roboto} -% Roboto is pretty bad for monospace font. We will find a replacement. -% \setmonofont{RobotoMono-Regular.ttf}[Path = ./mg-style/fonts/] - -% Title slide styles -% \setbeamerfont{frametitle}{size=\huge} -% \setbeamerfont{title}{size=\huge} -% \setbeamerfont{date}{size=\tiny} - -% Other typography styles -\setbeamertemplate{frametitle}[default][center] -\setbeamercolor{frametitle}{fg=mg-black} -\setbeamercolor{title}{fg=mg-black} -\setbeamercolor{section in toc}{fg=mg-black} -\setbeamercolor{local structure}{fg=mg-orange} -\setbeamercolor{alert text}{fg=mg-red} - -% Commands -\newcommand{\mgalert}[1]{{\usebeamercolor[fg]{alert text}#1}} -\newcommand{\titleframe}{\frame[plain]{\titlepage}} -\newcommand{\mgtexttt}[1]{{\textcolor{mg-gray}{\texttt{#1}}}} - -% Title slide background -\RequirePackage{tikz,calc} -% Use title-slide-169 if aspect ration is 16:9 -\pgfdeclareimage[interpolate=true,width=\paperwidth,height=\paperheight]{logo}{mg-style/title-slide-169} -\setbeamertemplate{background}{ - \begin{tikzpicture} - \useasboundingbox (0,0) rectangle (\the\paperwidth,\the\paperheight); - \pgftext[at=\pgfpoint{0}{0},left,base]{\pgfuseimage{logo}}; - \ifnum\thepage>1\relax - \useasboundingbox (0,0) rectangle (\the\paperwidth,\the\paperheight); - \fill[white, opacity=1](0,\the\paperheight)--(\the\paperwidth,\the\paperheight)--(\the\paperwidth,0)--(0,0)--(0,\the\paperheight); - \fi - \end{tikzpicture} -} - -% Footline content -\setbeamertemplate{navigation symbols}{}%remove navigation symbols - \setbeamertemplate{footline}{ - \begin{beamercolorbox}[ht=1.6cm,wd=\paperwidth]{footlinecolor} - \vspace{0.1cm} - \hfill - \begin{minipage}[c]{3cm} - \begin{center} - \includegraphics[height=0.8cm]{mg-style/memgraph-logo.png} - \end{center} - \end{minipage} - \begin{minipage}[c]{7cm} - \insertshorttitle\ --- \insertsection - \end{minipage} - \begin{minipage}[c]{2cm} - \tiny{\insertframenumber{} of \inserttotalframenumber} - \end{minipage} - \end{beamercolorbox} -} - -\endinput diff --git a/docs/presentation/latex-template/mg-style/fonts/EncodeSansSemiCondensed-Regular.ttf b/docs/presentation/latex-template/mg-style/fonts/EncodeSansSemiCondensed-Regular.ttf deleted file mode 100644 index 4964bd2b1ebdb33a76c174d9f6653208fd61515a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170864 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�aa5oECXR7K>SkWXnJt`-q1R z86|=z2)u=OfCVxb%hC`2Wo$DirNOWu4AH>)*$|itthWI)nGN#KhSs63`VI#UNYdyu zFtJsZW*&uaL-1%At%q+3V0&%7JR;4av&*p%e3~=}IE$_k*uOM#B!b6;EtdYqfl;a~ z`GKsIR4~&R&~0>9wmeopfLNIbc4p-`{QzNQl74`)a=d;Zij~Rw0TnA#^aIhXoS+|w zVdX9Q0W~Y9>A?!Z?y{;8ES#n@$mn)9L9*q{h|a`N=StC;715ay>hz1wiF!$n&-yp? z`yS{w5#-W=eyp4X`mr(<^kZcj=*P-*(2tdqK|fYzfPSo;0{XFXD(J^by%l_)0w8ilMmnWM>SYnH3ukfzg>^aH)3p(r|ope0in1eiLx zktL1N1@*_Uj_6X3;S7@8U}1?g268g+1n8M)Jq4N=v2g(xb2DUb~q{+nUY=K;c ztW#lli; zy+Kz3OD>Zhi$)+Cc7bX#)GDAWw7LuDeKX=3(-cpEyxH=tL2lgoimMvg7GSu_LHEvt zL}6f7bjS(T`sx%|GIb>lh5-W_0~2)Cklvb<>LIeqLr)6!Z+v>7M5u+uM9BHgc>%;JFtYXSm$y6{~pA% zzb&Nxow#KdW+|#9tuSR$M1)LgP-L`2ZY|6T+Q9*}qO3{GOUx3ACLyI~gVJNg1c&Vg z%;nJrITz-0`FFHe068>fw44VxbM$fn6myx~>|kJ>1J>1`r7HC-gyp$l*m?S+kgNcx z0st{!zWylUE!6<xl#G%D{c$FWA>H!jM z4Ga%4yd?~eL$@(J4lQMP9J-zHv;x{P#*+beFrEx(WIP$*WH=50niviPni&oQS{M!k zTwE>-K&@OZ2DNdy7}UtHwm7(63HwVT)Yh#mp55xoLr=zTzEh9J30fDB=^ z02#uafLjuxw}#g^y}Ja+(ANr(q2CQ7O9Z`j0%QpH2#_JH2i#jj^zP*~PH%$%8Tx$! zWat}VBOlLzZ!Nt&p8rT`4EwGx2 z%b(5xDcbTqddEUHB%*=!&({DXj(r2hk>_`X8` diff --git a/docs/presentation/latex-template/mg-style/memgraph-logo.png b/docs/presentation/latex-template/mg-style/memgraph-logo.png deleted file mode 100644 index ed9518596b4449a5bce52e496b944056603972eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27184 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 diff --git a/docs/presentation/latex-template/mg-style/title-slide-169.png b/docs/presentation/latex-template/mg-style/title-slide-169.png deleted file mode 100644 index 71a49a9a1413bad4ca47b8f9d75014eb287dfeeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189077 zcmeFZXHe5!_cj{3h=_`S(nS&JN)-@7l_mt~9hKgDCjmr2X`zD%1f+zH^j-v|_t0CU z_a15>Iq`YV|DAbf&be>S*E0_v0y7D)_u6Z(b**b%>-R-XRi6AN?M(mxK(44Ds}2B= z;(jE$bAuT7?d~(jLfkh(ODPp80H6#?cKMzN0FVSI%1UW^;cd@(`Wdc#J;f?#@fhq@ z&(b|0;E{aZ6g)&a6os>&EAn@4ko$*$l32SUB8}1acjB*SQNgF@&9v3k~hij0F)M> zokMr8yC!D9FURYh74DP*?^81a;@g;@nUAl#CP~0&B9bYy0}XE&U46`ch5=iUDAcNOFUBQ)s+Oc^sI5e6*o*gMvf93#d&i=}rDR>I6c zh?VCt&hW4ZpxhJFMF7*Uo&R@?{eQZj40rT+zI`5(H1@GYV{ZB0gQe#F*)?+?T z18jfS`uNV}hDiAva=e@s>l^EE{kvA~gB9D?tzYTQaEt@VIl--sC9wjz>J0&71_PM| z7)FB2$Pu;jnd`E+Ynco^Lw0&yn&ehsfa8se?A{m_HI(>WETA2D!h>fdY9Qy~uaa#( zq2Mjnaa}WJ;K+*CTZ0*^dn{F_R|LrON3;-Y8{riW0 zSw2{naFvtg@7tytI{2`>~vUYwy&t%HI20X4OiJWdq-Xtin)iC zRIA6dGJ~)y&2{cuwg}7kI(gk|dz5ToM9`TXqqrHqj24FN)w}S>Dr)kn_0WQ))fA!p znVBc<<|-rVNFE83lx5Yf!~^~#v&*6vvHU!?d5kJ8*So~6(SL2nH~n_r`KTn`ONtEL z*pR6^k1*fc(i+j7;=oh~WGm*KX{q7IevMlo3|K8m=IG^t@yZvcE)fQ)FA_a`a;-z6 zKm6-DGoTDa0ru7~%EZFlh~yY#TecH9Ij%d#F*tvi*yu9jVLc7kNVKl_0kT~758R(b z{6f-3ZyH6aHx$avH#R8b(#P<^A-m5+Rzk9#_}W>ViE3YSn_c%6wnl~cLOb#t%&X)g}8MrzoH z{VqOATp|0YD9y)sK?%Wd6{b&bhl#GWd*-~2mXtD^@n%GY!x@?EqitwBbhaXaKyqUs;fZV9h!Z(OTS29Z-5@{gE zft1Ly{AS{5F5=Ot2k~f$(~p&c9$ix=A{H4&F2HMUa~)q3KMh1U6^-$0T`>Wdb%;8ajJLQi_nwo0LbcL=uwc&?@ttO49TW&Tt z@-*P$zU#`oJ*i8%T`1N#9}@v-C}EJ4wY~N5u-;VeS--SKU0vPc5jhv-cXxjQX5{f3UqsZ;9_2BDDZI~WMOy8g^g ztIw2Z_%}WKc{|*AQZh8x-KH_Gsa}ThqUY%FD|ymq-p7zubF0@wEygC`6|M6V;g)=1 zw(5=1cN6f^7UPohUu+kr%uR*4x!MwiU`;J8>*#0AAh>q4==Og5if{|M7{1?M3ULm9 zRqdR0HbO$Jx_SOVC@P$%PPX~txb*ndm@U$;88cSeBj(t|ZLK(OuP+sNIaur;e|dRn zeB~wXGy}st@w_}Aj7_9Q4sR#}w`v@l^#(-t3`>n%8UEdWTA$r#1_(?`*es^XAJ$Z% z=Qw}^9;x8ohgI9dw(gI2{%A3IFP!cv9arZ%9mAGOCnh*Y+I~JXAjwv_3FAue9H;3y zw^;Uk-QAkj*o0?ohua;eplbt<=Cf(my8-mK} z=85#4=fGYb4>X_}5`Mj60uRkEqBEp6Z+S!I^DQ=%RwI9%+<-Y0i5k}w?}+PoAwqpO-@hU-kYiG`cAi7ZSJ7YDL3sVqF_H0$Et2H`MsTC z7NF*~-dQd46P7_qycvI+-8=IQ$GnJB^nAS|bPn^AB;D}_A^zd|W2jHF#6{aF(ic>1 z=iN_QEXxF~u^;5%2@GPyYs`92y3U)D`Zk)<*T;2#_q!D*QHi<_)nV&N# z*Wn6~`~PzLe!>DE;{mF@RH%LLG)X9tuiFOoWtnN%5?3`tQ)y>VJ#3Z6dLBGPh}1L5 z&ZMWO8hVl(k{|t*_dCL#u(Dwukx~>Eg4plIL9mHHzmG-;*DJ^bH_0KdP zyLXPm=v}_F>Vm4Os?#q|&Zj``UNRDO>c|koo31^_Qt+))gB%y^LFzK*W$cC~mM};Aaxw3?b1zN+Mid;xYEH!gW_zYu zL5#?=WVnv+>71we7M&wXr1Hc2l%4{PvW-IG3Uf2F&l9ZT;&XLEQ%Br+ni@uF+vUk? z*kWkkj)R{ zyPF1ni@tju_mr)rIxkP*k^ziPn>tF3jtdD*2cPKG`HdCm%6z7usd7zfL@g?VZ>!fa zOuE?!T*qZ~{^PPI#mAZKt>59>E*~YS4TgW`r(|upk=yIO&Xb{GTl(%Vt(Wu??O}ux zT-bTD1IG}=kalhmwNKb6(F&$6xrW{G_Aa2CFSC^ygV55D-P2pCq>WM`WM-Xkm79?j3IZmgG61umg#OLf410$!c}qP+46aktUX*%|)R z6Go}}86DA_sxYXKl$Auk!#;{gf)v+B-5xtXKV6YHoj#@z=Snhy)EzbNmZfjWGwShj z6C~d*uB_CYo|$3gcCCa2(o#h?b$=1{a`?+( zRp6TF=FopIrehp4N6Qj6k@79Yy!}G{f+4%yGCpZ9F61J_3;O5f zzXFhe)@L;T!CFp*+BwcLK!-n_b2U{BwQGDR-TDOKw>J!C^MV?X+-Iin<4?W=JT*Vm zuBwNeXP9!e8)_7BVfG7h7I&EMK&P7$nFW%=o%J83sn0f=-IPK)f>Su<9f+6I3!{yyI(A0!C8>pI^NUML zRC`XXe^>;V`q{M;mocjiTI@lvO{e5%21Eo>?Ck8jQ{w1r>?iayjzbte$utlIjJ{uh zISsM-FfiP3ff_t`mZw}zhp!&JZr#c*NE0AP9IWk9gcZ0-~zybap0 zSJaNjI5RM^bp*Qm)jL*U0V??FzWYEE+r7(S0&Q~E@>065kYapPde<-0xx!F4Ba?Zq z{wkrS1oH2N!EM0IK=;xMO7SY4@AjtUN7NV2HNGZ}gH^UEr{pGMStT`Zn#~c~3HNE( zTAp`PQ5$+M9Z#6gRNK3thUMi;O7cr$*kE2P>N?lKjosvyu+fg_MjgJXv zJm{d~^FF)}3QXziyCrg%m-R$^4iosxp+TUQk`q9M-aM1usRcdr(o{lt0kgg&psaKz1e!hAqS z_Guc2`cViE$OcHu{`vNWE^rvFI?z#4wp723WZ}cwG}v?*$jB8Ex(nr~uKhd+5-pRF zJSeSUYzqEd1kI?_7F2+%HpM40QdQF))_^bp7Z*N%i=g`-6~_(a0@q89lfWSD5awWdn^cyzd^0Mu0 z0F;O$b)yx-!wwk2=y%b&Hr0JGfcv6o< z1DPiqL+s$%5vpWtZ0xWP0g}H!ck&N*rHlK<66ZgClltu8!|sX{Dk>_~yl001p=;Ct zw;u+U-2eUPs3+@8?uxe6x}3eWZGlnv#`34Y?d0G zF$W@?py?GBkC@0cUP{5bJiL%?K##ss|IO;Hie5L%^_jpn{R3<5ZhLA(nS~T==!1sW z)S@=Z`E*Va+7Na7MApQyb0=l@N{-}Hkv|!rYQmQN``vLnj=T(F_j^?W#g~|gtDrt>i6ALR|?>n+LL5AWK(yLrceh6vZ=xMRz~tmN^shVt@|Ug zhr`z~lz5=i=F*Vw!Q1l=ds>XOHJJ*Y#Uq%)zI@HxAJB4g2vgC;;I<&kxp=Ng3M8;= zcJQ-VL2R%;7ty_@2k8xtbku}5ZGw|iYPS2LYo-@P`#FhH1EA<10jk~>fiN{9CgC&6 zn`gCB8S`5u@6^_fPciB5Gj^|ZpLZG8H&yFR(~bImsxlJu^r9V3t#e&2fSRNUWSc&U z#{rmS)cGF*il^i>Q^B?q#c`~(_)7F;q~sNDd-In35)57iPI*p>u;lk3!*dLA+-^4uAi}V__U0hu$Pwba$?d(Pmw4c&) ztX;!Kuk-(=A=G<1Te<1V!*GKIHomzeVlc~3n9~Csm3IH8jaJO#l5lP(RE?|)l&b7& z=O+6l`r{H{VX5 z{!TLH;&!He$jo zEnC^!#f6OM7vqxUo#^o^Tsdr=C|%AK3z}x-R445s-*yZ3@zEyUEC4JM`f!a>nmX@! za^9F~HcBel$_2X*RLJ+h0#vW6W|rdhE7tm)r61#vviHb>&ctY!r$c>r{^z*$4`i9C zErjs1`$m49szd%SjJp^=9=i|{bxfi> z`*IUdC&gTIQw<)%H~2hyG&Sl^MS5hfhXWDTEwB1VsYlL+!%Mm%$0^;zo@vG1(uFnV}q_sSuo zYp!Ndq2K&5CjeJXK2AswC67lN-SZm!COje1pk8Ptqsd3k+XMLwGfh{Cmi@PbT{}QSJ@T{=rEv~7{W7yX+ehE| z2VTlhbLpPd)klS2=PD-s=PHU*Xa*Nv>YmBVNDSP6H!Q_0Zt)0* zwJW^R6b7=F9b3-GSkBo#!SNBJP$K_X>lQAv#a%HuFMU}hnBx2zpd@eJC`-dp?-*8c zQ__Kz8K#Y2&LOT%l&9sA${{{1m993#CIC)q*a`9W(E+%$%NQX($>{)Y9v9+e+||a* zD=(KWs7i?fC(7EleInJ*vk+U*&>^3GPPV?vLE)b`s5S)%|hn(L8#`H+hI(UdM9#oLu5T>ddty!$+}enHQilp06(7yV|zoJg#ciFZELz zh9O0TUH9hqhD@~#q!9rsy4&;Od0SUA90KiTWB%I<;{xTTKOg(9>_6Ym3l2zO)uA9^ zHKE;!rra$Hmmc$%4)P?x;f#Sgbnavo1NfDX7<2JT)%fve>jqpwkfQ=KX4ccwi%|x> zI*`?K`*rsN!q}U1P}U)0`Ui*LTB@hR^5TN=puY%(g?X@v?ra!hYW?bttAX7D z;M^q79~ml@QYaZ4TbrCWh4)yuIxmt%3JXP{!O_}AWz(bpxzmY>oiW>SH@a_ADVDfe z-JKSbpO^OpFskEJ^6$cOb;AsK^(ViPt7?ppEbZ@8CJY6D`?eRnEs)KO)uxe-aIU7j zJ$2<~mRJ#!Afbi$$hf4koxH0IhS4xFIfBwBl(qqB)BeW;Hx-YFo`}zXM+DTZas5I( zGi{T~2q5;cyWl0;pVWMxxih3`oT&zFV9;;S2tGD$I5nut)K0@M;(zXvYsfLH^&q@t zqRjh<#!bv(%!j9GyWFAkqTEzN+sLn*l@HR0Y5qQq3&r1079DSQjA~JLbPo)8eB`fI zt^P%ZoqUFiK?-0QnM=IT!Q`2Uhy3+Mp7TU&VpNIs4BPDkzZ5A~vS^GZccQxE;9bct zOzRoKs}S?^JS*sv-=e=?TqCN##Yy$8D*a|@$+4r>XB`{>9A)w@d>~;3sxM0*DWA&5 z=V60Hips;o^)Y*yXs$KW_e{M_lhqaLOa^H8DeqE=1}$OY8bKzj*pOHba)A3MX^9QI z;;`@UnT^E48yKoiHc;=5`BdSAy$Nn?C`yLQ4TjyaFsbU=N3bCew=ougr-{`}xYHQ<#Y8ZORZlqclDN3InvdBObB$&7r;9gq z#!NQg0Qkt{gM!if=$nr6aa!94&8I7^=NuTm0mr=)lO*i7uf@A5|IL8s^Q^y(0-4CLx;LKPBOKYuAP&SAT|qcs zX}xJ;#YB z@;<}KoY`|`JY_Y8_G`wY40>`rJ=Tm84oQb0w#wa`7qw#n+xo)yM_uht326;-?EMdw zUIc|iXJlQG+*a`R_8ze=$<5n>Ay1=QHcCuWEAW?d^5N zmuyn~^-@h&_rcP$(CcKuih!pwR$0>TLNW6GWaqj>%`f?5#zXGZO`3hr7jB{;H{B6pcC@Q_TYKP3Ryz!RG^yHdWr1VZ8&~ z_Fb2>B#BvUrDFBCR5=IGD8X;mUijAi!cEXKfl;bEE;6z|bG5BY9isRb7sL(gJxfO? z##q5tKJ_4r!F0+a(Za>0oSrwRe(SJ?6I0sT;lo9=sv#lzu~pU8LQ{oHOzie+Q4HxJ ze6HhfuA1bod~YDD+@@SaP9{y!X4bo$+C|aky@|&@)#9f5Qc|T$Ww+z+({zgVUGIJk zp<4{0i%ASsrMViwZnT)(H209;6>cLUYL z{wQp=OwuBoY(e#Hl=a+hsaMu>&2u)x6*h630$$4*aR-f$dhX1gVL$c{1_WT+N%$Lm zy=C1)Z3zMO1$gd6fr~m4zRF4;P8N(?4=mJhETszizGq4I@1TKM@b8$~ zs^^x(rl)&73;a)Lh(F&4S#mysjUQgY3aZAZ=!*v7Ev^{FX=I>IRa>;gAmawlINaWV zDx>XKpJ-jB_<>sl1A|&2Z$bQOQ$mV)`9>2;ym-nr)eBnOkP_@Z>+11k@XOxWa)cvS z(ou_V`Pm3!`C|*jkg;VMI-)(69g`k_2&X&T=$*cBV1M`!FQd(5QD!<>e;{_4iu4n|hX`zh!v*BZ>fdDeX`?ZVd$QZ$#2aJ3vO z(251}cs%bdNs}=388rB?D=aLioZn1qWUMX-9#0F3vZ~57F?K3rxP+KNXLbw_6NZ z^-THQM1Kg7lWu_DhO6wY?8=jToGp;tebJCxm&Y-+A9~rSa<18E35BoqeHCL{aCfb| z*ZYt{y1gcmRAc}Cq)qv%U}B?pEH~1;0U0_YiP<^*Y6FP z-Qdn4;wX@tAL(J&cK%Baw+0dgraq4*ChmB1Pw$77lZk7yHn=niPu^+^!{`m{H2Gsr~6x+YXfmikUg z1|n2NRn7VBWn%*)U z-f;A`91~DV`||7qI8xQpxn08HMi=>&?mm1=S4XmIM721FWhrJMcu0D*1Z!`w&KO1Y(+}SkT0{Ujh~WdZS}4pw#;tEmDZY= z5Gj>OyXk4FOHwP^PI64G#>XklTjkJIZVD3yACD(zSdygxXY-g#j-9d??@WXN$O;r-EUt5+*VzDnb_9j2LA&O*Q3D274SEDDjA=mf2w?eau!{>}Qc#+PR+uIe_X( zL!XF=mKJMdWMq2D3d=PLno(TyG`u%vmY?7E;=}T;uD6#T|RX7#Kxe!pbb#6ov-Uv=|%})YqUs+BtoLW0cbMBoj za^tNT)~63D?8R%e_48Jh0-*Z>#n6wjFIoW#Re}0P`XP|dYoVZ*3N$)||T=f<$ z5;;@YvLHG%GQ!f}vF-Fxl=@JyauQ|o@Zm+n{-kzkb6Xu>{owYt9ZojE0Ts6*wr?Y3 zb1kNQ@3hKgky$TEOaw|tins3Ar*OJxU@B-n}(=z5CC7!lCRWDv33U_kf zggFs+dgB!r*9Q>7)?*p` zvK@o&JSr$SYM3n>yrv5Op;pgpG*SsHO!<&DJuUrm+)m60>p97$nv?^3i4Yk_0_zZ+ zz1^Pk%!8$ub=e8y3X-sSt#h_|4z-DD@xt?_Sd4^A>!~146Dd%Laxy3ez8aljmXdw zm*0DG1)G96P8}6a9LOhdD=Wbz)!x8zJvRSEV5x2EpUb$=akD0gtbM7pD6Y%oj40Ol zeo~SEH~G*df$&uBMoqK1rj*$-l=}9#dNrup55qa)ks&3DZ+-8UO&SBaD3O~!zol4X z^_5$9JSmet*V-ip`9z$J(<2o8O8?;0b9trLpEWR78%$L!x%4S&b_n#$@BU5ZjY`vL z&w=mwB3D%~MIX!^ZG*6*+dto_6)h^4TVO}IKgG?5-jp1NBlkR|MYP{`ZpaXbQyXt6 zhwna~0&BnTN?#EoBb>S#?woZc(3@${ea^21ZnH&Yy$SKX>*u0Undy*H_4(m@-8=Vg+ z>y4h9uOpojwNYgNwX@+ElIiA^-r1#UhY8?}JI4DvMu43yC&dB zjrq=8GnW(ulga!>%>Y^VpOcX^de1C2 zqpi+vzakjxc?Vx|H7+iWl8^Rd3w7*9Z{_>4kmu17Tp5%MBVWd_?-(j<%0mYEs- zQBlT`??@J$Zr&}BX*%X#G!5mZ#(c30J>~wDMHIfgvG+N?sf4b{pc}axy{aR;#p$6? z&wEF|vM0tK-G&~}hnm||Wtj^bKV72uHr0@Y$Edge725TY7sjh6I+y}Na#s>&RqrIL z+@+3>7{6`p=Q{|1b?pSPzZ-M0DG-#sj=)m#T|Ai@-m@`@eOQf6RT_2LrZUNVzQ1TY zmGi9oGFX5<9#*PsyxbLS|3*UHtdA=ugoTa3Oe8~Lg~@Uzy$C1eEuIlbKG;xGW$!Daiior0xE1G=XUwLl;I}Z$#F_Hn#%(;`XU50JE9hB&<mLgkYvl_R`mKeNZ`ZIF*okr!>LXljN~OGtKN&URRF8+DNURj( z7>P~T7cFJuRvVq1%+nasD=03ULhA*8Z)|LYpaq46#WZ~NO7*_#@mXvqmyn>|7v`5K zPK!w+e(GsGDC5v(dn9kw6kOgGJnxQO%7un%yoK%j)D2#~CqyiM{ z2Ngwv(ZdpcuusI}RwfjXUJ*Q==cP@R|*^N_FbPpZaARKwieX6fV&ZWvRaNbuJ^_ zY@TG&$Mx)+t)&jG=M`j~1lQy-JN@YR_XpyUY+1yPLIbda(% zjBi!657xYRsXW>&J|pfpbHQ=A=_t1f>pRX zd~GR=P!g;Qr|BAvgH{B|OuMYTiD7L)M>KkGKxL;1L{rty*ffcr-6t-8rEw(IkmGHc zzs&H$SD|w$=V+5)>=2E-(%x-3mB=sT*RZ#6{Q2WSaapERb@M?;#q323mJ@b?g0E1* zE@|KeDiOU)jOCVE@kwHM@w$UPr)i!mW#n`#NiAo=smBWxy^$toja+*50uKIH;${9= zh_@zz;7MHF>AdfXZ_ph;IfoLCmshk`@zO7Qkl5g{8{f}smk309e51^*KW{)D-_I== zmf+;%NS&B#X(?za<@P8&Hz+JF-th#^e*X7*GFl(MJ^r>Lcl=$E={a)!tFJD25lq}R;T8e4z%Y4n|%iZRRVlkU9f#9cDZE?^x3$$rrIyrWPLcOgw^KYqx3G zkgTSI9R0@j+o|8VgDI~h96W;{A9`X$g}~`1g;BLykl7~+jo`?)m4a&uE0DCd!eY&K zp!PYNkqn)v=(pWoW5popT}=ar-)U~*=|b;|-iTdgOZi92GVolU=;wnkR1TWX0xNC* zbVk;H>M&nIbz{(2c7)?u-daBFo_Hy6O~}SQ&C&np+sNqTI-xq(Cw|La!@AAQ!WH_o zM4J)^OEWjDrQ`e5G%=5tRIa;-FsWnx-<@q-)K4x@Y(VywVI}FmfEeMlU8kJL6Jv69 zF+n?fs8}eG_5HiL#ALNfI%JdG`}{Xenx%l%O6Hy)+Cs1KtV`iUrY?OjsLq(ds03|ncgJQip@@}4R@byI@2VA$P?)aF6g zi7)Te!!*8?YzoEkU!?7)kc(_oqn*ei&BT{w3#;3l_up(55RT^K93EL*85|A^a zmxVtNJH0$wRyH{=pFL^?Z(ixGJ+wIcJAAMN6&HFom`(ZbcE%(8fSWrF%i)WSn$pxm zB3VX?g36yq(qT5L#{rR)gf~m))P_F2zXdq2Ea;2RlF{eN35Osr<9{DM&S_p zZX1WVs~X^o?WJkVPml9);TBfytJfr~-liR0ApZl`^OJtz?oVGR#i5p%k3@%sSPbv^ zVhg4)BtROWpJ01q-PQyXhO?IUZYNLWez;2TScTqxXTgEt4;S-1^;qN6Ss<3(y-Hu) zCV>0SjjlBRy2mK7Tc_qrlP9<#l1m_r?%m#;V~yo+8`DvYEf(W0a$JdENyuP?>}MuZ zm+h`S_;>9#03S?+(}wDlEi^++%eq3;!38Z_-BMR}+JbC@xNEg7CBG02nHFd-?zxDOK zIUk1l{}tYQw{*Nq2x>;H_{aHQ)$oeoCAy{Y+2I;~v2kgLQq1C9r3X&;5`XpPL`TcI zDieIbbL@9nER2lTF@a1uclGwh$;s2d_kKoBnA2_KIk!T8Iy(j65ojN?op>p(3+T=z zw#_SLl7!BN{d=|wko3dN#^`&npWF;HDoF;A?)_1v>6Pq&}yM9x$+MY7dTzgD$1?%fH+2M}UfOjYA zn7FrbThqFoZ$}FE$kCVx{8{r~!1}$_E;i;yp3k2y*Kd_3p>C03wuOoQb8G$s3D1 zVS4%JSi9sJ<&9(p2tN}mItMqX^_nEa?5B6pxnI=gZ32fWYLq0kiMmLyYPa@ZnB)=% zlz%T}yx3t6wVh-!bnn6k;uLIiPStXv)BM?4kNFEmK+pals0dv+0q&)jl=-)oH32t! zYIAy1!+2z{(g(2TJ0=5h1No*OwDE9Mms&s5xbhZS?m+B8Ha|Bv_u<-%gR4))P;dE4 z?}{s|#aYd#X1@mnInk)QNP$u)`HPE{<+s{7e~a{IF7_H^^tM4Dk1c5~`ipUio)nMU zxN$PyY!oL;@Wk#o5_roZcgIe@G{!}-|AC5|>mo&0Y_1cNd~gz&O?y7RsCa>}ORvHx zRz<5;4m=SAWCI@Y2Ah)^R(UJN&M2fJGVRfaaKW0J(fmZo7J-%eZ{bm6r0B^};}^N7 zEZPaUx_~JnmkLz@AF@B4 z^DPw+5)#e)CKnEk)&K$f^IJ`&m~B@poZDaLk8E^=WbJUXI~UxYs=y5?n_Yf7Xg|r*g+nX>;6#n{`&Nr815&eLCjdoz> zX@zIy?~@rp!qJPaBX!@-B^l9i%XIIK4J1cDF1rnpHr?7FASpY7!+i8FAuW`XUtgGp z^rZ?`Ae$z}#(QKaUaf!fD~iL#1O*3&Jle5fQHJSXUntX>3*Bi;9aHm2Fvwm2KNCG zf0Qn~N#@LOIkt;RU%V^#^GJq5$60qw7Ky8AU)b+hR}}q0OOwHpgcRGQ>5{XIWOd19 zhktJ}B2jt#eFX_Pk2>9ZZKvk(Rl471er!?_%@h+UT@3pVpIa8ag$B#KHOO5;kL?r+ z7`Xbch^13&-jiwOEO~pTX0YyOn*@!Ci{kR?$B+0T*pFl^2>-b(M1Ya^u~tlg+H#wO z!!KXqt<`D+>=S=vCHo;{E#0%k%);i`pbRH3ZxS2ho{5uPZ2_IP7demAzxFZjJa~-@ zx$U2KHr_JmAFQqF$WCu>&c8_h1eOgA@S_##>Q(YOk4{akexg~~m4?r?NySBImH-*~ zn5iU^xi(WRB%Vw9h?{ZLeE?rT6@lJP;UcFvU*#H_>VMraIG$9D5KZ&{D9~v1tXNbV zHyHTcnXQ`#$h;zqf%id{lRivPSX69OC@CvHeiVm;M&uT!K_fbD3b|UH4Y)}a@|stV z{F{zc%h+4DFF%n|F2_wk3Xp?1CLyln>bP{^Y8<9@SvCZ6GiY!~oApP6M}~(NA{Ng5 zCD_)CoFFJx@ceB;{22CTJD;+PdLM7>)hP~hhi%6kZ#_nuZ&q5ntZ32ZH#7;$pyuWkI1fX4B_K=~pM#gN z{!wyx;?~N^{j~Jn5C@S@P7t;WXX}UVr>9B@s>OpFtWodo>51LL{vqM>|M?LD z-2L7EEo~^`_-k4kH}%QJR3bx#VU$Ukv@v9Zb#2sSuU>gT9NP#XGM|MVdpg$Zb*yex zdQNX&*%TC-V=-5%u;IN^fB!QX_GAf{=1Bf`nE&%>L;sJ2Km-TQ-yUzcYFi~Qk(6$I zp8YHZB(cPaoQj3w9PY-ycZj12Gm98rRyMsP+4|vUt<40t^&6m@sm;jf2>>cz zZiWT5eD&;GSp4?=QS_C&&`-S@Tt`okIkG{a9qU=R3|Uur==-}aNXV)XVD_H2#@y`W z3U>6D%V<1b)xKivMtt}=kYVWB&$j${EqzIXZ(*9_@)dU0^+jpf{@|?l(XxT?+!G=3 zamnd4&)J8h_tU&a6kSmFilxW0a6KqJbeX#}P@dANUdL9dfz52hui@=o zUWGtMnkiFPeO_?*FT?hi`%51!F)AD1@M8oeP)EeW#}7C3Y1wDLw@dDpnQcv&_^K3rj0*k`D@c}{>fG_Qn`g_T*|OzG z@P5U+1!<9^BL0=OaGu0&ji;Us&81>{R)2m=zsA+Eg(c0R4q7m1s%unVinxK&>23mU zE~yUf=-KOknSsU2NH^^t%HQaSVBid=;Z1b?zu5cgu&B4FU1kVLK|n$z6r>v@BxVdk zNkv+^Q@UYhL{Ummx)D^A4k_uDR*>%QjvAPrWhAmRBw-Qj;$}ZuJL>H-5;yQ(v2F zaI>tRLyld$z=kVSd)I2y!nj1@5tp8uoAY%mu<9chStuIxelq;Jb-dZ`I#pJq z^I@j?Hggh?i{`6CBtwy5i24a_wi|jfpB4H1Y{o|Vb7`F}1JCQDxjU{ObHnrw1rD3K z{nl{;7$B{c%qW%X=k%(}{yEE6^8|8n*k`E#>WwhYTB3H5AJaN}Os8>`KhxOuLZR|CBO zQqiyYC}STmS(RTK>&Le#Z{dm7K+_?0EI}_KfXu@Y1=l+j4DH^|2^Y(zBn0=?by;}i zZt7rLqMz6zsLM5cU*o=5Rpnu`hIWO$UW!-cRN*nsxHTt^sovi9> z{jC?2Kf;r}U#m697Q|Pnph0rb#SjJtqp@r5%ihY|M>_jwuAV(6?J;~YGn(1*Ui8#| z5Rpv$U(t_63eXv}K{b(FR-*TEy}#MCQdN-KehnY}GzLdS-Bo)}{S34VEnV>IxdYZa z4|UNM@7dLgws)blG<$V!u#mbt;_OMx?9S6i()N8RS}P(Xz_}cV&a!>A3@c(a0oyCV z1wH;37oci;fzKwvm6IA&=6X0Jwr`mN!CcrG5xtb zX>*)cQja$(^0vhC?Zz@Zja7Wda!N-paJ88fS;txD52!MfiwsUo?cv~)F@d320N}s; zV8{d4JR;gHYIsEDW3?rE`N;`@g45h|JbxKAP4Dd3GhYV zaZ5{2Pj@8z9HAmjOO4n&49zP&cnk1xMxWPKsP4lRUo#<-4bh{+wCWQ5zSRObMtW7N zcPS%>=l*rKKMXOr4phb(US}S>X!z9Yu_6bn?ctJ)zsk^%$N@a$s|0IR)d#L?ZDY%U zvi=np*Z{>;kDFUTojc(oSCh~7OPh4pjji%{xvq3kq??p36)crseKXwa{OE2shinb< zS0*{H~32F(Yc;W2he$fF6 z`}Ojb-0|ZM$Uud057~zI=A|<&Ey&HtgJZ6me)jRvtf(E)P8Fi+cI{$Y1KOKW# z2Zs_W+s-mBaLIV#o}mY__{Htrt|@A8z(vy-&vOy(d?|AaH#vo`-T}`Er_QUB+Ai7C zQ=9l@WF6+*-J6JhzQ5?x65??(l@g8A;5n%r_XyDrtU9cb3d74{!@3#_9@~o|J>eIr z+P40%%74(Jaur~GIEU7#f0oj(&$iqbpq!)#pJ+U&1cHb28>H zR=F(Y+aG3FAhjhotIkZfyve?=g7;AloxIdG5Dmisqu)F|3@%D!LoobEIJ;wgzB4(k2tP$;=2^K%@i7M zb*#Z#uibfNrq2;fJVTbI6KN%VHoK@w5@@?$Zy9&*j!gRQ@~BB^b9#;SVaDORyyVNO zJlK1ZRM{I7?QyaNOHZgT>-(7vrdYO~Q!sWE2V@jS8Z8Hkm5#bNBRZR?Nmr`FBB#4! z6awE-xmvfHr})A{8`@fLG?b%fQy3R=CHa~|S2!edw2N3ZlD+M-4Ql*UOHYvgq|Fdy zeq=_Q1y6`${q~%{7sPk#oE$yvL#{B^tbqU$y6Jhkht@u8kU!WrZt54o;-iDSi2VyN z;Wyw9`IK~2%5*Sqk{PNE@nV-aH*4tzn@^(Fc0A}l($e$iO)1Z!OU|*&k%-?$JzO31 zHJ@=w>2F>Fb@p_>mF0Nnm#0l=jV#Ua$+Pp}@C{vBMKxm|Sm}Cu`yeZwP3E(;LkpF8 znh|4fAan*|@Jf%ls5Zb1M-+$cf#66n*zK&>mI9eteN8H)j|%-Re~|nrJ!AzNivkuUbeRmwQCA zudlE2)7SqE4NFR)z|Z^1;E9QvY)L{ZBVQLyxrvRl(huIsx zUcM`JvcT6REkU(jIsvv9NF6}jEl2qsZ%iZaD(LZ_m`Gy>94WsdI4oA;oJ`+FAZpg0xrn$O3R6d`XL-m z$!HsB;|%u@fcGqtxSn&cvGn!ye|n&&r&qAt#$_BsE9BLF6}7e5;Mms67}^U$Zj~M9 zR-iA+r`SnuXGVK3&s6F2u;HA{vVj8IHFAQ?TKw2~kG7v|ZMXA@GUW6P4_|<2w}BW> z2Ib^fC+91^Mm+91u5TN(%5b`Izua#x%b-a-<@iCR)*Z2tkIU&F(a-uS-kD9Bc}ME! zp!;xWxqG2Ah4FX;l^me%`^8RlLhv<3M9C2m;=h~(zfuNB2!42O7YgZwRowFNz1!I6 zCD;m90cM(T&!w1E$Ug9x%xA2)I+;DlL&FjernCwWjbep}lY@JR@`L)| z>8%z9o5XB2m6Nz@cGeGETALh)X)|g#O1wMcC{nJiWRIuaI~gnX`8uKAt}yX&=J|Mt z!gDdfw<;;)6S_wy+B{Mu3Q0%%Nh?D9S7T< zInFi4T*zx4A8vWiSX@>4ZYA;=s9MxG#&eENJhuRn&+b-fYxW^@Erk9~YX%yK&300b zTzT-6*dZbepU+Dm8?Kx)xpRG4smy#sK%&~O57cbY_WoLtdFL_@Fe+Lh+jpz!z)E~; z;Y^lhOATmO6#?&6X*t?k@m5l53+CEYOpb;HZE?Il}EowdREWJa#e>RrN45a zSkr)hjIN^eU|)xPIN#{z#zGbwd+67`v9U4l3A^$=xWtNg0@9U=_dk;K!5W#RMBalM zdd90m89v7cPF`Kf=Y(2hvpK>fb#`q%;>brgco1I&RTU16r$e5V&%H2Gs3CX! z%%*VtEe%V>HL8xV5;*U(P!*I)V^K|rz#D$S+(^HV?F3-Eip~(Rok$w*p_nwY;YiWF zh~m;xxq(Ny_ol^J(M!?ii)r!g11d~Bx~;3L8mgWg$}JD^VJB={eXco6*uxn!ZR^_b3V>u`p`g{dMwXfl)+m)n77Dn ztoUy2d$ZIj{XLX&Jll-0O5aew)Nyr&pWXz#nLBjAB?fXPLFKvEOn2#?M9JQc7f_{Y zdEbmdcEk4_c6nN>^(&PH0&klTK|i0 ze8Uf0HN!}0A?t+ls{cgYZ#4|;aw?W7$sc_*3zaI?9ZAVA1pj;S^Zk3-v4;L*Uq3!2 z5SJ24PO9SaAA$P4-Xa9M{n56-#%P;0Hc%w}7p9&r0tyVL|6j|wpI;fS1qQHhZQf%0 zH@5RvGosCU=CA+$*Y{w|iZLt3TQMMj!Bz~mVp0}{31A2ohG1cME2bR4R9Qdku753^ z$e1uy7N&T`XaX3i1tYcmUsABJb#Ai#d=|i|;D=GOFlrV?&BCZz7&Qx{W?|GUjGBc} zvoLBFM$N*gSr|17qh|eg6ktX%FcU7A!6D4x5N00h53&UqiWzgmOb=p)GBHD$m|0iM z2r*_d8#9@W8F_uiJqIs2#(MdHP~$zM3K z@QVmn9ueAG+VK1|xRl~N`X^;17Azl%euT4RI>nz1pp#*h|JhR^i~s;t4^P=YD&?85 zoUs3mw*74j^*~_i=5~nkpAbGU)-2v1J-*>FE)IBVj`q)HoUlHT{K+5;89os{w7y;F z+8-GU5Ki|ewr3)vBExzTWASHC+5j?%{x8?Ae*cMyn+c1MuY2*24gd#i|0lMGg0;X{ zl={hkCS~D6F^>8tPK9w)jH6-@6@#e1vHRb!7=x&o)c-f)^gk0JOzOvQR18P`qo?6v z5EX-{7)1TgDiu@p|36*zXFJ@Z{`o9`f8mxG1pp&e{fle-m1JV1DvYLz(Nr;->VI=4 zjQEcc|Nr}5DW*$>=~7|3RG4<^A0Pz)(@y>Gtc&g;VEX=;zCWh#j~P(;gCYfks2D{3 zPwf{6A2XnW8BoCts9*+EFas)omBRlAYhY$mF|(MZ$;Fd>8jI&4j_Zd4(R>dOV?0zQwig*@CaX+F52gg{{TxCns=c-rs^tDRwWRjy zxlLm5z~er?JKtV5ZVfD=)~^z44onFv*sBmIQK{S)Ewc}DpEoHp85 zd7gf!K;Lz@*wF9sZ~6>dxozmWU4Gb-Y_iiWkkPWd+JE?kDnT@)09C7X(Q8C&)MtU_ z*hhTNYdB8(ulhH5G7SnU(EqT>@O_sK;;^|T+I@tX^l^77FZ`JT1o2gECwRVPK>_CL z6e3YATqEz-`v$b({ntn&h&4Ut3>_}h$V8|)WCEwF~$N8sMyYgkRLe81K_YCq@V zu@7lr&slZLDW2T`@;kSVNiZW7~JyPz$`zm2HQeWo85^?c5(vW&2nGs6Xu-_ zO<8#7Xsn+Oqeiu z3bs%Q?eoz{bp{=G4VG<~%+zL7JGG|!JpJ2Z@hgYW4{H+j#zw-w5d`pcLsxt0D@cgD z_!5Hi@aRp0o4Mo%Ng)F~MXV1BU{ds!YR9RxAnV#KpcclYi7tyY?|o`&>AY+dxf?y= zqR#?iVPC-h@Uzd`^20R}_jNnI8t>E94p!CrM5pu>K%URNkZW0fV!`K!ICAb>sm$rJ z4NXdiB&WEa4eJYTX_;=;oll=H!uDkTc8(9hlcW8Jk3-geJ#pQ_r4OA^2$SbEh2Gd9 z(m%Y{BMOQV-QpzP_z{jV=d@5)R`+*e4qLepn@j1``as)>PEC*06xMH_$Vb54-DP2P zFrX#96|z!2#1e8~dufKp#m>6;A|ZYW3TN2lkxpIh5M(Xzeuuq#H#(^NWQ z6p?4#Jpfv<(9+Tb$4K|qFHcO+%``H$Sfi#2JmA#u+_(wx(|BFgF{Izg)|V_<38O<< zY*aVQlKy;aIn!mpSebw`ntXTE3LBqPLKApDFI1+DEJ&4K3JCj5}AX z9L}t7tsSjvdk>5krzBY(%ckFcX)c^DoW}CJkx4*~4Ch(m&4v4LWF`Q}RLcTjf%>f& z6{)$p_hqQkXO18F(OztGVT4(%FcV^pRVFjMAO&Vyz6_KhTUj!F)qJ7M|B1tyM~D0i z@p1$Y)R<^PjSdDqcj>PMuAgi$pEvTpop4?JEL9d3E)CGSY=c)=(nFL}S5&NY1wY(y!pMDi>~d)0IaX@Y6L~NXwabEl7sFr=ncDQF5$Zb{;DpJ3aXO7f8WuCuj#F zum|XP+(AO`SOcu_BxrBCEnWs?I7!$g(e0(+ut4RHtsZwX+}s@{c+J)ve!J1g)0Y@U zS*uxe*36sn#&zc`3ViYyob5Z%S7rAlVH6WS4CxjU0z(py8yi_xvkx6weLoH&IwRKU z>Y6ksnm#QB4<0?qxLf2*G%8&J>PPSE$A0Zq!GKh{$32$c*2V;@q;jAZ>?ra-HaP67 zQ=XuC(nLb}#C=;}Sk=+Q@PfiO8(oAoG8qobv9@^j*%BMD>_&{pN)tr~0$%VkU9BtO zZVCpOyV>f!{BA!npqog<$f0$v-r>+?W&-)iX57Ixc7eg*#i1Ge6zNBw$|F80Zh6z5 zDY7oF^gED!Iz{q?2Fc-+3G@u|OnrezFdGPtwyUWpJ|Rx2guY(~u++bhS&(dZGyL*O z;B`6yagwE6)7w4kGbQgL?IXW`r~ITf(7M+9D(x8WkB!!5Lo*23QIzhP8VfhT!D}H& z^b*uZTiXKaHMnKL^W*95KlX1!I2h5Q6*}c%f6@EJX18&eh}llBNq)!TUQ>GrS_t{i5!I>>HQx6Z$?1w+lnlewBH-%GSDAoUKOf&f zO0kmGNbw;|>PLs}lW&bHKi}aYt~ruq4Wqx0nC}X_>Y}ZPCRpF6*%%Otyr~ zksHaBEubC$0e-*tq^sKI}{a-K*r(U6Egd4An03Di72AV^R`a*R7@W4v|jn)S`+$= zEP5Q$XP6C+wk#HY|8Del%A%nn_adb?=Vz54^yc34 z|FKIv9B#TCqfRkKDkH3X>O- zMHYfI={i76s_=g0_tsta>SDVp9aK=NFEiE5<8bKmSrvKGH#=}q?r96ZQ!d3@!f?Cp zTmnsv6M@#0A#Z2dh%x_XDvEQ|vGW?=(S`{|dL@-7oiRv-H2MeL#6g=#Mv;4?xh?$R zF@TgbDeywdJPt$9wqJM#zI1I6vs=IdR!j|8{a z>*+1>s;WCBZ!M5(%>mt5gKb})k;u>N4kan7E4O8BXwjQ-UTRKOHTmIwEa7s%VZnGg zBHbd+@6oA64xkR}BKk0^JWs&q8-)s;y>UJH9-hC)y#tHe@Ag{jL&A_?5hEbxmYi0(h>JnWo9WLa9$1iPbXkOm4_?C8yv8iup2z(f&tN$P6BC&h&u z#KFG4LOJ#1*iwWd+-YwU`eV^+Fpc0SK?WK4HYY}zitGxx-)i^4)4Qu@vwrfC`xmO_ zQhtv9!X@)#5vOV72i!($)_!;%;&ORpE5!(2^@$Li4Kz&%9Wh^lPt(=pUAsPiDVZ$0 zr$XzA{g}F3FZ~ZtYQo_TW7KHE!+{*vFdsHgFrRdR>KWDmFYj8ow9`F4pZU0A&*&iK zh&n$=Ywv5*e#-?GCKxWTJilAXFGhEh`{Q+>jT|}~njGxnx||?B&&9=;CeP-I!8^-6 z4nMNd7?$2%Ypw{%Ao~7&0D=da;E9X53a`)oW$E93G`x+Y*pw2;oPWj-&pW&>h20-C z^rW%%cH6~)u)aR+P2u&H9a%MFEx@ysDk8DOz(i@&GGCy)`5wP03 z2D)k}0n+ClJh4@2tb-4No_f#NYv2#pbtfA8ZRTGH$0Lw8gwW7x;I|Xo9n;>hODI^8{Gi&xYpg)E z%8nvvIn#XO^Oc{6z~Vp;z=h^wzpnTe0zVS}w`jOYILKkREPNA`w~Zj?cdUPp^_csi zXhNydioC`~0Vm_rCVtXKd*v&kHO(!Ei_i81@rA`8mpjf5s?uc-XTW+ShT;qDktZKn zzn^%SHURQWeQt1j@Tx_GRXz@Twqe5Ul53~=mz!)eI+9s+qA|}VsR+&!Z8=#bBwFDM zI9R!0#Gxu`^H#y;29uyz(BP&R-t*+^sHuq9)nz%>jRDUQVh@4RNKMk zG$g8?NPjfzBiQVgPUvEy4K&=fWs~i8ovv4Scu87%sUwJBr%aN;BbYGJl_f&HF0tcC zu%fx6tN4BR9Kpfe{vPPIQYe0;U}EO=A5aP)7)^x&!J_zYzWik&-+r8&$5{olhEkViGKfWjb0Wf$iPA_+$XXlP#6d|SkM}JuIjSxm3q9IGlA@NJ8aSR5|npa}F z!@zdfnbO-FS_~VUNj6F)IOe!LfjG^4ZZnOd`n8*JMDhV9Mef@#*=WEi)OXK*#Fn_K#{|HCxO$&nrmSU2Nj+@ac(;$&?iCs(_bID;L zVJX%d_nmF*ayJ7*i99-5?viKxY(LBi)4jxBYTBCPAypNCqmhNBTcm?zA}qC)YclC( z8h1VySSS6Ol`TA(#=n9ehk64Z9VuRyGHvHxcx*$`Fe-XL?@;{F^5Z}@n3LRD$Co6< zzGd=@&@?5IC z4TJ6m22VQvoEmetM4jw|8S^DC6?~1p-h57m$Le0xdDQxI1g=FtJ%v2H)|xzj)E;Mf zAbt9a1=*TdFuLks!SfodD^6%)$U3;1|JbhP!ri?^xuMpmI=m+kjo#_L56VQQgfpZ@Ou2qx zL-Yf5&2fdTkK)cxxcdI5PmBPyy_WT3fz|bg`D4`n;7PpAxJ}YL?MoVn_dfW!^Al%| zZ@vpsK_aXyl~18NTN$uJE3)8h>)Q4Btq!nMu2xe6U@&yTKIV#Ai^HnQ#EHIL+hxk{ zFiYI!w_!oEu`1&eVi%TF_n|=OWbFa_#Mj6D-I9Sl^LUT@)m0|)gnoOz4K6yqipRaK z{`%E-lV=$)(YbS;nDQa0H_09{iANHl27A2~_58H1j2PvhE_ZL3X62dJ(xIu#9-n6? z3~g+fBn7{O+tqJw3a%!+g%=<&)c15hX1sp!y&KEhv`>P>k#yV#LBTZp@2|JZG2U2P z&)IxJIJN!G&aoOFleQHjr?~Yxr|EeurId zS(+mP_*tXfRhdSuy_R|3XtRQb0!FjWmAk$RR2jo6GP**9gGVcEZUzcs>Rz0`4CHY0 zv~nhkko`wohUWpZmrXLXrz{9#eHiyQr44751}R!Hu6LZh$1u0dV;r1ERdVcwr7_2x zZ=Kww$=_M}+eOif%_qd|DZmj7WVw8kxoo!?u*-N2cJSEBIgxHunorUXM3~uj7c!AF zxOpJO{*F7LTzBC&OqLL#!)AmU#`W<1DaC(V&1guii$!~a=dzW>g>o=LYgYJEa?FHJhB4&8-Q?t#aL{Qrl>=q+@2Jgt`MSeSv;T1x5tPkWd zL2qyW%Antzw04dB(=BwKhe>T;@CQ8|+Fzk;0F8k~;u0=DB*+Hy_=8li%)DWrHB$2l z91b52P_DTCgGh}=f{l$|!cqVs$xF4H@7+S&A3P$!9vb2{)FwW}xjSBRPG+y~-SF_E zARfAN>^uSO4c|EH4}_>CJgj!j9SDOpr zaSxWfgF%c{X65-RTW7U8A)opUibutANhV8O#Fv_Wf#|8@!$?^Tiz?|N0%;&O`4EEw`6)N2Ia+ z5V?M(&<8+jzmKFh<+_b`ZO<6roRPosR`=o#u99xvu#`mp)Rs4y^*b3Or8o7U_F|^p z%AbM8orNY|?QL0Xr|$UOslWXxzXzw#cJI7dQ;L7S+yvnAT0Yyj$qJv^elk1`wpN{8 zD3yO_9oV*C&pF;q2;M6{-mUrD`YCDE0Z^Tg2wr|zmuP^e5w|W}KR+KYz zsx{?P;S|27toOYcySUmkco>W(JtOjpw+t;h0Ho1sV;QN17hg5&+_xWjd{i}Zx92NX zyV>}`_e}838T(ElVOh^D-svBZAj(uL6(bVn(AgNi24SE9VT~kaT=wDKDC&^47hM@Y zW2i2PAG!W03z-7IUGb<8flgrM%f9&bnZ>O96i0F51~xkxho`^Em&H}AW$WzMe*rT} zJUD_2_)U?ck+i&gZi68>r+QSHlrWR)%XX{W-6}hxJ0h_YQonh8?JyZS679IN_CFjg zTMrh8Sm`(%PEzZPLw_XfDsy;HGrtew;?Y@#n*&+LFYde@obveCBmg<~H~~Z!+k^YM zM1(<}AfGFj$|Q$nO3aa1!puKUR}6UMmJY)Chw*HbnTWin(WM~>x8A}itm;f-g%&P* zR~pEixr}Hts!sjnZmI`ec3X?qRz`9iV+pEIi$wm1Cd8D2YtD)4NL(m-GJh%|pvml~ z{Ara5So&$|$yn3$u?4oWL*R;}_9>+5Bf4J>KIuQcV6CdE{v0erFygx%$ze@e+RoLFWT=yb*&VCE%kfQa-rpky&$;Qc}U^d#G^43 z`ArZpjySe=tQO*M!Nfan(o1VE1%{TvCwrPVqAI{w&3>N5_rw8&Wrw;51{UE5k!=Hk>5<@LBQ_8Tnv)6jux`L76q zW>4gXRw-Xu3S+7XD&XQ8D5I=AVNvMFQX=dfb zZccT7ec^!Q&ogu|IYs=~h~|H=n*3>;Re1@1PaHSu2GH9+P2*=gwbR6?*|u?A8OfgF zcO#OiTenGJ7JU1@_aneT5aHbqxfl9IO2zDI?!@=k zQK)9kw99||d7fZ>0(PuO&0t-j-@O0yT(k87c#uL4Jm0s5Vf0YnDL&YyxW);sTick# z6oWexHIl&oan@S5VbnT6vMI|w`s&#!|1_g|vZW<=4Lk5@IyXJL##itlm&?+(NOsWfCc4mw7b*ADY9TEkN zUiNRn$fa7V(N}rC?7r}A@^G*;e(YxVVjPj!&Zr9i7e|7v7X+rg92xBeR-KE+n;AYk zvLE<&)rNbX)eqk(^VLVP+_My7L`n;X{S2fBx@eYfbG)ekkI*btVM@SxX+nI0K%X2n zREwGmNnAik7Up+Vx2Ch}HoDGR%b3bMrc@my^k`2Uv7flL67|C!vNUUPAiPf@iQU6} z5`5otP1bEDaa!53hh#~4)lFEcXD**K$hVLaqh2RXNRO)mI7@7AHPI*Bg>2~IYeX0I z#qd!hwUvZ2t$t%jJ3AUf1gDqZ|IO(D1U`l^57Gu{fA9wi8s7+Y$hg@i+qGkt>N^3x zZ7@S@RV10Jn?deaOeV79!qUsXrIq|N+*QS9tG)B<%MG_QNdumzG*EWixg8g3^|j2o zHW=Is`h0}WrVnN2`l%vCL~|ECdm4YL%1p44E9eESy&PEiYxJMiHcYiSqaq_-W`pBd z3n_-AHO-UVm-NFF!L;epbL!S?QRC@nFr3kI-!?- z;69iEU5G@s5E&Hx>`0yFYIHd8!#?2-5+eqwkuTS(c?AwA+HoJ5v-aZn25mrXPBaap zCWy*{Y4CfxKhiQJ{m25+AD{$C#ix)+z|rS;FW{-8Xr5n$z}aP0O4E1tPUMSDG~cU(Qu~fgDXmNO%-GgZ}O_K{$m3Oj3ZxW7wBc=nG%)2W)xb zS@U`vh~lRf&DKni1k|YnEodHOqI2K@&^DsGq?qKl%1lhvVQ4{jL3f%U*^A zIEn{s!>ymY>GGc%1V|msw6Dn~@=WqFOf8%Br4&kmn@sZK{k#eE@2mXuk=jtAcSqen zv$E#7d^=ML4n-2;DTFhqZm>KU%`qKiMaC*0*c0)FQP;(D3QIZG^loR(=St*mn|?%_ z`KJmv>4nZ&dMfhpztaYCElxm!Tp6pJp*w`aZ39#|+|87Q^OF zDgU`TlrUzwZ%^{q=Y21p?E}HrsN`Nl@RRZ?19LUU1Im+a_M*H!(MqSGy7&c#@n8}a zX)K5~fv&GrOdpT7nAf?V7}lQ+tyanzlF6d|p+5XTUX7PfDL=Bn@x1Z_2fdrto z#U=!}^$}KZQadYPh@c;*O7J5Sb@C2^J_;p1S;cKrI#|%xw>XgdK^wuqQl;9}3=yT; zw{XpglBLf?r>5890mhjUE{SC!`FDkUrnzO66K~p@UR=7>6Njt9gzx@245)GPezcnQ zyt}O%?{V;<_g}Jlc|IgdyA(DqjE3_QKEIPQtE`jX2N-n+jm z^DHfNzEZE;6kht9yVTyHoYb$^A}ypw5ypyjWTM-4++4_x4@ZK!b=rF^I;iuh(~fwM zedyDAr}#b;8E4g&s$fbW(QwgX+K273 ze*;=JGqrGTy&coyZ>Wx|BaLLy^;^4@T1h!C@&q!^wEU}BJ{7lcq0wY&Dp!87aQiGU zYlk&+12Nqyb{ZS4h~dg5p;*=HU+kG0OKv2$J^0Mz9)?60v(fj^g!s;G9m9dZ>Z=9q ztp#9svTOUG z@QN*bPGqh60|RgOjW0z%a;bDG^!<@ZLW%HE2on0pD;8Z=2H+MheV{BTGzHbGV16);2*qwd?=+%!_Ua${v>YTuJDEd5t^5xt{!HgvAu9$NkjzUQ3F zS0hH{cYgi^hZUpN7&GLdK9teTQzc!# zun8gq$8(u(>@6VN-@g@=*IJ@dWyV>VFQ`Yv-AXK4L0S(^!V*c(FXAIqu)ERr!tG4Tx zgidY{YCC3mobd-4JW_942I)-X%4Ht^NRC{04Ck4BWt8qqt0;>2D|$S7qGE9K;FEL! z)Esh5XAjHF0Mb%-C=R1vjQht#;~%ANa|sw|9a`TjE||0J)+CA>SZ+R*VWE`~|T& zM+_+V*1kp0`t+#fvxU{KBd;}pY%5|e%pbMvh0CQ&=+-Iqr5H+O2TVLxKOrVF{M^-< zq)LbyEh}h#AO+kyH#lW)dhF-u8E+SJCif*(+4B0#gx}=$+PC_`u$X`yQB)YMUWAhPW&pHQvYfA8zpY!R4? zaKPduzcQ+KhXyqAeD*%h(yeKygBA+nwA4c4l@u?WmGv4rFb+%)G!0_(80Sf%p9}E|?F6eBm7p zr*O99ggP8|#p7Hoe<$r+6ZD9Y;|g%~izsXhJNu}?&A@yNdqlCUGM}(i5K+XyUPH=W zmBIrTnNM!;6g**rU1bTs&A(fevQmG0aK?f*s6tH2`2jUIbz$9|aX-9VLXBF^k$Ts6 zP9&X`=HEL+_QlYoJD0s?l^RFFF84vs4OvD;7^*xab6TtJ5Ob3ZxFz^JP}C2)o#BVO z{*us5%3Ms>A7}dk)A_(c*8v>C0K`(NFaUfok^=p22ouKAWz%h}fDE;>&S0pG@lh|dKaZrBNx zE+eQ2^V^KgjcKOfe$Nk{%;anPn!3f-_}G@=7j z3gu-kKifTPShzz@P7#qkErc5edY1Oq6+b%W)w@^GQQik5PwJA<)wJT}z`;%SqkYEu z%>p5snp%ySUjOzP*vN)lY8uW}@AX?v`#kJ+Ls)$NxBg01Gy>4p<1!JqGB7~@h)_{D7wHBz5paf4bE)TOCMVhBVG9Mg&lF9(Um-vYl@eG(dG)VBKX}m)eHLu z*o^Fs28aRb9JBlbvM~d1!NwPt+>xZF6_BodcL58AJYrPrUQ=?}vyRrhOT8!8d>D^K zveUeB7;Sd=Za80oUF8lZiiyp`ntwgDk00A6oenz0yH`cM@B~7o$J$k2s9h!y)anbm zu~;3JW;wuIYEi$JNv;I|eyO|k0kR?EQdLO$HZzPial@{cE4(xxYfe|x1kQ+JsKmXl z_`%(Ha`M~<)M5tl*`}en!4NUJ4_x{NVQutwgS$%^+FKckPZ;&OoR@#kYcj#2n9;eU zO`9tIH&1eK1_m-{aCxHU8D>H{Nj!3a`u9B7Nue1}vo8T8x?C+^s^3vYo*VHCb+kDc zb?EL0u(#h;ewwl1<)u*GlydjgnnTX<#_TQyHC25NwaH^Gu%(bJMt%L+IzQQHBBMv2&Yib-WJQ*4NZ z+S-$(+N(BtR|ajye6>Y;u^)#IQ!|hrFm(;q&r> zYU%kxLVXGyi9Ch9dqGd40-tDanc7$67hg_046k*?DeHPXv~9CHD;|=vVp!K4_jx~R zCA5hUgve};HkhH;Q+|@Fc=?H~;M{$wqDp9T045^BoNOGx+_98$ea! z01!54#gATNNoo}S8m)Ie%_z{UfYLLX+vE}Ln9l^Ai>=BQNYKU%26Ci=aNg zYx^lJUlt}>zJ6xuX&vg03VO?V-#)v(KRXosicvcG{&~wzl(r?_w@QH!O`$cKjC*eV z7FP&wX>D0dTY$SE)6J{=?yuuRCm9VL4xvE?W^*s&NjD9pZUJp>)+P&||ImdMSSOQ- z;;weKvg;_HzX3$IJb9{Ch5g@MxW1S^>Y7MQr z+@W+BuTMmEz=6J^Wp?eK3MV;oZVA%*C$*^q;w5;>=ROQ>Yp<4+hkZ38$X0^cvW8Y0 zT$D9-+Q#lo&0u;KZQyl5Nkxhna$8_jdgF{2gOoflOK)=1`HbVzri=?>8j+|ScVbJs zbkW!~_0k8_G&ch(1r$`$GNP)Li@i2)xb(e_7-dBpz@DN~|L5Q)dfF%)+R3b$F@EL< z72oHlERgMB<#+H@LhWvC`j%oWo8S7;c^I%0ytYx~`sJoA;4KM-=m%oqo?*(^Yt622 z;qwikR-@c7TRIJ=QqH*S&Kly*J`(%~XHgvl2izWm#p}BKh4!ZvMZObG$A~8HedD)Q zZgLZCarKCJ^5AxK2b=%a^1M?V305a>dXrS;RT77%cc^RBO79qw5DjL_lCLkBQEO;O z&gFaTr99cNE3tcptgF&O9h|%y{et%}oTq`dwwDRbP(Hma5<~54Cwi{2$ntJNUu6*s zf!uonh4)X^vhdZZjK-2e*}1tY+n8N`jE+q9pAMtgB<^wkVuR=bD@E@#4+(53VvdlS zcpG@s1%Tj-(VemzXo-2+N9#85w&=t!nedHPIsRM|5kWm7otXIW_C1 z4pT+}kPbWoyN-(TCus!(kx=cH)!kwXEA#X5wCxX6oW?GUkX9Uz5cfDH87uI&=UM9r z-MVHl1LU>8;ZPJbdWJ@j+TanFG$3nTx~xqXR4cT2>2!JaFQA8&HQN%kJYH5+9ob+n zW1P4xqg&loPgmJ>RSPp)JNO}69muzF-rf!~^qU%AyG|!rKXCzq?J8}Z1#1o$a%t}K zYj)}g!RO-~N=x5i)nyWT5D{&+DF|`F%7H_Q0qT(9bLPi<6zc*FqkD60E30Ww2R(?T zTD%X`TK%Js%X5@}4jhZ1JMJ!YTYEjf3}^TXtMp>*rm_=O?C6;gfQn0luy=w)WA;PNRAAd%&yJfk z?-drb5WC#0<6aE!3$71pmVlCxU2b!lqQNx~ZUeG99*L=(OoIm1_^SlmyoMrxGXLv- zO*#kkT&2}oMD@f%qUgy!KPjP_2w{092yWr~klrIM>GKPjjx!UuN6P#4beo)5ku{KO z@y@4c%q0ufeW%%x_W4&W%mg5e-Bj6t0P(8vUJqJ-GLN-bH{?A0dIC^Axf0-;Nh=v! zvgCc|Qlb%2B-*989) z0WfYE)RzJ+-hx97dl9ZqO7&K6x3z0CM*;34fvZi_)C_nM)bnjs1@qOWltb$&%p-6j z)8|M{k9~x|1ClTxjFgH!{@Cf;B(PyQ4wbir?&+N1cKVg5S(Q}%5X9yNnS>`++~$D` zuhD)*e34=z%KTwMar+a<4R3~61yGdj_cjYlccY{q>_q+ADdd=I|w`}==0&p5-3vjg{Y?sKklUDr7qtTOiM?seV# zlM6fE?{ums2(ujHObO33wtsBm6^!@PL0qIf>HkL^s8r_kULdCR!U``uwGT~7cq9b+ zHClg2{h`PFA>CbLoa(IQUvUuD+)v2PyQ@_t>1Y=GXDHpcS@YhNR^q|7lOr6mLbdn| z&xpR$_K!2V^NNL8^$Oechn#bX`K4FkVJ)`gy(@ zEn7ir@CTxWV(`yT@XJFo1@TL2h<6tuwKS}aYg}aD{YH-2i=>bL%6YB36dEWSZakpx z&Hpjemycn^VM&~TE;zZWU;4X)NMpyg%n9*=@2BtVtfStML)l>Bn+2_k;M%#?ZrkxQ zWgtN~xPq$v$obfH4%tiWeAz_i1G&7$2{Y@z+Y*+1I;klc-AX5oE%5_?2fJqctfXhOO5 z)$6~q;Nls!!C{TtHLE#(OBMEQCwGS2G7=l;E)NS|(2uR)MX3=c@SxDkLISuNHKx2o zBw6qhyl!mmU%i(zrhJUS$87!-O2;GlM~J2t)cjjP>oyrQ;pvCP`!OGgh=G)u7fso%qie)}yrCp`H@G?M{7a_h7$6ZpLf2?<^IZ^y>{CA_z%)(*SPG{79}&T@cnLw$V@(3)SR$(Z|*e zi3$%|Zu$l8!RMYGy%YlM z*W?mQc3uy;GX@5Q^?j#p?}9;UZlCV*O#zzhibDNtyR=Sem{t3tEltU zZv+4is*>u2PZlOiO>&b+#bA*itnx6S1;q~ozWA$P?~lHX*IGPltZJc&T3;WQ0wVqC zy7~e%4^C7-68qqZNYD(DcEzb)_eJE=c72O;0sJWG0P*KE3-B;$xxbT@QT_8gRaF%M z25jLo>oU*YaY%v)Kk(5V@D`5D#*^}Ye>gZl;ApnOXW&tYmi@yN{1lV~jq7)g-kPgM z{QB3p-}(VtS2&c#TUaXYfA@^d!TRycy2~FoJIXnuu*|4&K@SYgb zCHL@-3@pBfQ&D`r#h*rUaM6W$LJv`g|66BM1JkoB7@nCA%x?{hMbLBdB zJZAr>!&L?qu!nY>S`_2Npi^p$2bY8B`uk!;;6Xd|~!zDW7upjy6@jm06a|(}T_JK1T zb-2KL@y+5s9X`F0e?a;(3_sR$U;4ggHFH*~_6&)-*@IeJE8+?Dj)l4h0jH(@_vUzA z242T((v@|Ik;B|XUdQkjdH(Sh`GTG&rDj^C8d&ohk3wS7T-u+ivCq^)&gc3`@$P#l z3HY6I>21gJ!qUGS2Y0OL!TL4)?1@*5Yh{kQ-L?OvFT~!#?|AqUzeB>Ro3E{5ImJ}+ zBwlgU!3vF2gk4u;SWV}jbUlskqT5+Tx{dz#$9w6f^()jeLgM)Xn%Av*2>Or%8g2QE zq>Za3maVyRPGdj=WKm6B`_?ge3lktg0xZa37F;D;&vZ*M%oV2shto((pPSaqd)5(P z0F#1dMCJZ0P36|>7Qs_bOC55LJ-iR(rwomUzoGP3tV+96{jOBTBgf~Zats@;jEvXt z6Pa`yF#c9royV5g%0=pMJxx-Yq!?4pMJM7S5v0i%xg8_c;&gEF`q^7*NkXJ|UF{75 z5A{asu>-BF8xpyb6en#yfA`pYND|k*zYwOifPNl=7?>|t{);w~Q6T-7dIAzBcGLZ3 zqm<9jTzC)01B%??5pvfr@|aAtUzwBFZ?@5L1|)JdJw2Bm%#=e^M^i$SUyWLYD6W$@ zfNg82BJl9CS3-GA!nEKdE2IXAb*d&;RQ8cS{d}?+1>sj56Fc?P0aYaHsr^%Z+3<8~9(@7k3Y-&jmNsh!--Bm?B2s{ew^g^2q?zl|$&%;QtV707@-h z-t^Ynqjwk}Ze9b2Fi^ls)4Mc%yt=lT9R^qDTmuewI|^H~B$&jor%PpH(y-v2bq>1v z7i!>LvJfqLt>HL*f4i(;uf2d%V%P*2-z6ge7Sz z+jct(A$11lgWxN^9RJ{jSC^P^h;OmoKGG76jFfR1{i3wvFaJ% z)^)`jjkmLmm#OKU_(wAt9}kpTV!KT(@P_x0U3onhz*P3?EestssMoL2G!{1^iziQbR! zpU%%<@wjyc6vcWr6^HYx2jm!|zF!}UC>kU>b?ofZCC>c$diC4ESODJMNkkh7`)r1_ zX&#c8yYn(xhLL8yAmB;&{yT*~3T3&c76+8c??C^Ni~aZH*-_or>;HuIUT;vf1w#iM z?@n%-!s0>#4}-?!5B>Oa|Dd8zFt@;z19cdw#wm6E0U}dN;l4enHEIR>pq|!`tG0-v z5p~VL$ZZ{dhfUw`9HeQzf0L29A&lsy`%Z(FGF{$hW@4LP6IN@jIqLd`E~(vdLL?s4JuWuG z`V13?Cc4|CnB3QM;7zsBOQbu^�!BA4ovtcUC2y`2RTfAYiS4U81U8^cZSK=Sa{$ z-MB^YUv%s%-Y1pUAUo||-mj#z4=ozY-J&YC)F=Dx2j+*f0%z7&baEMA&3j@#7ZIsG z8dft}2N4LMiAY^2E2oVQsEPx+VA-SAU00TGEY_aZxPkfTNgLF%9v(IYBME&IZ7b)k zE2piLC)uS%H157vc2TEMW?$ce`{Zym(M*`l@b)T$lf>|iX=FT@1EbGv-+%8{@H7+i zL6^2PwCa$XOk$k-7p2#6fFl2FaIb6IZ^b?QKY5=jK(=x!j;K;GqrUJG$mVV z%5T4@AgxVN^{^SMoR{_d_XfrQEfyl`r(0GnK|2f`;-zj~vcpR^y$h{c)z<~G z;>l$?CWJJ=pdX}y#Tar|q%%i{5vc2W4{3qxP7x+~t(7;_ z66r#ye|Ge}@V?NYHYwS#RFU#2&uw4{y%3zBx~# zVE#Tqg$9Mg!G%kSPNw?P;a4|B3(W-E?)FeEXL7y0nblVyex8&;^YkB(^4p&!qBp-e zm~%_*#H9`%qoaA-ktL9e2V^%+Q

kq0rUP{HLSqJ_q?$J;^V~_-7LSzMv)57?GBP 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%0A;Ux@ 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 diff --git a/docs/presentation/latex-template/mg-style/title-slide.png b/docs/presentation/latex-template/mg-style/title-slide.png deleted file mode 100644 index f889c437f923ce89a85e3813f0b201509833926d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193440 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%0DBFP_ztzmKVJe*;wSO9c-{S$%3m^{?a{(S5BZ3wq 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 Eg8Qa|jsO4v diff --git a/docs/presentation/latex-template/template.tex b/docs/presentation/latex-template/template.tex deleted file mode 100644 index 310fe973b..000000000 --- a/docs/presentation/latex-template/template.tex +++ /dev/null @@ -1,40 +0,0 @@ -% Set 16:9 aspect ratio -\documentclass[aspectratio=169]{mg-beamer} -% Default directive sets the regular 4:3 aspect ratio -% \documentclass{mg-beamer} -\mode - -% requires xelatex -\usepackage{ccicons} - -\title{Insert Presentation Title} -\titlegraphic{\ccbyncnd} -\author{Insert Name} - -% Institute doesn't look good in our current styling class. -% \institute[Memgraph Ltd.]{\pgfimage[height=1.5cm]{mg-logo.png}} - -% Date is autogenerated on compilation, so no need to set it explicitly, -% unless you wish to override it with a different date. -% \date{March 23, 2018} - -\begin{document} - -\titleframe - -\section{Intro} - -\begin{frame}{Contents} - \tableofcontents -\end{frame} - -\begin{frame}{Memgraph Markup Test} - \begin{itemize} - \item \mgtexttt{Prefer \\mgtexttt for monospace} - \item Replace this slide with your own - \item Add even more slides in different sections - \item Make sure you spellcheck your presentation - \end{itemize} -\end{frame} - -\end{document} diff --git a/environment/README.md b/environment/README.md index 0090436d1..164de7ff2 100644 --- a/environment/README.md +++ b/environment/README.md @@ -1,44 +1,4 @@ # Memgraph Build and Run Environments -## Toolchain Installation Procedure - -1) Download the toolchain for your operating system from one of the following - links (current active toolchain is `toolchain-v2`): - -* [CentOS 7](https://s3-eu-west-1.amazonaws.com/deps.memgraph.io/toolchain-v2/toolchain-v2-binaries-centos-7.tar.gz) -* [CentOS 8](https://s3-eu-west-1.amazonaws.com/deps.memgraph.io/toolchain-v2/toolchain-v2-binaries-centos-8.tar.gz) -* [Debian 9](https://s3-eu-west-1.amazonaws.com/deps.memgraph.io/toolchain-v2/toolchain-v2-binaries-debian-9.tar.gz) -* [Debian 10](https://s3-eu-west-1.amazonaws.com/deps.memgraph.io/toolchain-v2/toolchain-v2-binaries-debian-10.tar.gz) -* [Ubuntu 18.04](https://s3-eu-west-1.amazonaws.com/deps.memgraph.io/toolchain-v2/toolchain-v2-binaries-ubuntu-18.04.tar.gz) -* [Ubuntu 20.04](https://s3-eu-west-1.amazonaws.com/deps.memgraph.io/toolchain-v2/toolchain-v2-binaries-ubuntu-20.04.tar.gz) - -2) Extract the toolchain with the following command: - -```bash -tar xzvf {{toolchain-archive}}.tar.gz -C /opt -``` - -3) Check and install required toolchain runtime dependencies by executing - (e.g., on **Debian 10**): - -```bash -./environment/os/debian-10.sh check TOOLCHAIN_RUN_DEPS -./environment/os/debian-10.sh install TOOLCHAIN_RUN_DEPS -``` - -4) Activate the toolchain: - -```bash -source /opt/toolchain-v2/activate -``` - -## Toolchain Upgrade Procedure - -1) Build a new toolchain for each supported OS (latest versions). -2) If the new toolchain doesn't compile on some supported OS, the last - compilable toolchain has to be used instead. In other words, the project has - to compile on the oldest active toolchain as well. Suppose some - changes/improvements were added when migrating to the latest toolchain; in - that case, the maintainer has to ensure that the project still compiles on - previous toolchains (everything from `init` script to the actual code has to - work on all supported operating systems). +Please continue +[here](https://www.notion.so/memgraph/Tools-05e0baafb78a49b386e0063b4833d23d).