diff --git a/docs/dev/memgraph/diagram/dependencies.dot b/docs/dev/memgraph/diagram/dependencies.dot new file mode 100644 index 000000000..574b677bb --- /dev/null +++ b/docs/dev/memgraph/diagram/dependencies.dot @@ -0,0 +1,288 @@ +// dot -Tpng dependencies.dot -o /path/to/output.png + +// TODO (buda): Put PropertyValueStore to storage namespace + +digraph { + // At the beginning of each block there is a default style for that block + label="Memgraph Dependencies Diagram"; fontname="Roboto Bold"; fontcolor=black; + fontsize=26; labelloc=top; labeljust=right; + compound=true; // If true, allow edges between clusters + rankdir=TB; // Alternatives: LR + node [shape=record fontname="Roboto", fontsize=12, fontcolor=white]; + edge [color="#B5AFB7"]; + + // -- Legend -- + // dir=both arrowtail=diamond arrowhead=vee -> group ownership + // dir=both arrowtail=none, arrowhead=vee -> ownership; stack or uptr + + subgraph cluster_tcp_end_client_communication { + label="TCP End Client Communication"; fontsize=14; + node [style=filled, color="#DD2222" fillcolor="#DD2222"]; + + // Owned elements + "communication::Server"; + "io::network::Socket"; + + // Intracluster connections + "communication::Server" -> "io::network::Socket" + [label="socket_" dir=both arrowtail=none arrowhead=vee]; + } + + subgraph cluster_bolt_server { + label="Bolt Server"; fontsize=14; + node [style=filled, color="#62A2CA" fillcolor="#62A2CA"]; + + // Owned elements + "communication::bolt::SessionData"; + "communication::bolt::Session"; + "communication::bolt::Encoder"; + "communication::bolt::Decoder"; + + // Intracluster connections + "communication::bolt::Session" -> "communication::bolt::Encoder" + [label="encoder_", dir=both arrowtail=none, arrowhead=vee]; + "communication::bolt::Session" -> "communication::bolt::Decoder" + [label="decoder_", dir=both arrowtail=none, arrowhead=vee]; + } + + subgraph cluster_opencypher_engine { + label="openCypher Engine"; fontsize=14; + node [style=filled, color="#68BDF6" fillcolor="#68BDF6"]; + + // Owned Elements + "query::Interpreter"; + "query::AstTreeStorage"; + "query::TypedValue" + "query::Path"; + "query::Simbol"; + "query::Context"; + "query::ExpressionEvaluator"; + "query::Frame"; + "query::SymbolTable"; + "query::plan::LogicalOperator"; + "query::plan::Cursor"; + "query::plan::CostEstimator"; + + // Intracluster connections + "query::Interpreter" -> "query::AstTreeStorage" + [label="ast_cache" dir=both arrowtail=diamond arrowhead=vee]; + "query::TypedValue" -> "query::Path"; + "query::plan::Cursor" -> "query::Frame"; + "query::plan::Cursor" -> "query::Context"; + "query::plan::LogicalOperator" -> "query::Symbol"; + "query::plan::LogicalOperator" -> "query::SymbolTable"; + "query::plan::LogicalOperator" -> "query::plan::Cursor"; + } + + + subgraph cluster_storage { + label="Storage" fontsize=14; + node [style=filled, color="#FB6E00" fillcolor="#FB6E00"]; + + // Owned Elements + "database::GraphDb"; + "database::GraphDbAccessor"; + "storage::Record"; + "storage::Vertex"; + "storage::Edge"; + "storage::RecordAccessor"; + "storage::VertexAccessor"; + "storage::EdgeAccessor"; + "storage::Common"; + "storage::Label"; + "storage::EdgeType"; + "storage::Property"; + "storage::compression"; + "storage::SingleNodeConcurrentIdMapper"; + "storage::Location"; + "storage::StorageTypesLocation"; + "PropertyValueStore"; + "storage::RecordLock"; + "mvcc::Version"; + "mvcc::Record"; + "mvcc::VersionList"; + + // Intracluster connections + "storage::VertexAccessor" -> "storage::RecordAccessor" + [arrowhead=onormal]; + "storage::EdgeAccessor" -> "storage::RecordAccessor" + [arrowhead=onormal]; + "storage::RecordAccessor" -> "database::GraphDbAccessor" + [style=dashed arrowhead=vee]; + "storage::Vertex" -> "mvcc::Record" + [arrowhead=onormal]; + "storage::Edge" -> "mvcc::Record" + [arrowhead=onormal]; + "storage::Edge" -> "PropertyValueStore" + [arrowhead=vee]; + "storage::Vertex" -> "PropertyValueStore" + [arrowhead=vee]; + "storage::Edge" -> "mvcc::VersionList" + [label="from,to" arrowhead=vee style=dashed]; + "storage::VertexAccessor" -> "storage::Vertex" + [arrowhead=vee]; + "storage::EdgeAccessor" -> "storage::Edge" + [arrowhead=vee]; + "storage::SingleNodeConcurrentIdMapper" -> "storage::StorageTypesLocation" + [arrowhead=vee]; + "storage::StorageTypesLocation" -> "storage::Location" + [arrowhead=vee]; + "storage::Storage" -> "storage::StorageTypesLocation" + [arrowhead=vee]; + "storage::Property" -> "storage::Common" + [arrowhead=onormal]; + "storage::Label" -> "storage::Common" + [arrowhead=onormal]; + "storage::EdgeType" -> "storage::Common" + [arrowhead=onormal]; + "storage::Property" -> "storage::Location" + [arrowhead=vee]; + "PropertyValueStore" -> "storage::Property" + [arrowhead=vee]; + "PropertyValueStore" -> "storage::Location" + [arrowhead=vee]; + "database::GraphDbAccessor" -> "database::GraphDb" + [arrowhead=vee]; + "database::GraphDbAccessor" -> "tx::TransactionId" + [arrowhead=vee]; + "mvcc::VersionList" -> "storge::RecordLock" + [label="lock" arrowhead=vee]; + "mvcc::VersionList" -> "mvcc::Record" + [label="head" arrowhead=vee]; + "mvcc::Record" -> "mvcc::Version" + [arrowhead=onormal]; + + // Explicit positioning + {rank=same; + "database::GraphDbAccessor"; + "storage::VertexAccessor"; + "storage::EdgeAccessor";} + {rank=same; + "storage::Common"; + "storage::compression";} + } + + subgraph cluster_properties_on_disk { + label="Properties on Disk" fontsize=14; + node [style=filled, color="#102647" fillcolor="#102647"]; + + // Owned Elements + "storage::KVStore"; + "rocksdb"; + + // Intracluster connections + "storage::KVStore" -> "rocksdb"; + } + + subgraph cluster_distributed { + label="Distributed" fontsize=14; + node [style=filled, color="#FFC500" fillcolor="#FFC500"]; + + // Owned Elements + "distributed::DataManager"; + "distributed::DataRpcClients"; + + // Intracluster connections + "distributed::DataManager" -> "distributed::DataRpcClients" + [arrowhead=vee]; + "storage::RecordAccessor" -> "distributed::DataManager" + [style=dashed arrowhead=vee]; + } + + subgraph cluster_dynamic_partitioning { + label="Dynamic Partitioning" fontsize=14; + node [style=filled, color="#720096" fillcolor="#720096"]; + + // Owned Elements + "DynamicPartitioner"; + } + + subgraph cluster_security { + label="Security" fontsize=14; + node [style=filled, color="#857F87" fillcolor="#857F87"]; + + // Owned Elements + "Communication Encryption"; + "Data Encryption"; + "Access Control"; + "Audit Logging"; + } + + subgraph cluster_web_dashboard { + label="Dashaboard" fontsize=14; + node [style=filled, color="#FF0092" fillcolor="#FF0092"]; + + // Owned Elements + "Memgraph Ops / Memgraph Cockpit"; + } + + subgraph cluster_rpc { + label="RPC" fontsize=14; + node [style=filled, color="#857F87" fillcolor="#857F87"]; + + // Owned Elements + "communication::rpc::Server"; + "communication::rpc::Client"; + } + + subgraph cluster_ingestion { + label="Ingestion" fontsize=14; + node [style=filled, color="#0B6D88" fillcolor="#0B6D88"]; + + // Owned Elements + "Extract"; + "Transform"; + "Load"; + "Amazon S3"; + "Kafka"; + + // Intracluster connections + "Extract" -> "Amazon S3"; + "Extract" -> "Kafka"; + + // Explicit positioning + {rank=same;"Extract";"Transform";"Load";} + } + + // -- Intercluster connections -- + // cluster_tcp_end_client_communication -- cluster_bolt_server + "communication::Server" -> "communication::bolt::SessionData" [color=black]; + "communication::Server" -> "communication::bolt::Session" [color=black]; + // cluster_bolt_server -> cluster_storage + "communication::bolt::SessionData" -> "database::GraphDb" [color=red]; + "communication::bolt::Session" -> "database::GraphDbAccessor" [color=red]; + // cluster_bolt_server -> cluster_opencypher_engine + "communication::bolt::SessionData" -> "query::Interpreter" [color=red]; + // cluster_opencypher_engine -- cluster_storage + "query::Interpreter" -> "database::GraphDbAccessor" [color=black]; + "query::Interpreter" -> "storage::VertexAccessor" [color=black]; + "query::Interpreter" -> "storage::EdgeAccessor" [color=black]; + "query::TypedValue" -> "storage::VertexAccessor" [color=black]; + "query::TypedValue" -> "storage::EdgeAccessor" [color=black]; + "query::Path" -> "storage::VertexAccessor" + [label="vertices" dir=both arrowtail=diamond arrowhead=vee color=black]; + "query::Path" -> "storage::EdgeAccessor" + [label="edges" dir=both arrowtail=diamond arrowhead=vee color=black]; + "query::plan::LogicalOperator" -> "database::GraphDbAccessor" + [color=black arrowhead=vee]; + // cluster_distributed -- cluster_storage + "distributed::DataManager" -> "database::GraphDb" + [arrowhead=vee style=dashed color=red]; + "distributed::DataManager" -> "tx::TransactionId" + [label="ves_caches_key" dir=both arrowhead=none arrowtail=diamond + color=red]; + "distributed::DataManager" -> "storage::Vertex" + [label="vertices_caches" dir=both arrowhead=none arrowtail=diamond + color=red]; + "distributed::DataManager" -> "storage::Edge" + [label="edges_caches" dir=both arrowhead=none arrowtail=diamond + color=red]; + // cluster_storage -- cluster_properties_on_disk + "PropertyValueStore" -> "storage::KVStore" + [label="static" arrowhead=vee color=black]; + // cluster_dynamic_partitioning -- cluster_storage + "database::GraphDb" -> "DynamicPartitioner" + [arrowhead=vee color=red]; + "DynamicPartitioner" -> "database::GraphDbAccessor" + [arrowhead=vee color=black]; +}