diff --git a/apollo_archives.yaml b/apollo_archives.yaml index aa9720e8a..b30a0b79c 100644 --- a/apollo_archives.yaml +++ b/apollo_archives.yaml @@ -1,11 +1,8 @@ - name: Binaries archive: - build_debug/memgraph - - build_debug/memgraph_distributed - build_release/memgraph - - build_release/memgraph_distributed - build_release/tools/src/mg_import_csv - - build_release/tools/src/mg_statsd - config filename: binaries.tar.gz diff --git a/apollo_build.yaml b/apollo_build.yaml index 5ed1c488b..576c9d464 100644 --- a/apollo_build.yaml +++ b/apollo_build.yaml @@ -31,12 +31,8 @@ mkdir build_release cd build_release cmake -DCMAKE_BUILD_TYPE=release .. - TIMEOUT=1200 make -j$THREADS memgraph memgraph_distributed tools memgraph__macro_benchmark memgraph__stress memgraph__manual__card_fraud_generate_snapshot memgraph__feature_benchmark__kafka__benchmark - - # Generate distributed card fraud dataset. - cd ../tests/distributed/card_fraud - ./generate_dataset.sh - cd ../../.. + TIMEOUT=1200 make -j$THREADS memgraph tools memgraph__macro_benchmark memgraph__stress + cd .. # Checkout to parent commit and initialize. cd ../parent @@ -83,7 +79,3 @@ mkdir output cd output cpack -G DEB --config ../CPackConfig.cmake - - # Generate distributed card fraud dataset. - cd ../../tests/distributed/card_fraud - ./generate_dataset.sh diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt index 03d96a4aa..031eb9e77 100644 --- a/libs/CMakeLists.txt +++ b/libs/CMakeLists.txt @@ -210,30 +210,6 @@ import_external_library(rocksdb STATIC CXX=${CMAKE_CXX_COMPILER} INSTALL_COMMAND true) -# Setup Cap'n Proto -ExternalProject_Add(capnproto-proj - PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/capnproto - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/capnproto - BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/capnproto - CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/capnproto/configure - --prefix=${CMAKE_CURRENT_SOURCE_DIR}/capnproto/local - --enable-shared=no --silent - CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} - BUILD_COMMAND make -j${NPROC} check) -set(CAPNP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/capnproto/local/include - CACHE FILEPATH "Path to capnproto include directory" FORCE) -set(CAPNP_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/capnproto/local/lib/libcapnp.a - CACHE FILEPATH "Path to capnproto library" FORCE) -set(KJ_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/capnproto/local/lib/libkj.a - CACHE FILEPATH "Path to kj library (used by capnproto)" FORCE) -import_library(capnp STATIC ${CAPNP_LIBRARY} capnproto-proj) -import_library(kj STATIC ${KJ_LIBRARY} capnproto-proj) -set(CAPNP_EXE ${CMAKE_CURRENT_SOURCE_DIR}/capnproto/local/bin/capnp - CACHE FILEPATH "Path to capnproto executable" FORCE) -set(CAPNP_CXX_EXE ${CMAKE_CURRENT_SOURCE_DIR}/capnproto/local/bin/capnpc-c++ - CACHE FILEPATH "Path to capnproto c++ plugin executable" FORCE) -mark_as_advanced(CAPNP_INCLUDE_DIR CAPNP_LIBRARY KJ_LIBRARY CAPNP_EXE CAPNP_CXX_EXE) - # Setup librdkafka. import_external_library(librdkafka STATIC ${CMAKE_CURRENT_SOURCE_DIR}/librdkafka/lib/librdkafka.a diff --git a/libs/setup.sh b/libs/setup.sh index 147f504a6..d5c4610ef 100755 --- a/libs/setup.sh +++ b/libs/setup.sh @@ -125,15 +125,3 @@ clone git://deps.memgraph.io/zlib.git zlib $zlib_tag rocksdb_tag="dbd8fa09b823826dd2a30bc119dad7a6fa9a4c6d" # v5.11.3 Mar 12, 2018 clone git://deps.memgraph.io/rocksdb.git rocksdb $rocksdb_tag - -# Cap'n Proto serialization (and RPC) lib -wget -nv http://deps.memgraph.io/capnproto-c++-0.6.1.tar.gz -O capnproto.tar.gz -tar -xzf capnproto.tar.gz -rm -rf capnproto -mv capnproto-c++-0.6.1 capnproto -rm capnproto.tar.gz - -# kafka -kafka_tag="c319b4e987d0bc4fe4f01cf91419d90b62061655" # Mar 8, 2018 -# git clone https://github.com/edenhill/librdkafka.git -clone git://deps.memgraph.io/librdkafka.git librdkafka $kafka_tag diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3c6e4fc7f..eaceb78b6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,12 +4,9 @@ add_subdirectory(lisp) add_subdirectory(utils) add_subdirectory(requests) -add_subdirectory(integrations) add_subdirectory(io) add_subdirectory(telemetry) add_subdirectory(communication) -add_subdirectory(stats) -add_subdirectory(auth) # ---------------------------------------------------------------------------- # Memgraph Single Node @@ -24,12 +21,10 @@ set(mg_single_node_sources durability/single_node/recovery.cpp durability/single_node/snapshooter.cpp durability/single_node/wal.cpp - glue/auth.cpp glue/communication.cpp query/common.cpp query/frontend/ast/ast.cpp query/frontend/ast/cypher_main_visitor.cpp - query/frontend/semantic/required_privileges.cpp query/frontend/semantic/symbol_generator.cpp query/frontend/stripped.cpp query/interpret/awesome_memgraph_functions.cpp @@ -60,8 +55,8 @@ add_lcp_single_node(query/plan/operator.lcp) add_custom_target(generate_lcp_single_node DEPENDS ${generated_lcp_single_node_files}) set(MG_SINGLE_NODE_LIBS stdc++fs Threads::Threads fmt cppitertools - antlr_opencypher_parser_lib dl glog gflags capnp kj - mg-utils mg-io mg-integrations-kafka mg-requests mg-communication mg-auth mg-stats) + antlr_opencypher_parser_lib dl glog gflags + mg-utils mg-io mg-requests mg-communication) if (USE_LTALLOC) list(APPEND MG_SINGLE_NODE_LIBS ltalloc) @@ -83,161 +78,6 @@ target_compile_definitions(mg-single-node PUBLIC MG_SINGLE_NODE) # END Memgraph Single Node # ---------------------------------------------------------------------------- -# ---------------------------------------------------------------------------- -# Memgraph Distributed -# ---------------------------------------------------------------------------- - -set(mg_distributed_sources - database/distributed/distributed_counters.cpp - database/distributed/distributed_graph_db.cpp - distributed/bfs_rpc_clients.cpp - distributed/bfs_subcursor.cpp - distributed/cluster_discovery_master.cpp - distributed/cluster_discovery_worker.cpp - distributed/coordination.cpp - distributed/coordination_master.cpp - distributed/coordination_worker.cpp - distributed/data_manager.cpp - distributed/data_rpc_clients.cpp - distributed/data_rpc_server.cpp - distributed/dgp/partitioner.cpp - distributed/dgp/vertex_migrator.cpp - distributed/durability_rpc_master.cpp - distributed/durability_rpc_worker.cpp - distributed/dynamic_worker.cpp - distributed/index_rpc_server.cpp - distributed/plan_consumer.cpp - distributed/plan_dispatcher.cpp - distributed/produce_rpc_server.cpp - distributed/pull_rpc_clients.cpp - distributed/updates_rpc_clients.cpp - distributed/updates_rpc_server.cpp - query/distributed_interpreter.cpp - query/plan/distributed.cpp - query/plan/distributed_ops.cpp - query/plan/distributed_pretty_print.cpp - storage/distributed/concurrent_id_mapper_master.cpp - storage/distributed/concurrent_id_mapper_worker.cpp - transactions/distributed/engine_master.cpp - transactions/distributed/engine_worker.cpp - data_structures/concurrent/skiplist_gc.cpp - database/distributed/config.cpp - database/distributed/graph_db_accessor.cpp - durability/distributed/state_delta.cpp - durability/distributed/paths.cpp - durability/distributed/recovery.cpp - durability/distributed/snapshooter.cpp - durability/distributed/wal.cpp - glue/auth.cpp - glue/communication.cpp - query/common.cpp - query/frontend/ast/ast.cpp - query/frontend/ast/cypher_main_visitor.cpp - query/frontend/semantic/required_privileges.cpp - query/frontend/semantic/symbol_generator.cpp - query/frontend/stripped.cpp - query/interpret/awesome_memgraph_functions.cpp - query/interpreter.cpp - query/plan/operator.cpp - query/plan/preprocess.cpp - query/plan/pretty_print.cpp - query/plan/rule_based_planner.cpp - query/plan/variable_start_planner.cpp - query/repl.cpp - query/serialization.cpp - query/typed_value.cpp - storage/common/property_value.cpp - storage/common/property_value_store.cpp - storage/distributed/edge_accessor.cpp - storage/distributed/record_accessor.cpp - storage/distributed/serialization.cpp - storage/distributed/vertex_accessor.cpp - storage/locking/record_lock.cpp - memgraph_init.cpp - transactions/distributed/engine_single_node.cpp -) - -# ----------------------------------------------------------------------------- - -define_add_capnp(mg_distributed_sources generated_capnp_files) - -define_add_lcp(add_lcp_distributed mg_distributed_sources generated_lcp_distributed_files) - -add_lcp_distributed(durability/distributed/state_delta.lcp) -add_lcp_distributed(database/distributed/counters_rpc_messages.lcp CAPNP_SCHEMA @0x95a2c3ea3871e945) -add_capnp(database/distributed/counters_rpc_messages.capnp) -add_lcp_distributed(database/distributed/serialization.lcp CAPNP_SCHEMA @0xdea01657b3563887 - DEPENDS durability/distributed/state_delta.lcp) -add_capnp(database/distributed/serialization.capnp) -add_lcp_distributed(distributed/bfs_rpc_messages.lcp CAPNP_SCHEMA @0x8e508640b09b6d2a) -add_capnp(distributed/bfs_rpc_messages.capnp) -add_lcp_distributed(distributed/coordination_rpc_messages.lcp CAPNP_SCHEMA @0x93df0c4703cf98fb) -add_capnp(distributed/coordination_rpc_messages.capnp) -add_lcp_distributed(distributed/data_rpc_messages.lcp CAPNP_SCHEMA @0xc1c8a341ba37aaf5) -add_capnp(distributed/data_rpc_messages.capnp) -add_lcp_distributed(distributed/durability_rpc_messages.lcp CAPNP_SCHEMA @0xf5e53bc271e2163d) -add_capnp(distributed/durability_rpc_messages.capnp) -add_lcp_distributed(distributed/index_rpc_messages.lcp CAPNP_SCHEMA @0xa8aab46862945bd6) -add_capnp(distributed/index_rpc_messages.capnp) -add_lcp_distributed(distributed/plan_rpc_messages.lcp CAPNP_SCHEMA @0xfcbc48dc9f106d28) -add_capnp(distributed/plan_rpc_messages.capnp) -add_lcp_distributed(distributed/pull_produce_rpc_messages.lcp CAPNP_SCHEMA @0xa78a9254a73685bd - DEPENDS transactions/distributed/serialization.lcp) -add_capnp(distributed/pull_produce_rpc_messages.capnp) -add_lcp_distributed(distributed/storage_gc_rpc_messages.lcp CAPNP_SCHEMA @0xd705663dfe36cf81) -add_capnp(distributed/storage_gc_rpc_messages.capnp) -add_lcp_distributed(distributed/token_sharing_rpc_messages.lcp CAPNP_SCHEMA @0x8f295db54ec4caec) -add_capnp(distributed/token_sharing_rpc_messages.capnp) -add_lcp_distributed(distributed/updates_rpc_messages.lcp CAPNP_SCHEMA @0x82d5f38d73c7b53a) -add_capnp(distributed/updates_rpc_messages.capnp) -add_lcp_distributed(distributed/dynamic_worker_rpc_messages.lcp CAPNP_SCHEMA @0x8c53f6c9a0c71b05) -add_capnp(distributed/dynamic_worker_rpc_messages.capnp) - -# distributed_ops.lcp is leading the capnp code generation, so we don't need -# to generate any capnp for operator.lcp -add_lcp_distributed(query/frontend/ast/ast.lcp) -add_lcp_distributed(query/frontend/ast/ast_serialization.lcp CAPNP_SCHEMA @0xb107d3d6b4b1600b - DEPENDS query/frontend/ast/ast.lcp) -add_capnp(query/frontend/ast/ast_serialization.capnp) -add_lcp_distributed(query/plan/operator.lcp) -add_lcp_distributed(query/plan/distributed_ops.lcp CAPNP_SCHEMA @0xe5cae8d045d30c42 - DEPENDS query/plan/operator.lcp) -add_capnp(query/plan/distributed_ops.capnp) - -add_lcp_distributed(storage/distributed/concurrent_id_mapper_rpc_messages.lcp CAPNP_SCHEMA @0xa6068dae93d225dd) -add_capnp(storage/distributed/concurrent_id_mapper_rpc_messages.capnp) -add_lcp_distributed(transactions/distributed/engine_rpc_messages.lcp CAPNP_SCHEMA @0xde02b7c49180cad5 - DEPENDS transactions/distributed/serialization.lcp) -add_capnp(transactions/distributed/engine_rpc_messages.capnp) - -add_custom_target(generate_lcp_distributed DEPENDS ${generated_lcp_distributed_files}) - -# Registering capnp must come after registering lcp files. - -add_capnp(communication/rpc/messages.capnp) -add_capnp(durability/distributed/serialization.capnp) -add_capnp(query/frontend/semantic/symbol.capnp) -add_capnp(query/serialization.capnp) -add_capnp(storage/distributed/serialization.capnp) - -add_custom_target(generate_capnp DEPENDS generate_lcp_distributed ${generated_capnp_files}) - -set(MG_DISTRIBUTED_LIBS stdc++fs Threads::Threads fmt cppitertools - antlr_opencypher_parser_lib dl glog gflags capnp kj - mg-utils mg-io mg-integrations-kafka mg-requests mg-communication mg-auth mg-stats) - -# STATIC library used by memgraph executables -add_library(mg-distributed STATIC ${mg_distributed_sources}) -target_link_libraries(mg-distributed ${MG_DISTRIBUTED_LIBS}) -add_dependencies(mg-distributed generate_opencypher_parser) -add_dependencies(mg-distributed generate_lcp_distributed) -add_dependencies(mg-distributed generate_capnp) -target_compile_definitions(mg-distributed PUBLIC MG_DISTRIBUTED) - -# ---------------------------------------------------------------------------- -# END Memgraph Distributed -# ---------------------------------------------------------------------------- - string(TOLOWER ${CMAKE_BUILD_TYPE} lower_build_type) # STATIC library used to store key-value pairs @@ -311,18 +151,3 @@ install( ${CMAKE_BINARY_DIR}/tests/manual/bolt_client WORKING_DIRECTORY ${examples})") install(DIRECTORY ${examples}/build/ DESTINATION share/memgraph/examples) - - -# memgraph distributed main executable -add_executable(memgraph_distributed memgraph_distributed.cpp) -target_link_libraries(memgraph_distributed mg-distributed kvstore_lib telemetry_lib) -set_target_properties(memgraph_distributed PROPERTIES - # Set the executable output name to include version information. - OUTPUT_NAME "memgraph_distributed-${memgraph_VERSION}-${COMMIT_HASH}_${CMAKE_BUILD_TYPE}" - # Output the executable in main binary dir. - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) -# Create symlink to the built executable. -add_custom_command(TARGET memgraph_distributed POST_BUILD - COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE:memgraph_distributed> ${CMAKE_BINARY_DIR}/memgraph_distributed - BYPRODUCTS ${CMAKE_BINARY_DIR}/memgraph_distributed - COMMENT Creating symlink to memgraph distributed executable) diff --git a/src/communication/CMakeLists.txt b/src/communication/CMakeLists.txt index bfc48660b..b537cf6db 100644 --- a/src/communication/CMakeLists.txt +++ b/src/communication/CMakeLists.txt @@ -4,24 +4,9 @@ set(communication_src_files client.cpp context.cpp helpers.cpp - init.cpp - rpc/client.cpp - rpc/protocol.cpp - rpc/server.cpp) - -# TODO: Extract data_structures to library -set(communication_src_files ${communication_src_files} - ${CMAKE_SOURCE_DIR}/src/data_structures/concurrent/skiplist_gc.cpp) - -define_add_capnp(communication_src_files communication_capnp_files) - -add_capnp(rpc/messages.capnp) - -add_custom_target(generate_communication_capnp DEPENDS ${communication_capnp_files}) + init.cpp) add_library(mg-communication STATIC ${communication_src_files}) target_link_libraries(mg-communication Threads::Threads mg-utils mg-io fmt glog gflags) target_link_libraries(mg-communication ${OPENSSL_LIBRARIES}) target_include_directories(mg-communication SYSTEM PUBLIC ${OPENSSL_INCLUDE_DIR}) -target_link_libraries(mg-communication capnp kj) -add_dependencies(mg-communication generate_communication_capnp) diff --git a/src/communication/bolt/v1/session.hpp b/src/communication/bolt/v1/session.hpp index ea38192df..b8f69341c 100644 --- a/src/communication/bolt/v1/session.hpp +++ b/src/communication/bolt/v1/session.hpp @@ -60,10 +60,6 @@ class Session { /** Aborts currently running query. */ virtual void Abort() = 0; - /** Return `true` if the user was successfully authenticated. */ - virtual bool Authenticate(const std::string &username, - const std::string &password) = 0; - /** * Executes the session after data has been read into the buffer. * Goes through the bolt states in order to execute commands from the client. diff --git a/src/communication/bolt/v1/states/init.hpp b/src/communication/bolt/v1/states/init.hpp index 473c953f5..fbb924e5e 100644 --- a/src/communication/bolt/v1/states/init.hpp +++ b/src/communication/bolt/v1/states/init.hpp @@ -60,38 +60,6 @@ State StateInitRun(Session &session) { LOG(INFO) << fmt::format("Client connected '{}'", client_name.ValueString()) << std::endl; - // Get authentication data. - std::string username, password; - auto &data = metadata.ValueMap(); - if (!data.count("scheme")) { - LOG(WARNING) << "The client didn't supply authentication information!"; - return State::Close; - } - if (data["scheme"].ValueString() == "basic") { - if (!data.count("principal") || !data.count("credentials")) { - LOG(WARNING) << "The client didn't supply authentication information!"; - return State::Close; - } - username = data["principal"].ValueString(); - password = data["credentials"].ValueString(); - } else if (data["scheme"].ValueString() != "none") { - LOG(WARNING) << "Unsupported authentication scheme: " - << data["scheme"].ValueString(); - return State::Close; - } - - // Authenticate the user. - if (!session.Authenticate(username, password)) { - if (!session.encoder_.MessageFailure( - {{"code", "Memgraph.ClientError.Security.Unauthenticated"}, - {"message", "Authentication failure"}})) { - DLOG(WARNING) << "Couldn't send failure message to the client!"; - } - // Throw an exception to indicate to the network stack that the session - // should be closed and cleaned up. - throw SessionClosedException("The client is not authenticated!"); - } - // Return success. if (!session.encoder_.MessageSuccess()) { DLOG(WARNING) << "Couldn't send success message to the client!"; diff --git a/src/durability/single_node/recovery.cpp b/src/durability/single_node/recovery.cpp index 233a68f35..484d0322c 100644 --- a/src/durability/single_node/recovery.cpp +++ b/src/durability/single_node/recovery.cpp @@ -65,10 +65,6 @@ bool VersionConsistency(const fs::path &durability_dir) { return true; } -bool DistributedVersionConsistency(const int64_t master_version) { - return durability::kVersion == master_version; -} - bool ContainsDurabilityFiles(const fs::path &durability_dir) { for (const auto &durability_type : {kSnapshotDir, kWalDir}) { auto recovery_dir = durability_dir / durability_type; diff --git a/src/durability/single_node/recovery.hpp b/src/durability/single_node/recovery.hpp index 5124b3272..e71bf9a02 100644 --- a/src/durability/single_node/recovery.hpp +++ b/src/durability/single_node/recovery.hpp @@ -74,15 +74,6 @@ bool ReadSnapshotSummary(HashedFileReader &buffer, int64_t &vertex_count, bool VersionConsistency( const std::experimental::filesystem::path &durability_dir); -/** - * Checks whether the current memgraph binary (on a worker) is - * version consistent with the cluster master. - * - * @param master_version - Version of the master. - * @return - True if versions match. - */ -bool DistributedVersionConsistency(const int64_t master_version); - /** * Checks whether the durability directory contains snapshot * or write-ahead log file. diff --git a/src/io/CMakeLists.txt b/src/io/CMakeLists.txt index e6bd87933..0aa3c631d 100644 --- a/src/io/CMakeLists.txt +++ b/src/io/CMakeLists.txt @@ -4,13 +4,5 @@ set(io_src_files network/socket.cpp network/utils.cpp) -define_add_capnp(io_src_files io_capnp_files) - -add_capnp(network/endpoint.capnp) - -add_custom_target(generate_io_capnp DEPENDS ${io_capnp_files}) - add_library(mg-io STATIC ${io_src_files}) target_link_libraries(mg-io stdc++fs Threads::Threads fmt glog mg-utils) -target_link_libraries(mg-io capnp kj) -add_dependencies(mg-io generate_io_capnp) diff --git a/src/io/network/endpoint.cpp b/src/io/network/endpoint.cpp index 5514c13da..42f3d9647 100644 --- a/src/io/network/endpoint.cpp +++ b/src/io/network/endpoint.cpp @@ -24,18 +24,6 @@ Endpoint::Endpoint(const std::string &address, uint16_t port) CHECK(family_ != 0) << "Not a valid IPv4 or IPv6 address: " << address; } -void Save(const Endpoint &endpoint, capnp::Endpoint::Builder *builder) { - builder->setAddress(endpoint.address()); - builder->setPort(endpoint.port()); - builder->setFamily(endpoint.family()); -} - -void Load(Endpoint *endpoint, const capnp::Endpoint::Reader &reader) { - endpoint->address_ = reader.getAddress(); - endpoint->port_ = reader.getPort(); - endpoint->family_ = reader.getFamily(); -} - bool Endpoint::operator==(const Endpoint &other) const { return address_ == other.address_ && port_ == other.port_ && family_ == other.family_; diff --git a/src/io/network/endpoint.hpp b/src/io/network/endpoint.hpp index 5e5b4f970..ffc5951e6 100644 --- a/src/io/network/endpoint.hpp +++ b/src/io/network/endpoint.hpp @@ -5,7 +5,6 @@ #include <iostream> #include <string> -#include "io/network/endpoint.capnp.h" #include "utils/exceptions.hpp" namespace io::network { @@ -33,8 +32,4 @@ class Endpoint { unsigned char family_{0}; }; -void Save(const Endpoint &endpoint, capnp::Endpoint::Builder *builder); - -void Load(Endpoint *endpoint, const capnp::Endpoint::Reader &reader); - } // namespace io::network diff --git a/src/memgraph.cpp b/src/memgraph.cpp index 1ba593812..4cc7e3008 100644 --- a/src/memgraph.cpp +++ b/src/memgraph.cpp @@ -11,8 +11,6 @@ #include "communication/server.hpp" #include "database/single_node/graph_db.hpp" -#include "integrations/kafka/exceptions.hpp" -#include "integrations/kafka/streams.hpp" #include "memgraph_init.hpp" #include "query/exceptions.hpp" #include "telemetry/telemetry.hpp" @@ -48,25 +46,6 @@ void SingleNodeMain() { query::Interpreter interpreter; SessionData session_data{&db, &interpreter}; - integrations::kafka::Streams kafka_streams{ - std::experimental::filesystem::path(FLAGS_durability_directory) / - "streams", - [&session_data]( - const std::string &query, - const std::map<std::string, communication::bolt::Value> ¶ms) { - KafkaStreamWriter(session_data, query, params); - }}; - - try { - // Recover possible streams. - kafka_streams.Recover(); - } catch (const integrations::kafka::KafkaStreamException &e) { - LOG(ERROR) << e.what(); - } - - session_data.interpreter->auth_ = &session_data.auth; - session_data.interpreter->kafka_streams_ = &kafka_streams; - ServerContext context; std::string service_name = "Bolt"; if (FLAGS_key_file != "" && FLAGS_cert_file != "") { diff --git a/src/memgraph_init.cpp b/src/memgraph_init.cpp index 3b9a59ef9..29d1a98f4 100644 --- a/src/memgraph_init.cpp +++ b/src/memgraph_init.cpp @@ -3,11 +3,9 @@ #include <glog/logging.h> #include "config.hpp" -#include "glue/auth.hpp" #include "glue/communication.hpp" #include "query/exceptions.hpp" #include "requests/requests.hpp" -#include "stats/stats.hpp" #include "utils/signals.hpp" #include "utils/sysinfo/memory.hpp" #include "utils/terminate_handler.hpp" @@ -28,8 +26,7 @@ BoltSession::BoltSession(SessionData *data, const io::network::Endpoint &, : communication::bolt::Session<communication::InputStream, communication::OutputStream>(input_stream, output_stream), - transaction_engine_(data->db, data->interpreter), - auth_(&data->auth) {} + transaction_engine_(data->db, data->interpreter) {} using TEncoder = communication::bolt::Session<communication::InputStream, @@ -42,21 +39,7 @@ std::vector<std::string> BoltSession::Interpret( for (const auto &kv : params) params_pv.emplace(kv.first, glue::ToPropertyValue(kv.second)); try { - auto result = transaction_engine_.Interpret(query, params_pv); - if (user_) { - const auto &permissions = user_->GetPermissions(); - for (const auto &privilege : result.second) { - if (permissions.Has(glue::PrivilegeToPermission(privilege)) != - auth::PermissionLevel::GRANT) { - transaction_engine_.Abort(); - throw communication::bolt::ClientError( - "You are not authorized to execute this query! Please contact " - "your database administrator."); - } - } - } - return result.first; - + return transaction_engine_.Interpret(query, params_pv); } catch (const query::QueryException &e) { // Wrap QueryException into ClientError, because we want to allow the // client to fix their query. @@ -83,13 +66,6 @@ std::map<std::string, communication::bolt::Value> BoltSession::PullAll( void BoltSession::Abort() { transaction_engine_.Abort(); } -bool BoltSession::Authenticate(const std::string &username, - const std::string &password) { - if (!auth_->HasUsers()) return true; - user_ = auth_->Authenticate(username, password); - return !!user_; -} - BoltSession::TypedValueResultStream::TypedValueResultStream(TEncoder *encoder) : encoder_(encoder) {} @@ -103,24 +79,6 @@ void BoltSession::TypedValueResultStream::Result( encoder_->MessageRecord(decoded_values); } -void KafkaStreamWriter( - SessionData &session_data, const std::string &query, - const std::map<std::string, communication::bolt::Value> ¶ms) { - auto dba = session_data.db->Access(); - KafkaResultStream stream; - std::map<std::string, PropertyValue> params_pv; - for (const auto &kv : params) - params_pv.emplace(kv.first, glue::ToPropertyValue(kv.second)); - try { - (*session_data.interpreter)(query, *dba, params_pv, false).PullAll(stream); - dba->Commit(); - } catch (const utils::BasicException &e) { - LOG(WARNING) << "[Kafka] query execution failed with an exception: " - << e.what(); - dba->Abort(); - } -}; - // Needed to correctly handle memgraph destruction from a signal handler. // Without having some sort of a flag, it is possible that a signal is handled // when we are exiting main, inside destructors of database::GraphDb and @@ -175,9 +133,6 @@ int WithInit(int argc, char **argv, // Unhandled exception handler init. std::set_terminate(&utils::TerminateHandler); - stats::InitStatsLogging(get_stats_prefix()); - utils::OnScopeExit stop_stats([] { stats::StopStatsLogging(); }); - // Initialize the communication library. communication::Init(); diff --git a/src/memgraph_init.hpp b/src/memgraph_init.hpp index d7032f5e8..10fc9bc18 100644 --- a/src/memgraph_init.hpp +++ b/src/memgraph_init.hpp @@ -9,7 +9,6 @@ #include <gflags/gflags.h> -#include "auth/auth.hpp" #include "communication/bolt/v1/session.hpp" #include "communication/init.hpp" #include "communication/session.hpp" @@ -23,8 +22,6 @@ DECLARE_string(durability_directory); struct SessionData { database::GraphDb *db{nullptr}; query::Interpreter *interpreter{nullptr}; - auth::Auth auth{ - std::experimental::filesystem::path(FLAGS_durability_directory) / "auth"}; }; class BoltSession final @@ -47,9 +44,6 @@ class BoltSession final void Abort() override; - bool Authenticate(const std::string &username, - const std::string &password) override; - private: /// Wrapper around TEncoder which converts TypedValue to Value /// before forwarding the calls to original TEncoder. @@ -64,8 +58,6 @@ class BoltSession final }; query::TransactionEngine transaction_engine_; - auth::Auth *auth_; - std::experimental::optional<auth::User> user_; }; /// Class that implements ResultStream API for Kafka. @@ -77,11 +69,6 @@ class KafkaResultStream { void Result(const std::vector<query::TypedValue> &) {} }; -/// Writes data streamed from kafka to memgraph. -void KafkaStreamWriter( - SessionData &session_data, const std::string &query, - const std::map<std::string, communication::bolt::Value> ¶ms); - /// Set up signal handlers and register `shutdown` on SIGTERM and SIGINT. /// In most cases you don't have to call this. If you are using a custom server /// startup function for `WithInit`, then you probably need to use this to diff --git a/src/query/common.cpp b/src/query/common.cpp index 5d1261012..15e21e2d1 100644 --- a/src/query/common.cpp +++ b/src/query/common.cpp @@ -8,7 +8,6 @@ #include "glog/logging.h" #include "query/exceptions.hpp" -#include "utils/serialization.hpp" #include "utils/string.hpp" namespace query { diff --git a/src/query/context.hpp b/src/query/context.hpp index da31175bd..2eb5ca579 100644 --- a/src/query/context.hpp +++ b/src/query/context.hpp @@ -5,14 +5,6 @@ #include "query/frontend/semantic/symbol_table.hpp" #include "query/parameters.hpp" -namespace auth { -class Auth; -} // namespace auth - -namespace integrations::kafka { -class Streams; -} // namespace integrations::kafka - namespace query { struct EvaluationContext { @@ -36,9 +28,6 @@ class Context { bool is_index_created_ = false; SymbolTable symbol_table_; EvaluationContext evaluation_context_; - - auth::Auth *auth_ = nullptr; - integrations::kafka::Streams *kafka_streams_ = nullptr; }; struct ParsingContext { diff --git a/src/query/frontend/ast/ast.lcp b/src/query/frontend/ast/ast.lcp index 04cc8e41a..c1d1c585c 100644 --- a/src/query/frontend/ast/ast.lcp +++ b/src/query/frontend/ast/ast.lcp @@ -2175,343 +2175,6 @@ cpp<# cpp<#) (:serialize :capnp)) -(lcp:define-class auth-query (clause) - ((action "Action" :scope :public) - (user "std::string" :scope :public) - (role "std::string" :scope :public) - (user-or-role "std::string" :scope :public) - (password "Expression *" :initval "nullptr" :scope :public - :capnp-type "Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (privileges "std::vector<Privilege>" :scope :public - :capnp-save (lambda (builder member capnp-name) - #>cpp - for (size_t i = 0; i < ${member}.size(); ++i) { - switch (${member}[i]) { - case AuthQuery::Privilege::CREATE: - ${builder}.set(i, capnp::AuthQuery::Privilege::CREATE); - break; - case AuthQuery::Privilege::DELETE: - ${builder}.set(i, capnp::AuthQuery::Privilege::DELETE); - break; - case AuthQuery::Privilege::MATCH: - ${builder}.set(i, capnp::AuthQuery::Privilege::MATCH); - break; - case AuthQuery::Privilege::MERGE: - ${builder}.set(i, capnp::AuthQuery::Privilege::MERGE); - break; - case AuthQuery::Privilege::SET: - ${builder}.set(i, capnp::AuthQuery::Privilege::SET); - break; - case AuthQuery::Privilege::REMOVE: - ${builder}.set(i, capnp::AuthQuery::Privilege::REMOVE); - break; - case AuthQuery::Privilege::INDEX: - ${builder}.set(i, capnp::AuthQuery::Privilege::INDEX); - break; - case AuthQuery::Privilege::AUTH: - ${builder}.set(i, capnp::AuthQuery::Privilege::AUTH); - break; - case AuthQuery::Privilege::STREAM: - ${builder}.set(i, capnp::AuthQuery::Privilege::STREAM); - break; - } - } - cpp<#) - :capnp-load (lambda (reader member capnp-name) - #>cpp - ${member}.resize(${reader}.size()); - size_t i = 0; - for (const auto &val : ${reader}) { - switch (val) { - case capnp::AuthQuery::Privilege::CREATE: - ${member}[i] = AuthQuery::Privilege::CREATE; - break; - case capnp::AuthQuery::Privilege::DELETE: - ${member}[i] = AuthQuery::Privilege::DELETE; - break; - case capnp::AuthQuery::Privilege::MATCH: - ${member}[i] = AuthQuery::Privilege::MATCH; - break; - case capnp::AuthQuery::Privilege::MERGE: - ${member}[i] = AuthQuery::Privilege::MERGE; - break; - case capnp::AuthQuery::Privilege::SET: - ${member}[i] = AuthQuery::Privilege::SET; - break; - case capnp::AuthQuery::Privilege::REMOVE: - ${member}[i] = AuthQuery::Privilege::REMOVE; - break; - case capnp::AuthQuery::Privilege::INDEX: - ${member}[i] = AuthQuery::Privilege::INDEX; - break; - case capnp::AuthQuery::Privilege::AUTH: - ${member}[i] = AuthQuery::Privilege::AUTH; - break; - case capnp::AuthQuery::Privilege::STREAM: - ${member}[i] = AuthQuery::Privilege::STREAM; - break; - } - ++i; - } - cpp<#))) - (:public - (lcp:define-enum action - (create-role drop-role show-roles create-user - set-password drop-user show-users set-role - clear-role grant-privilege deny-privilege - revoke-privilege show-privileges - show-role-for-user show-users-for-role) - (:serialize :capnp)) - (lcp:define-enum privilege - (create delete match merge set remove index auth stream) - (:serialize :capnp)) - #>cpp - AuthQuery() = default; - - DEFVISITABLE(TreeVisitor<TypedValue>); - DEFVISITABLE(HierarchicalTreeVisitor); - - AuthQuery *Clone(AstStorage &storage) const override { - return storage.Create<AuthQuery>( - action_, user_, role_, user_or_role_, - password_ ? password_->Clone(storage) : nullptr, privileges_); - } - cpp<#) - (:protected - #>cpp - explicit AuthQuery(int uid) : Clause(uid) {} - - explicit AuthQuery(int uid, Action action, std::string user, std::string role, - std::string user_or_role, Expression *password, - std::vector<Privilege> privileges) - : Clause(uid), - action_(action), - user_(user), - role_(role), - user_or_role_(user_or_role), - password_(password), - privileges_(privileges) {} - cpp<#) - (:private - #>cpp - friend class AstStorage; - cpp<#) - (:serialize :capnp)) - -#>cpp -// Constant that holds all available privileges. -const std::vector<AuthQuery::Privilege> kPrivilegesAll = { - AuthQuery::Privilege::CREATE, AuthQuery::Privilege::DELETE, - AuthQuery::Privilege::MATCH, AuthQuery::Privilege::MERGE, - AuthQuery::Privilege::SET, AuthQuery::Privilege::REMOVE, - AuthQuery::Privilege::INDEX, AuthQuery::Privilege::AUTH, - AuthQuery::Privilege::STREAM}; -cpp<# - -(lcp:define-class create-stream (clause) - ((stream-name "std::string" :scope :public) - (stream-uri "Expression *" :scope :public - :capnp-type "Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (stream-topic "Expression *" :scope :public - :capnp-type "Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (transform-uri "Expression *" :scope :public - :capnp-type "Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (batch-interval-in-ms "Expression *" :scope :public - :capnp-type "Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (batch-size "Expression *" :scope :public - :capnp-type "Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *"))) - (:public - #>cpp - CreateStream() = default; - - DEFVISITABLE(TreeVisitor<TypedValue>); - DEFVISITABLE(HierarchicalTreeVisitor); - - CreateStream *Clone(AstStorage &storage) const override { - return storage.Create<CreateStream>( - stream_name_, stream_uri_->Clone(storage), - stream_topic_->Clone(storage), transform_uri_->Clone(storage), - batch_interval_in_ms_ ? batch_interval_in_ms_->Clone(storage) : nullptr, - batch_size_ ? batch_size_->Clone(storage) : nullptr); - } - cpp<#) - (:protected - #>cpp - explicit CreateStream(int uid) : Clause(uid) {} - CreateStream(int uid, std::string stream_name, Expression *stream_uri, - Expression *stream_topic, Expression *transform_uri, - Expression *batch_interval_in_ms, Expression *batch_size) - : Clause(uid), - stream_name_(std::move(stream_name)), - stream_uri_(stream_uri), - stream_topic_(stream_topic), - transform_uri_(transform_uri), - batch_interval_in_ms_(batch_interval_in_ms), - batch_size_(batch_size) {} - cpp<#) - (:private - #>cpp - friend class AstStorage; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class drop-stream (clause) - ((stream-name "std::string" :scope :public)) - (:public - #>cpp - DropStream() = default; - - DEFVISITABLE(TreeVisitor<TypedValue>); - DEFVISITABLE(HierarchicalTreeVisitor); - - DropStream *Clone(AstStorage &storage) const override { - return storage.Create<DropStream>(stream_name_); - } - cpp<#) - (:protected - #>cpp - explicit DropStream(int uid) : Clause(uid) {} - DropStream(int uid, std::string stream_name) - : Clause(uid), stream_name_(std::move(stream_name)) {} - cpp<#) - (:private - #>cpp - friend class AstStorage; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class show-streams (clause) - () - (:public - #>cpp - ShowStreams() = default; - - DEFVISITABLE(TreeVisitor<TypedValue>); - DEFVISITABLE(HierarchicalTreeVisitor); - - ShowStreams *Clone(AstStorage &storage) const override { - return storage.Create<ShowStreams>(); - } - cpp<#) - (:protected - #>cpp - explicit ShowStreams(int uid) : Clause(uid) {} - cpp<#) - (:private - #>cpp - friend class AstStorage; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class start-stop-stream (clause) - ((stream-name "std::string" :scope :public) - (is-start :bool :scope :public) - (limit-batches "Expression *" :scope :public - :capnp-type "Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *"))) - (:public - #>cpp - StartStopStream() = default; - - DEFVISITABLE(TreeVisitor<TypedValue>); - DEFVISITABLE(HierarchicalTreeVisitor); - - StartStopStream *Clone(AstStorage &storage) const override { - return storage.Create<StartStopStream>( - stream_name_, is_start_, - limit_batches_ ? limit_batches_->Clone(storage) : nullptr); - } - cpp<#) - (:protected - #>cpp - explicit StartStopStream(int uid) : Clause(uid) {} - StartStopStream(int uid, std::string stream_name, bool is_start, - Expression *limit_batches) - : Clause(uid), - stream_name_(std::move(stream_name)), - is_start_(is_start), - limit_batches_(limit_batches) {} - cpp<#) - (:private - #>cpp - friend class AstStorage; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class start-stop-all-streams (clause) - ((is-start :bool :scope :public)) - (:public - #>cpp - StartStopAllStreams() = default; - - DEFVISITABLE(TreeVisitor<TypedValue>); - DEFVISITABLE(HierarchicalTreeVisitor); - - StartStopAllStreams *Clone(AstStorage &storage) const override { - return storage.Create<StartStopAllStreams>(is_start_); - } - cpp<#) - (:protected - #>cpp - explicit StartStopAllStreams(int uid) : Clause(uid) {} - StartStopAllStreams(int uid, bool is_start) - : Clause(uid), is_start_(is_start) {} - - cpp<#) - (:private - #>cpp - friend class AstStorage; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class test-stream (clause) - ((stream-name "std::string" :scope :public) - (limit-batches "Expression *" :scope :public - :capnp-type "Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *"))) - (:public - #>cpp - TestStream() = default; - - DEFVISITABLE(TreeVisitor<TypedValue>); - DEFVISITABLE(HierarchicalTreeVisitor); - - TestStream *Clone(AstStorage &storage) const override { - return storage.Create<TestStream>( - stream_name_, - limit_batches_ ? limit_batches_->Clone(storage) : nullptr); - } - - cpp<#) - (:protected - #>cpp - explicit TestStream(int uid) : Clause(uid) {} - TestStream(int uid, std::string stream_name, Expression *limit_batches) - : Clause(uid), - stream_name_(std::move(stream_name)), - limit_batches_(limit_batches) {} - - cpp<#) - (:private - #>cpp - friend class AstStorage; - cpp<#) - (:serialize :capnp)) - #>cpp #undef CLONE_BINARY_EXPRESSION #undef CLONE_UNARY_EXPRESSION diff --git a/src/query/frontend/ast/ast_visitor.hpp b/src/query/frontend/ast/ast_visitor.hpp index 333e11730..fe4f2afdc 100644 --- a/src/query/frontend/ast/ast_visitor.hpp +++ b/src/query/frontend/ast/ast_visitor.hpp @@ -62,13 +62,6 @@ class Merge; class Unwind; class CreateIndex; class CreateUniqueIndex; -class AuthQuery; -class CreateStream; -class DropStream; -class ShowStreams; -class StartStopStream; -class StartStopAllStreams; -class TestStream; using TreeCompositeVisitor = ::utils::CompositeVisitor< Query, SingleQuery, CypherUnion, NamedExpression, OrOperator, XorOperator, @@ -84,9 +77,7 @@ using TreeCompositeVisitor = ::utils::CompositeVisitor< using TreeLeafVisitor = ::utils::LeafVisitor<Identifier, PrimitiveLiteral, ParameterLookup, - CreateIndex, CreateUniqueIndex, AuthQuery, - CreateStream, DropStream, ShowStreams, StartStopStream, - StartStopAllStreams, TestStream>; + CreateIndex, CreateUniqueIndex>; class HierarchicalTreeVisitor : public TreeCompositeVisitor, public TreeLeafVisitor { @@ -109,8 +100,6 @@ using TreeVisitor = ::utils::Visitor< Aggregation, Function, Reduce, Extract, All, Single, ParameterLookup, Create, Match, Return, With, Pattern, NodeAtom, EdgeAtom, Delete, Where, SetProperty, SetProperties, SetLabels, RemoveProperty, RemoveLabels, Merge, - Unwind, Identifier, PrimitiveLiteral, CreateIndex, CreateUniqueIndex, - AuthQuery, CreateStream, DropStream, ShowStreams, StartStopStream, - StartStopAllStreams, TestStream>; + Unwind, Identifier, PrimitiveLiteral, CreateIndex, CreateUniqueIndex>; } // namespace query diff --git a/src/query/frontend/ast/cypher_main_visitor.cpp b/src/query/frontend/ast/cypher_main_visitor.cpp index 674dcc73e..1a36f24da 100644 --- a/src/query/frontend/ast/cypher_main_visitor.cpp +++ b/src/query/frontend/ast/cypher_main_visitor.cpp @@ -72,40 +72,6 @@ antlrcpp::Any CypherMainVisitor::visitIndexQuery( return query_; } -antlrcpp::Any CypherMainVisitor::visitAuthQuery( - MemgraphCypher::AuthQueryContext *ctx) { - query_ = storage_->Create<Query>(); - query_->single_query_ = storage_->Create<SingleQuery>(); - CHECK(ctx->children.size() == 1) - << "AuthQuery should have exactly one child!"; - query_->single_query_->clauses_.push_back( - ctx->children[0]->accept(this).as<AuthQuery *>()); - return query_; -} - -antlrcpp::Any CypherMainVisitor::visitStreamQuery( - MemgraphCypher::StreamQueryContext *ctx) { - query_ = storage_->Create<Query>(); - query_->single_query_ = storage_->Create<SingleQuery>(); - Clause *clause = nullptr; - if (ctx->createStream()) { - clause = ctx->createStream()->accept(this).as<CreateStream *>(); - } else if (ctx->dropStream()) { - clause = ctx->dropStream()->accept(this).as<DropStream *>(); - } else if (ctx->showStreams()) { - clause = ctx->showStreams()->accept(this).as<ShowStreams *>(); - } else if (ctx->startStopStream()) { - clause = ctx->startStopStream()->accept(this).as<StartStopStream *>(); - } else if (ctx->startStopAllStreams()) { - clause = - ctx->startStopAllStreams()->accept(this).as<StartStopAllStreams *>(); - } else if (ctx->testStream()) { - clause = ctx->testStream()->accept(this).as<TestStream *>(); - } - query_->single_query_->clauses_ = {clause}; - return query_; -} - antlrcpp::Any CypherMainVisitor::visitCypherUnion( MemgraphCypher::CypherUnionContext *ctx) { bool distinct = !ctx->ALL(); @@ -293,352 +259,6 @@ antlrcpp::Any CypherMainVisitor::visitCreateUniqueIndex( dba_->Label(ctx->labelName()->accept(this)), properties); } -/** - * @return std::string - */ -antlrcpp::Any CypherMainVisitor::visitUserOrRoleName( - MemgraphCypher::UserOrRoleNameContext *ctx) { - std::string value = ctx->symbolicName()->accept(this).as<std::string>(); - const std::regex NAME_REGEX("[a-zA-Z0-9_.+-]+"); - if (!std::regex_match(value, NAME_REGEX)) { - throw SyntaxException("Invalid user or role name."); - } - return value; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitCreateRole( - MemgraphCypher::CreateRoleContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::CREATE_ROLE; - auth->role_ = ctx->role->accept(this).as<std::string>(); - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitDropRole( - MemgraphCypher::DropRoleContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::DROP_ROLE; - auth->role_ = ctx->role->accept(this).as<std::string>(); - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitShowRoles( - MemgraphCypher::ShowRolesContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::SHOW_ROLES; - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitCreateUser( - MemgraphCypher::CreateUserContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::CREATE_USER; - auth->user_ = ctx->user->accept(this).as<std::string>(); - if (ctx->password) { - if (!ctx->password->StringLiteral() && !ctx->literal()->CYPHERNULL()) { - throw SyntaxException("Password should be a string literal or null."); - } - auth->password_ = ctx->password->accept(this); - } - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitSetPassword( - MemgraphCypher::SetPasswordContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::SET_PASSWORD; - auth->user_ = ctx->user->accept(this).as<std::string>(); - if (!ctx->password->StringLiteral() && !ctx->literal()->CYPHERNULL()) { - throw SyntaxException("Password should be a string literal or null."); - } - auth->password_ = ctx->password->accept(this); - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitDropUser( - MemgraphCypher::DropUserContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::DROP_USER; - auth->user_ = ctx->user->accept(this).as<std::string>(); - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitShowUsers( - MemgraphCypher::ShowUsersContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::SHOW_USERS; - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitSetRole( - MemgraphCypher::SetRoleContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::SET_ROLE; - auth->user_ = ctx->user->accept(this).as<std::string>(); - auth->role_ = ctx->role->accept(this).as<std::string>(); - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitClearRole( - MemgraphCypher::ClearRoleContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::CLEAR_ROLE; - auth->user_ = ctx->user->accept(this).as<std::string>(); - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitGrantPrivilege( - MemgraphCypher::GrantPrivilegeContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::GRANT_PRIVILEGE; - auth->user_or_role_ = ctx->userOrRole->accept(this).as<std::string>(); - if (ctx->privilegeList()) { - for (auto *privilege : ctx->privilegeList()->privilege()) { - auth->privileges_.push_back(privilege->accept(this)); - } - } else { - /* grant all privileges */ - auth->privileges_ = kPrivilegesAll; - } - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitDenyPrivilege( - MemgraphCypher::DenyPrivilegeContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::DENY_PRIVILEGE; - auth->user_or_role_ = ctx->userOrRole->accept(this).as<std::string>(); - if (ctx->privilegeList()) { - for (auto *privilege : ctx->privilegeList()->privilege()) { - auth->privileges_.push_back(privilege->accept(this)); - } - } else { - /* deny all privileges */ - auth->privileges_ = kPrivilegesAll; - } - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitRevokePrivilege( - MemgraphCypher::RevokePrivilegeContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::REVOKE_PRIVILEGE; - auth->user_or_role_ = ctx->userOrRole->accept(this).as<std::string>(); - if (ctx->privilegeList()) { - for (auto *privilege : ctx->privilegeList()->privilege()) { - auth->privileges_.push_back(privilege->accept(this)); - } - } else { - /* revoke all privileges */ - auth->privileges_ = kPrivilegesAll; - } - return auth; -} - -/** - * @return AuthQuery::Privilege - */ -antlrcpp::Any CypherMainVisitor::visitPrivilege( - MemgraphCypher::PrivilegeContext *ctx) { - if (ctx->CREATE()) return AuthQuery::Privilege::CREATE; - if (ctx->DELETE()) return AuthQuery::Privilege::DELETE; - if (ctx->MATCH()) return AuthQuery::Privilege::MATCH; - if (ctx->MERGE()) return AuthQuery::Privilege::MERGE; - if (ctx->SET()) return AuthQuery::Privilege::SET; - if (ctx->REMOVE()) return AuthQuery::Privilege::REMOVE; - if (ctx->INDEX()) return AuthQuery::Privilege::INDEX; - if (ctx->AUTH()) return AuthQuery::Privilege::AUTH; - if (ctx->STREAM()) return AuthQuery::Privilege::STREAM; - LOG(FATAL) << "Should not get here - unknown privilege!"; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitShowPrivileges( - MemgraphCypher::ShowPrivilegesContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::SHOW_PRIVILEGES; - auth->user_or_role_ = ctx->userOrRole->accept(this).as<std::string>(); - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitShowRoleForUser( - MemgraphCypher::ShowRoleForUserContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::SHOW_ROLE_FOR_USER; - auth->user_ = ctx->user->accept(this).as<std::string>(); - return auth; -} - -/** - * @return AuthQuery* - */ -antlrcpp::Any CypherMainVisitor::visitShowUsersForRole( - MemgraphCypher::ShowUsersForRoleContext *ctx) { - AuthQuery *auth = storage_->Create<AuthQuery>(); - auth->action_ = AuthQuery::Action::SHOW_USERS_FOR_ROLE; - auth->role_ = ctx->role->accept(this).as<std::string>(); - return auth; -} - -/** - * @return CreateStream* - */ -antlrcpp::Any CypherMainVisitor::visitCreateStream( - MemgraphCypher::CreateStreamContext *ctx) { - std::string stream_name(ctx->streamName()->getText()); - if (!ctx->streamUri->StringLiteral()) { - throw SyntaxException("Stream URI should be a string literal."); - } - Expression *stream_uri = ctx->streamUri->accept(this); - - if (!ctx->streamTopic->StringLiteral()) { - throw SyntaxException("Topic should be a string literal."); - } - Expression *stream_topic = ctx->streamTopic->accept(this); - - if (!ctx->transformUri->StringLiteral()) { - throw SyntaxException("Transform URI should be a string literal."); - } - Expression *transform_uri = ctx->transformUri->accept(this); - - Expression *batch_interval_in_ms = nullptr; - if (ctx->batchIntervalOption()) { - batch_interval_in_ms = ctx->batchIntervalOption()->accept(this); - } - - Expression *batch_size = nullptr; - if (ctx->batchSizeOption()) { - batch_size = ctx->batchSizeOption()->accept(this); - } - - return storage_->Create<CreateStream>(stream_name, stream_uri, stream_topic, - transform_uri, batch_interval_in_ms, - batch_size); -} - -/** - * @return Expression* - */ -antlrcpp::Any CypherMainVisitor::visitBatchIntervalOption( - MemgraphCypher::BatchIntervalOptionContext *ctx) { - if (!ctx->literal()->numberLiteral() || - !ctx->literal()->numberLiteral()->integerLiteral()) { - throw SyntaxException("Batch interval should be an integer."); - } - return ctx->literal()->accept(this); -} - -/** - * @return Expression* - */ -antlrcpp::Any CypherMainVisitor::visitBatchSizeOption( - MemgraphCypher::BatchSizeOptionContext *ctx) { - if (!ctx->literal()->numberLiteral() || - !ctx->literal()->numberLiteral()->integerLiteral()) { - throw SyntaxException("Batch size should be an integer."); - } - return ctx->literal()->accept(this); -} - -/** - * @return DropStream* - */ -antlrcpp::Any CypherMainVisitor::visitDropStream( - MemgraphCypher::DropStreamContext *ctx) { - return storage_->Create<DropStream>( - std::string(ctx->streamName()->getText())); -} - -/** - * @return ShowStreams* - */ -antlrcpp::Any CypherMainVisitor::visitShowStreams( - MemgraphCypher::ShowStreamsContext *ctx) { - return storage_->Create<ShowStreams>(); -} - -/** - * @return StartStopStream* - */ -antlrcpp::Any CypherMainVisitor::visitStartStopStream( - MemgraphCypher::StartStopStreamContext *ctx) { - std::string stream_name(std::string(ctx->streamName()->getText())); - bool is_start = static_cast<bool>(ctx->START()); - Expression *limit_batches = nullptr; - - if (ctx->limitBatchesOption()) { - if (!is_start) { - throw SyntaxException("STOP STREAM can't set batch limit."); - } - limit_batches = ctx->limitBatchesOption()->accept(this); - } - - return storage_->Create<StartStopStream>(stream_name, is_start, - limit_batches); -} - -/** - * @return Expression* - */ -antlrcpp::Any CypherMainVisitor::visitLimitBatchesOption( - MemgraphCypher::LimitBatchesOptionContext *ctx) { - if (!ctx->literal()->numberLiteral() || - !ctx->literal()->numberLiteral()->integerLiteral()) { - throw SyntaxException("Batch limit should be an integer."); - } - return ctx->literal()->accept(this); -} - -/* - * @return StartStopAllStreams* - */ -antlrcpp::Any CypherMainVisitor::visitStartStopAllStreams( - MemgraphCypher::StartStopAllStreamsContext *ctx) { - bool is_start = static_cast<bool>(ctx->START()); - return storage_->Create<StartStopAllStreams>(is_start); -} - antlrcpp::Any CypherMainVisitor::visitCypherReturn( MemgraphCypher::CypherReturnContext *ctx) { auto *return_clause = storage_->Create<Return>(); @@ -649,21 +269,6 @@ antlrcpp::Any CypherMainVisitor::visitCypherReturn( return return_clause; } -/** - * @return TestStream* - */ -antlrcpp::Any CypherMainVisitor::visitTestStream( - MemgraphCypher::TestStreamContext *ctx) { - std::string stream_name(std::string(ctx->streamName()->getText())); - Expression *limit_batches = nullptr; - - if (ctx->limitBatchesOption()) { - limit_batches = ctx->limitBatchesOption()->accept(this); - } - - return storage_->Create<TestStream>(stream_name, limit_batches); -} - antlrcpp::Any CypherMainVisitor::visitReturnBody( MemgraphCypher::ReturnBodyContext *ctx) { ReturnBody body; diff --git a/src/query/frontend/ast/cypher_main_visitor.hpp b/src/query/frontend/ast/cypher_main_visitor.hpp index 51f9c2991..2e6818cea 100644 --- a/src/query/frontend/ast/cypher_main_visitor.hpp +++ b/src/query/frontend/ast/cypher_main_visitor.hpp @@ -152,17 +152,6 @@ class CypherMainVisitor : public antlropencypher::MemgraphCypherBaseVisitor { antlrcpp::Any visitExplainQuery( MemgraphCypher::ExplainQueryContext *ctx) override; - /** - * @return Query* - */ - antlrcpp::Any visitAuthQuery(MemgraphCypher::AuthQueryContext *ctx) override; - - /** - * @return Query* - */ - antlrcpp::Any visitStreamQuery( - MemgraphCypher::StreamQueryContext *ctx) override; - /** * @return CypherUnion* */ @@ -191,28 +180,6 @@ class CypherMainVisitor : public antlropencypher::MemgraphCypherBaseVisitor { */ antlrcpp::Any visitCreate(MemgraphCypher::CreateContext *ctx) override; - /** - * @return std::string - */ - antlrcpp::Any visitUserOrRoleName( - MemgraphCypher::UserOrRoleNameContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitCreateRole( - MemgraphCypher::CreateRoleContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitDropRole(MemgraphCypher::DropRoleContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitShowRoles(MemgraphCypher::ShowRolesContext *ctx) override; - /** * @return CreateIndex* */ @@ -225,124 +192,6 @@ class CypherMainVisitor : public antlropencypher::MemgraphCypherBaseVisitor { antlrcpp::Any visitCreateUniqueIndex( MemgraphCypher::CreateUniqueIndexContext *ctx) override; - /** - * @return AuthQuery* - */ - antlrcpp::Any visitCreateUser( - MemgraphCypher::CreateUserContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitSetPassword( - MemgraphCypher::SetPasswordContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitDropUser(MemgraphCypher::DropUserContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitShowUsers(MemgraphCypher::ShowUsersContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitSetRole(MemgraphCypher::SetRoleContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitClearRole(MemgraphCypher::ClearRoleContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitGrantPrivilege( - MemgraphCypher::GrantPrivilegeContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitDenyPrivilege( - MemgraphCypher::DenyPrivilegeContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitRevokePrivilege( - MemgraphCypher::RevokePrivilegeContext *ctx) override; - - /** - * @return AuthQuery::Privilege - */ - antlrcpp::Any visitPrivilege(MemgraphCypher::PrivilegeContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitShowPrivileges( - MemgraphCypher::ShowPrivilegesContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitShowRoleForUser( - MemgraphCypher::ShowRoleForUserContext *ctx) override; - - /** - * @return AuthQuery* - */ - antlrcpp::Any visitShowUsersForRole( - MemgraphCypher::ShowUsersForRoleContext *ctx) override; - - /** - * @return CreateStream* - */ - antlrcpp::Any visitCreateStream( - MemgraphCypher::CreateStreamContext *ctx) override; - - antlrcpp::Any visitBatchIntervalOption( - MemgraphCypher::BatchIntervalOptionContext *ctx) override; - - antlrcpp::Any visitBatchSizeOption( - MemgraphCypher::BatchSizeOptionContext *ctx) override; - - /** - * @return DropStream* - */ - antlrcpp::Any visitDropStream( - MemgraphCypher::DropStreamContext *ctx) override; - - /** - * @return ShowStreams* - */ - antlrcpp::Any visitShowStreams( - MemgraphCypher::ShowStreamsContext *ctx) override; - - /** - * @return StartStopStream* - */ - antlrcpp::Any visitStartStopStream( - MemgraphCypher::StartStopStreamContext *ctx) override; - - /** - * @return StartStopAllStreams* - */ - antlrcpp::Any visitStartStopAllStreams( - MemgraphCypher::StartStopAllStreamsContext *ctx) override; - - antlrcpp::Any visitLimitBatchesOption( - MemgraphCypher::LimitBatchesOptionContext *ctx) override; - - /** - * @return TestStream* - */ - antlrcpp::Any visitTestStream( - MemgraphCypher::TestStreamContext *ctx) override; - /** * @return Return* */ diff --git a/src/query/frontend/opencypher/grammar/MemgraphCypher.g4 b/src/query/frontend/opencypher/grammar/MemgraphCypher.g4 index aa3f24551..dbef61ba2 100644 --- a/src/query/frontend/opencypher/grammar/MemgraphCypher.g4 +++ b/src/query/frontend/opencypher/grammar/MemgraphCypher.g4 @@ -5,134 +5,3 @@ parser grammar MemgraphCypher ; options { tokenVocab=MemgraphCypherLexer; } import Cypher ; - -memgraphCypherKeyword : cypherKeyword - | ALTER - | AUTH - | BATCH - | BATCHES - | CLEAR - | DATA - | DENY - | DROP - | FOR - | FROM - | GRANT - | IDENTIFIED - | INTERVAL - | K_TEST - | KAFKA - | LOAD - | PASSWORD - | PRIVILEGES - | REVOKE - | ROLE - | ROLES - | SIZE - | START - | STOP - | STREAM - | STREAMS - | TO - | TOPIC - | TRANSFORM - | USER - | USERS - ; - -symbolicName : UnescapedSymbolicName - | EscapedSymbolicName - | memgraphCypherKeyword - ; - -query : cypherQuery - | indexQuery - | explainQuery - | authQuery - | streamQuery - ; - -authQuery : createRole - | dropRole - | showRoles - | createUser - | setPassword - | dropUser - | showUsers - | setRole - | clearRole - | grantPrivilege - | denyPrivilege - | revokePrivilege - | showPrivileges - | showRoleForUser - | showUsersForRole - ; - -userOrRoleName : symbolicName ; - -createRole : CREATE ROLE role=userOrRoleName ; - -dropRole : DROP ROLE role=userOrRoleName ; - -showRoles : SHOW ROLES ; - -createUser : CREATE USER user=userOrRoleName - ( IDENTIFIED BY password=literal )? ; - -setPassword : SET PASSWORD FOR user=userOrRoleName TO password=literal; - -dropUser : DROP USER user=userOrRoleName ; - -showUsers : SHOW USERS ; - -setRole : SET ROLE FOR user=userOrRoleName TO role=userOrRoleName; - -clearRole : CLEAR ROLE FOR user=userOrRoleName ; - -grantPrivilege : GRANT ( ALL PRIVILEGES | privileges=privilegeList ) TO userOrRole=userOrRoleName ; - -denyPrivilege : DENY ( ALL PRIVILEGES | privileges=privilegeList ) TO userOrRole=userOrRoleName ; - -revokePrivilege : REVOKE ( ALL PRIVILEGES | privileges=privilegeList ) FROM userOrRole=userOrRoleName ; - -privilege : CREATE | DELETE | MATCH | MERGE | SET - | REMOVE | INDEX | AUTH | STREAM ; - -privilegeList : privilege ( ',' privilege )* ; - -showPrivileges : SHOW PRIVILEGES FOR userOrRole=userOrRoleName ; - -showRoleForUser : SHOW ROLE FOR user=userOrRoleName ; - -showUsersForRole : SHOW USERS FOR role=userOrRoleName ; - -streamQuery : createStream - | dropStream - | showStreams - | startStopStream - | startStopAllStreams - | testStream - ; - -streamName : symbolicName ; - -createStream : CREATE STREAM streamName AS LOAD DATA KAFKA -streamUri=literal WITH TOPIC streamTopic=literal WITH TRANSFORM -transformUri=literal ( batchIntervalOption )? ( batchSizeOption )? ; - -batchIntervalOption : BATCH INTERVAL literal ; - -batchSizeOption : BATCH SIZE literal ; - -dropStream : DROP STREAM streamName ; - -showStreams : SHOW STREAMS ; - -startStopStream : ( START | STOP ) STREAM streamName ( limitBatchesOption )? ; - -limitBatchesOption : LIMIT limitBatches=literal BATCHES ; - -startStopAllStreams : ( START | STOP ) ALL STREAMS ; - -testStream : K_TEST STREAM streamName ( limitBatchesOption )? ; diff --git a/src/query/frontend/opencypher/grammar/MemgraphCypherLexer.g4 b/src/query/frontend/opencypher/grammar/MemgraphCypherLexer.g4 index cbb97da34..344be42d5 100644 --- a/src/query/frontend/opencypher/grammar/MemgraphCypherLexer.g4 +++ b/src/query/frontend/opencypher/grammar/MemgraphCypherLexer.g4 @@ -9,36 +9,3 @@ lexer grammar MemgraphCypherLexer ; import CypherLexer ; - -ALTER : A L T E R ; -AUTH : A U T H ; -BATCH : B A T C H ; -BATCHES : B A T C H E S ; -CLEAR : C L E A R ; -DATA : D A T A ; -DENY : D E N Y ; -DROP : D R O P ; -FOR : F O R ; -FROM : F R O M ; -GRANT : G R A N T ; -GRANTS : G R A N T S ; -IDENTIFIED : I D E N T I F I E D ; -INTERVAL : I N T E R V A L ; -K_TEST : T E S T ; -KAFKA : K A F K A ; -LOAD : L O A D ; -PASSWORD : P A S S W O R D ; -PRIVILEGES : P R I V I L E G E S ; -REVOKE : R E V O K E ; -ROLE : R O L E ; -ROLES : R O L E S ; -SIZE : S I Z E ; -START : S T A R T ; -STOP : S T O P ; -STREAM : S T R E A M ; -STREAMS : S T R E A M S ; -TO : T O ; -TOPIC : T O P I C ; -TRANSFORM : T R A N S F O R M ; -USER : U S E R ; -USERS : U S E R S ; diff --git a/src/query/frontend/semantic/symbol_generator.cpp b/src/query/frontend/semantic/symbol_generator.cpp index 000b2dde8..b954619eb 100644 --- a/src/query/frontend/semantic/symbol_generator.cpp +++ b/src/query/frontend/semantic/symbol_generator.cpp @@ -222,20 +222,6 @@ bool SymbolGenerator::Visit(CreateIndex &) { return true; } bool SymbolGenerator::Visit(CreateUniqueIndex &) { return true; } -bool SymbolGenerator::Visit(AuthQuery &) { return true; } - -bool SymbolGenerator::Visit(CreateStream &) { return true; } - -bool SymbolGenerator::Visit(DropStream &) { return true; } - -bool SymbolGenerator::Visit(ShowStreams &) { return true; } - -bool SymbolGenerator::Visit(StartStopStream &) { return true; } - -bool SymbolGenerator::Visit(StartStopAllStreams &) { return true; } - -bool SymbolGenerator::Visit(TestStream &) { return true; } - // Expressions SymbolGenerator::ReturnType SymbolGenerator::Visit(Identifier &ident) { diff --git a/src/query/frontend/semantic/symbol_generator.hpp b/src/query/frontend/semantic/symbol_generator.hpp index b46b30b61..608658f27 100644 --- a/src/query/frontend/semantic/symbol_generator.hpp +++ b/src/query/frontend/semantic/symbol_generator.hpp @@ -48,13 +48,6 @@ class SymbolGenerator : public HierarchicalTreeVisitor { bool PostVisit(Match &) override; bool Visit(CreateIndex &) override; bool Visit(CreateUniqueIndex &) override; - bool Visit(AuthQuery &) override; - bool Visit(CreateStream &) override; - bool Visit(DropStream &) override; - bool Visit(ShowStreams &) override; - bool Visit(StartStopStream &) override; - bool Visit(StartStopAllStreams &) override; - bool Visit(TestStream &) override; // Expressions ReturnType Visit(Identifier &) override; diff --git a/src/query/interpret/eval.hpp b/src/query/interpret/eval.hpp index a74954310..e2bf2f0cd 100644 --- a/src/query/interpret/eval.hpp +++ b/src/query/interpret/eval.hpp @@ -57,13 +57,6 @@ class ExpressionEvaluator : public TreeVisitor<TypedValue> { BLOCK_VISIT(Unwind); BLOCK_VISIT(CreateIndex); BLOCK_VISIT(CreateUniqueIndex); - BLOCK_VISIT(AuthQuery); - BLOCK_VISIT(CreateStream); - BLOCK_VISIT(DropStream); - BLOCK_VISIT(ShowStreams); - BLOCK_VISIT(StartStopStream); - BLOCK_VISIT(StartStopAllStreams); - BLOCK_VISIT(TestStream); #undef BLOCK_VISIT diff --git a/src/query/interpreter.cpp b/src/query/interpreter.cpp index 888c5f163..5337942be 100644 --- a/src/query/interpreter.cpp +++ b/src/query/interpreter.cpp @@ -6,7 +6,6 @@ #include "query/exceptions.hpp" #include "query/frontend/ast/cypher_main_visitor.hpp" #include "query/frontend/opencypher/parser.hpp" -#include "query/frontend/semantic/required_privileges.hpp" #include "query/frontend/semantic/symbol_generator.hpp" #include "query/plan/planner.hpp" #include "query/plan/vertex_count_cache.hpp" @@ -51,8 +50,6 @@ Interpreter::Results Interpreter::operator()( Context ctx(db_accessor); ctx.in_explicit_transaction_ = in_explicit_transaction; - ctx.auth_ = auth_; - ctx.kafka_streams_ = kafka_streams_; ctx.evaluation_context_ = evaluation_context; ParsingContext parsing_context; @@ -61,9 +58,6 @@ Interpreter::Results Interpreter::operator()( AstStorage ast_storage; Query *ast = QueryToAst(stripped, parsing_context, &ast_storage, &db_accessor); - // TODO: Maybe cache required privileges to improve performance on very simple - // queries. - auto required_privileges = query::GetRequiredPrivileges(ast); auto frontend_time = frontend_timer.Elapsed(); // Try to get a cached plan. Note that this local shared_ptr might be the only @@ -114,7 +108,7 @@ Interpreter::Results Interpreter::operator()( } return Results(std::move(ctx), plan, std::move(cursor), output_symbols, - header, summary, plan_cache_, required_privileges); + header, summary, plan_cache_); } std::shared_ptr<Interpreter::CachedPlan> Interpreter::AstToPlan( diff --git a/src/query/interpreter.hpp b/src/query/interpreter.hpp index 6a2ca555f..531fc15c4 100644 --- a/src/query/interpreter.hpp +++ b/src/query/interpreter.hpp @@ -16,14 +16,6 @@ DECLARE_bool(query_cost_planner); DECLARE_int32(query_plan_cache_ttl); -namespace auth { -class Auth; -} // namespace auth - -namespace integrations::kafka { -class Streams; -} // namespace integrations::kafka - namespace query { // TODO: Maybe this should move to query/plan/planner. @@ -74,8 +66,7 @@ class Interpreter { Results(Context ctx, std::shared_ptr<CachedPlan> plan, std::unique_ptr<query::plan::Cursor> cursor, std::vector<Symbol> output_symbols, std::vector<std::string> header, - std::map<std::string, TypedValue> summary, PlanCacheT &plan_cache, - std::vector<AuthQuery::Privilege> privileges) + std::map<std::string, TypedValue> summary, PlanCacheT &plan_cache) : ctx_(std::move(ctx)), plan_(plan), cursor_(std::move(cursor)), @@ -83,8 +74,7 @@ class Interpreter { output_symbols_(output_symbols), header_(header), summary_(summary), - plan_cache_(plan_cache), - privileges_(std::move(privileges)) {} + plan_cache_(plan_cache) {} public: Results(const Results &) = delete; @@ -140,10 +130,6 @@ class Interpreter { const std::vector<std::string> &header() { return header_; } const std::map<std::string, TypedValue> &summary() { return summary_; } - const std::vector<AuthQuery::Privilege> &privileges() { - return privileges_; - } - private: Context ctx_; std::shared_ptr<CachedPlan> plan_; @@ -157,8 +143,6 @@ class Interpreter { double execution_time_{0}; // Gets invalidated after if an index has been built. PlanCacheT &plan_cache_; - - std::vector<AuthQuery::Privilege> privileges_; }; Interpreter() = default; @@ -178,9 +162,6 @@ class Interpreter { const std::map<std::string, PropertyValue> ¶ms, bool in_explicit_transaction); - auth::Auth *auth_ = nullptr; - integrations::kafka::Streams *kafka_streams_ = nullptr; - protected: // high level tree -> logical plan // AstStorage and SymbolTable may be modified during planning. The created diff --git a/src/query/plan/cost_estimator.hpp b/src/query/plan/cost_estimator.hpp index 5971090dc..05d8c76d6 100644 --- a/src/query/plan/cost_estimator.hpp +++ b/src/query/plan/cost_estimator.hpp @@ -185,13 +185,6 @@ class CostEstimator : public HierarchicalLogicalOperatorVisitor { bool Visit(Once &) override { return true; } bool Visit(CreateIndex &) override { return true; } - bool Visit(AuthHandler &) override { return true; } - bool Visit(CreateStream &) override { return true; } - bool Visit(DropStream &) override { return true; } - bool Visit(ShowStreams &) override { return true; } - bool Visit(StartStopStream &) override { return true; } - bool Visit(StartStopAllStreams &) override { return true; } - bool Visit(TestStream &) override { return true; } // TODO: Cost estimate PullRemote and ProduceRemote? diff --git a/src/query/plan/operator.cpp b/src/query/plan/operator.cpp index c6bcd98a7..89566d648 100644 --- a/src/query/plan/operator.cpp +++ b/src/query/plan/operator.cpp @@ -13,13 +13,9 @@ #include "glog/logging.h" -#include "auth/auth.hpp" #include "communication/result_stream_faker.hpp" #include "database/graph_db_accessor.hpp" -#include "glue/auth.hpp" #include "glue/communication.hpp" -#include "integrations/kafka/exceptions.hpp" -#include "integrations/kafka/streams.hpp" #include "query/context.hpp" #include "query/exceptions.hpp" #include "query/frontend/ast/ast.hpp" @@ -3247,743 +3243,6 @@ std::unique_ptr<Cursor> Cartesian::MakeCursor( return std::make_unique<CartesianCursor>(*this, db); } -AuthHandler::AuthHandler(AuthQuery::Action action, std::string user, - std::string role, std::string user_or_role, - Expression *password, - std::vector<AuthQuery::Privilege> privileges, - Symbol user_symbol, Symbol role_symbol, - Symbol privilege_symbol, Symbol effective_symbol, - Symbol details_symbol) - : action_(action), - user_(user), - role_(role), - user_or_role_(user_or_role), - password_(password), - privileges_(privileges), - user_symbol_(user_symbol), - role_symbol_(role_symbol), - privilege_symbol_(privilege_symbol), - effective_symbol_(effective_symbol), - details_symbol_(details_symbol) {} - -bool AuthHandler::Accept(HierarchicalLogicalOperatorVisitor &visitor) { - return visitor.Visit(*this); -} - -std::vector<Symbol> AuthHandler::OutputSymbols(const SymbolTable &) const { - switch (action_) { - case AuthQuery::Action::SHOW_USERS: - case AuthQuery::Action::SHOW_USERS_FOR_ROLE: - return {user_symbol_}; - - case AuthQuery::Action::SHOW_ROLES: - case AuthQuery::Action::SHOW_ROLE_FOR_USER: - return {role_symbol_}; - - case AuthQuery::Action::SHOW_PRIVILEGES: - return {privilege_symbol_, effective_symbol_, details_symbol_}; - - case AuthQuery::Action::CREATE_USER: - case AuthQuery::Action::DROP_USER: - case AuthQuery::Action::SET_PASSWORD: - case AuthQuery::Action::CREATE_ROLE: - case AuthQuery::Action::DROP_ROLE: - case AuthQuery::Action::SET_ROLE: - case AuthQuery::Action::CLEAR_ROLE: - case AuthQuery::Action::GRANT_PRIVILEGE: - case AuthQuery::Action::DENY_PRIVILEGE: - case AuthQuery::Action::REVOKE_PRIVILEGE: - return {}; - } -} - -class AuthHandlerCursor : public Cursor { - public: - AuthHandlerCursor(const AuthHandler &self) : self_(self) {} - - std::vector<auth::Permission> GetAuthPermissions() { - std::vector<auth::Permission> ret; - for (const auto &privilege : self_.privileges_) { - ret.push_back(glue::PrivilegeToPermission(privilege)); - } - return ret; - } - - std::vector<std::tuple<std::string, std::string, std::string>> - GetGrantsForAuthUser(const auth::User &user) { - std::vector<std::tuple<std::string, std::string, std::string>> ret; - const auto &permissions = user.GetPermissions(); - for (const auto &privilege : kPrivilegesAll) { - auto permission = glue::PrivilegeToPermission(privilege); - auto effective = permissions.Has(permission); - if (permissions.Has(permission) != auth::PermissionLevel::NEUTRAL) { - std::vector<std::string> description; - auto user_level = user.permissions().Has(permission); - if (user_level == auth::PermissionLevel::GRANT) { - description.push_back("GRANTED TO USER"); - } else if (user_level == auth::PermissionLevel::DENY) { - description.push_back("DENIED TO USER"); - } - if (user.role()) { - auto role_level = user.role()->permissions().Has(permission); - if (role_level == auth::PermissionLevel::GRANT) { - description.push_back("GRANTED TO ROLE"); - } else if (role_level == auth::PermissionLevel::DENY) { - description.push_back("DENIED TO ROLE"); - } - } - ret.push_back({auth::PermissionToString(permission), - auth::PermissionLevelToString(effective), - utils::Join(description, ", ")}); - } - } - return ret; - } - - std::vector<std::tuple<std::string, std::string, std::string>> - GetGrantsForAuthRole(const auth::Role &role) { - std::vector<std::tuple<std::string, std::string, std::string>> ret; - const auto &permissions = role.permissions(); - for (const auto &privilege : kPrivilegesAll) { - auto permission = glue::PrivilegeToPermission(privilege); - auto effective = permissions.Has(permission); - if (effective != auth::PermissionLevel::NEUTRAL) { - std::string description; - if (effective == auth::PermissionLevel::GRANT) { - description = "GRANTED TO ROLE"; - } else if (effective == auth::PermissionLevel::DENY) { - description = "DENIED TO ROLE"; - } - ret.push_back({auth::PermissionToString(permission), - auth::PermissionLevelToString(effective), description}); - } - } - return ret; - } - - bool Pull(Frame &frame, Context &ctx) override { - if (ctx.in_explicit_transaction_) { - throw UserModificationInMulticommandTxException(); - } - - ExpressionEvaluator evaluator(&frame, ctx.symbol_table_, - ctx.evaluation_context_, &ctx.db_accessor_, - GraphView::OLD); - std::experimental::optional<std::string> password; - if (self_.password_) { - auto password_tv = self_.password_->Accept(evaluator); - if (!password_tv.IsString() && !password_tv.IsNull()) { - throw QueryRuntimeException( - "Expected string or null for password, got {}.", - password_tv.type()); - } - if (password_tv.IsString()) { - password = password_tv.ValueString(); - } - } - - auto &auth = *ctx.auth_; - - switch (self_.action_) { - case AuthQuery::Action::CREATE_USER: { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto user = auth.AddUser(self_.user_, password); - if (!user) { - throw QueryRuntimeException("User or role '{}' already exists.", - self_.user_); - } - return false; - } - - case AuthQuery::Action::DROP_USER: { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto user = auth.GetUser(self_.user_); - if (!user) { - throw QueryRuntimeException("User '{}' doesn't exist.", self_.user_); - } - if (!auth.RemoveUser(self_.user_)) { - throw QueryRuntimeException("Couldn't remove user '{}'.", - self_.user_); - } - return false; - } - - case AuthQuery::Action::SET_PASSWORD: { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto user = auth.GetUser(self_.user_); - if (!user) { - throw QueryRuntimeException("User '{}' doesn't exist.", self_.user_); - } - user->UpdatePassword(password); - auth.SaveUser(*user); - return false; - } - - case AuthQuery::Action::CREATE_ROLE: { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto role = auth.AddRole(self_.role_); - if (!role) { - throw QueryRuntimeException("User or role '{}' already exists.", - self_.role_); - } - return false; - } - - case AuthQuery::Action::DROP_ROLE: { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto role = auth.GetRole(self_.role_); - if (!role) { - throw QueryRuntimeException("Role '{}' doesn't exist.", self_.role_); - } - if (!auth.RemoveRole(self_.role_)) { - throw QueryRuntimeException("Couldn't remove role '{}'.", - self_.role_); - } - return false; - } - - case AuthQuery::Action::SHOW_USERS: { - if (!users_) { - std::lock_guard<std::mutex> lock(auth.WithLock()); - users_.emplace(auth.AllUsers()); - users_it_ = users_->begin(); - } - - if (users_it_ == users_->end()) return false; - - frame[self_.user_symbol_] = users_it_->username(); - users_it_++; - - return true; - } - - case AuthQuery::Action::SHOW_ROLES: { - if (!roles_) { - std::lock_guard<std::mutex> lock(auth.WithLock()); - roles_.emplace(auth.AllRoles()); - roles_it_ = roles_->begin(); - } - - if (roles_it_ == roles_->end()) return false; - - frame[self_.role_symbol_] = roles_it_->rolename(); - roles_it_++; - - return true; - } - - case AuthQuery::Action::SET_ROLE: { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto user = auth.GetUser(self_.user_); - if (!user) { - throw QueryRuntimeException("User '{}' doesn't exist.", self_.user_); - } - auto role = auth.GetRole(self_.role_); - if (!role) { - throw QueryRuntimeException("Role '{}' doesn't exist.", self_.role_); - } - if (user->role()) { - throw QueryRuntimeException( - "User '{}' is already a member of role '{}'.", self_.user_, - user->role()->rolename()); - } - user->SetRole(*role); - auth.SaveUser(*user); - return false; - } - - case AuthQuery::Action::CLEAR_ROLE: { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto user = auth.GetUser(self_.user_); - if (!user) { - throw QueryRuntimeException("User '{}' doesn't exist.", self_.user_); - } - user->ClearRole(); - auth.SaveUser(*user); - return false; - } - - case AuthQuery::Action::GRANT_PRIVILEGE: - case AuthQuery::Action::DENY_PRIVILEGE: - case AuthQuery::Action::REVOKE_PRIVILEGE: { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto user = auth.GetUser(self_.user_or_role_); - auto role = auth.GetRole(self_.user_or_role_); - if (!user && !role) { - throw QueryRuntimeException("User or role '{}' doesn't exist.", - self_.user_or_role_); - } - auto permissions = GetAuthPermissions(); - if (user) { - for (const auto &permission : permissions) { - // TODO (mferencevic): should we first check that the privilege - // is granted/denied/revoked before unconditionally - // granting/denying/revoking it? - if (self_.action_ == AuthQuery::Action::GRANT_PRIVILEGE) { - user->permissions().Grant(permission); - } else if (self_.action_ == AuthQuery::Action::DENY_PRIVILEGE) { - user->permissions().Deny(permission); - } else { - user->permissions().Revoke(permission); - } - } - auth.SaveUser(*user); - } else { - for (const auto &permission : permissions) { - // TODO (mferencevic): should we first check that the privilege - // is granted/denied/revoked before unconditionally - // granting/denying/revoking it? - if (self_.action_ == AuthQuery::Action::GRANT_PRIVILEGE) { - role->permissions().Grant(permission); - } else if (self_.action_ == AuthQuery::Action::DENY_PRIVILEGE) { - role->permissions().Deny(permission); - } else { - role->permissions().Revoke(permission); - } - } - auth.SaveRole(*role); - } - return false; - } - - case AuthQuery::Action::SHOW_PRIVILEGES: { - if (!grants_) { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto user = auth.GetUser(self_.user_or_role_); - auto role = auth.GetRole(self_.user_or_role_); - if (!user && !role) { - throw QueryRuntimeException("User or role '{}' doesn't exist.", - self_.user_or_role_); - } - if (user) { - grants_.emplace(GetGrantsForAuthUser(*user)); - } else { - grants_.emplace(GetGrantsForAuthRole(*role)); - } - grants_it_ = grants_->begin(); - } - - if (grants_it_ == grants_->end()) return false; - - frame[self_.privilege_symbol_] = std::get<0>(*grants_it_); - frame[self_.effective_symbol_] = std::get<1>(*grants_it_); - frame[self_.details_symbol_] = std::get<2>(*grants_it_); - grants_it_++; - - return true; - } - - case AuthQuery::Action::SHOW_ROLE_FOR_USER: { - if (returned_role_for_user_) return false; - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto user = auth.GetUser(self_.user_); - if (!user) { - throw QueryRuntimeException("User '{}' doesn't exist.", self_.user_); - } - if (user->role()) { - frame[self_.role_symbol_] = user->role()->rolename(); - } else { - frame[self_.role_symbol_] = TypedValue::Null; - } - returned_role_for_user_ = true; - return true; - } - - case AuthQuery::Action::SHOW_USERS_FOR_ROLE: { - if (!users_) { - std::lock_guard<std::mutex> lock(auth.WithLock()); - auto role = auth.GetRole(self_.role_); - if (!role) { - throw QueryRuntimeException("Role '{}' doesn't exist.", - self_.role_); - } - users_.emplace(auth.AllUsersForRole(self_.role_)); - users_it_ = users_->begin(); - } - - if (users_it_ == users_->end()) return false; - - frame[self_.user_symbol_] = users_it_->username(); - users_it_++; - - return true; - } - } - } - - void Shutdown() override {} - - void Reset() override { - LOG(FATAL) << "AuthHandler cursor should never be reset"; - } - - private: - const AuthHandler &self_; - std::experimental::optional<std::vector<auth::User>> users_; - std::vector<auth::User>::iterator users_it_; - std::experimental::optional<std::vector<auth::Role>> roles_; - std::vector<auth::Role>::iterator roles_it_; - std::experimental::optional< - std::vector<std::tuple<std::string, std::string, std::string>>> - grants_; - std::vector<std::tuple<std::string, std::string, std::string>>::iterator - grants_it_; - bool returned_role_for_user_{false}; -}; - -std::unique_ptr<Cursor> AuthHandler::MakeCursor( - database::GraphDbAccessor &db) const { - return std::make_unique<AuthHandlerCursor>(*this); -} - -WITHOUT_SINGLE_INPUT(AuthHandler) - -CreateStream::CreateStream(std::string stream_name, Expression *stream_uri, - Expression *stream_topic, Expression *transform_uri, - Expression *batch_interval_in_ms, - Expression *batch_size) - : stream_name_(std::move(stream_name)), - stream_uri_(stream_uri), - stream_topic_(stream_topic), - transform_uri_(transform_uri), - batch_interval_in_ms_(batch_interval_in_ms), - batch_size_(batch_size) {} - -WITHOUT_SINGLE_INPUT(CreateStream) - -class CreateStreamCursor : public Cursor { - using StreamInfo = integrations::kafka::StreamInfo; - - public: - CreateStreamCursor(const CreateStream &self, database::GraphDbAccessor &) - : self_(self) {} - - bool Pull(Frame &frame, Context &ctx) override { - if (ctx.in_explicit_transaction_) { - throw StreamClauseInMulticommandTxException(); - } - ExpressionEvaluator evaluator(&frame, ctx.symbol_table_, - ctx.evaluation_context_, &ctx.db_accessor_, - GraphView::OLD); - - TypedValue stream_uri = self_.stream_uri_->Accept(evaluator); - TypedValue stream_topic = self_.stream_topic_->Accept(evaluator); - TypedValue transform_uri = self_.transform_uri_->Accept(evaluator); - - std::experimental::optional<int64_t> batch_interval_in_ms, batch_size; - - if (self_.batch_interval_in_ms_) { - batch_interval_in_ms = - self_.batch_interval_in_ms_->Accept(evaluator).Value<int64_t>(); - } - if (self_.batch_size_) { - batch_size = self_.batch_size_->Accept(evaluator).Value<int64_t>(); - } - - try { - StreamInfo info; - info.stream_name = self_.stream_name_; - info.stream_uri = stream_uri.Value<std::string>(); - info.stream_topic = stream_topic.Value<std::string>(); - info.transform_uri = transform_uri.Value<std::string>(); - info.batch_interval_in_ms = batch_interval_in_ms; - info.batch_size = batch_size; - - ctx.kafka_streams_->Create(info); - } catch (const integrations::kafka::KafkaStreamException &e) { - throw QueryRuntimeException(e.what()); - } - - return false; - } - - void Shutdown() override {} - - void Reset() override { throw utils::NotYetImplemented("Create Stream"); } - - private: - const CreateStream &self_; -}; - -std::unique_ptr<Cursor> CreateStream::MakeCursor( - database::GraphDbAccessor &db) const { - return std::make_unique<CreateStreamCursor>(*this, db); -} - -DropStream::DropStream(std::string stream_name) - : stream_name_(std::move(stream_name)) {} - -WITHOUT_SINGLE_INPUT(DropStream) - -class DropStreamCursor : public Cursor { - public: - DropStreamCursor(const DropStream &self, database::GraphDbAccessor &) - : self_(self) {} - - bool Pull(Frame &frame, Context &ctx) override { - if (ctx.in_explicit_transaction_) { - throw StreamClauseInMulticommandTxException(); - } - - try { - ctx.kafka_streams_->Drop(self_.stream_name_); - } catch (const integrations::kafka::KafkaStreamException &e) { - throw QueryRuntimeException(e.what()); - } - return false; - } - - void Shutdown() override {} - - void Reset() override { throw utils::NotYetImplemented("Drop Stream"); } - - private: - const DropStream &self_; -}; - -std::unique_ptr<Cursor> DropStream::MakeCursor( - database::GraphDbAccessor &db) const { - return std::make_unique<DropStreamCursor>(*this, db); -} - -ShowStreams::ShowStreams(Symbol name_symbol, Symbol uri_symbol, - Symbol topic_symbol, Symbol transform_symbol, - Symbol status_symbol) - : name_symbol_(name_symbol), - uri_symbol_(uri_symbol), - topic_symbol_(topic_symbol), - transform_symbol_(transform_symbol), - status_symbol_(status_symbol) {} - -WITHOUT_SINGLE_INPUT(ShowStreams) - -std::vector<Symbol> ShowStreams::OutputSymbols(const SymbolTable &) const { - return {name_symbol_, uri_symbol_, topic_symbol_, transform_symbol_, - status_symbol_}; -} - -class ShowStreamsCursor : public Cursor { - public: - ShowStreamsCursor(const ShowStreams &self, database::GraphDbAccessor &) - : self_(self) {} - - bool Pull(Frame &frame, Context &ctx) override { - if (ctx.in_explicit_transaction_) { - throw StreamClauseInMulticommandTxException(); - } - - if (!is_initialized_) { - streams_ = ctx.kafka_streams_->Show(); - streams_it_ = streams_.begin(); - is_initialized_ = true; - } - - if (streams_it_ == streams_.end()) return false; - - frame[self_.name_symbol_] = streams_it_->stream_name; - frame[self_.uri_symbol_] = streams_it_->stream_uri; - frame[self_.topic_symbol_] = streams_it_->stream_topic; - frame[self_.transform_symbol_] = streams_it_->transform_uri; - frame[self_.status_symbol_] = streams_it_->stream_status; - - streams_it_++; - - return true; - } - - void Shutdown() override {} - - void Reset() override { throw utils::NotYetImplemented("Show Streams"); } - - private: - const ShowStreams &self_; - - bool is_initialized_ = false; - using StreamStatus = integrations::kafka::StreamStatus; - std::vector<StreamStatus> streams_; - std::vector<StreamStatus>::iterator streams_it_ = streams_.begin(); -}; - -std::unique_ptr<Cursor> ShowStreams::MakeCursor( - database::GraphDbAccessor &db) const { - return std::make_unique<ShowStreamsCursor>(*this, db); -} - -StartStopStream::StartStopStream(std::string stream_name, bool is_start, - Expression *limit_batches) - : stream_name_(stream_name), - is_start_(is_start), - limit_batches_(limit_batches) {} - -WITHOUT_SINGLE_INPUT(StartStopStream) - -class StartStopStreamCursor : public Cursor { - public: - StartStopStreamCursor(const StartStopStream &self, - database::GraphDbAccessor &) - : self_(self) {} - - bool Pull(Frame &frame, Context &ctx) override { - if (ctx.in_explicit_transaction_) { - throw StreamClauseInMulticommandTxException(); - } - - ExpressionEvaluator evaluator(&frame, ctx.symbol_table_, - ctx.evaluation_context_, &ctx.db_accessor_, - GraphView::OLD); - std::experimental::optional<int64_t> limit_batches; - - if (self_.limit_batches_) { - limit_batches = self_.limit_batches_->Accept(evaluator).Value<int64_t>(); - } - - try { - if (self_.is_start_) { - ctx.kafka_streams_->Start(self_.stream_name_, limit_batches); - } else { - ctx.kafka_streams_->Stop(self_.stream_name_); - } - } catch (const integrations::kafka::KafkaStreamException &e) { - throw QueryRuntimeException(e.what()); - } - - return false; - } - - void Shutdown() override {} - - void Reset() override { throw utils::NotYetImplemented("Start/Stop Stream"); } - - private: - const StartStopStream &self_; -}; - -std::unique_ptr<Cursor> StartStopStream::MakeCursor( - database::GraphDbAccessor &db) const { - return std::make_unique<StartStopStreamCursor>(*this, db); -} - -StartStopAllStreams::StartStopAllStreams(bool is_start) : is_start_(is_start) {} - -WITHOUT_SINGLE_INPUT(StartStopAllStreams) - -class StartStopAllStreamsCursor : public Cursor { - public: - StartStopAllStreamsCursor(const StartStopAllStreams &self, - database::GraphDbAccessor &) - : self_(self) {} - - bool Pull(Frame &frame, Context &ctx) override { - if (ctx.in_explicit_transaction_) { - throw StreamClauseInMulticommandTxException(); - } - - try { - if (self_.is_start_) { - ctx.kafka_streams_->StartAll(); - } else { - ctx.kafka_streams_->StopAll(); - } - } catch (const integrations::kafka::KafkaStreamException &e) { - throw QueryRuntimeException(e.what()); - } - - return false; - } - - void Shutdown() override {} - - void Reset() override { - throw utils::NotYetImplemented("Start/Stop All Streams"); - } - - private: - const StartStopAllStreams &self_; -}; - -std::unique_ptr<Cursor> StartStopAllStreams::MakeCursor( - database::GraphDbAccessor &db) const { - return std::make_unique<StartStopAllStreamsCursor>(*this, db); -} - -TestStream::TestStream(std::string stream_name, Expression *limit_batches, - Symbol query_symbol, Symbol params_symbol) - : stream_name_(stream_name), - limit_batches_(limit_batches), - query_symbol_(query_symbol), - params_symbol_(params_symbol) {} - -WITHOUT_SINGLE_INPUT(TestStream) - -std::vector<Symbol> TestStream::OutputSymbols(const SymbolTable &) const { - return {query_symbol_, params_symbol_}; -} - -class TestStreamCursor : public Cursor { - public: - TestStreamCursor(const TestStream &self, database::GraphDbAccessor &) - : self_(self) {} - - bool Pull(Frame &frame, Context &ctx) override { - if (ctx.in_explicit_transaction_) { - throw StreamClauseInMulticommandTxException(); - } - - if (!is_initialized_) { - ExpressionEvaluator evaluator(&frame, ctx.symbol_table_, - ctx.evaluation_context_, &ctx.db_accessor_, - GraphView::OLD); - std::experimental::optional<int64_t> limit_batches; - - if (self_.limit_batches_) { - limit_batches = - self_.limit_batches_->Accept(evaluator).Value<int64_t>(); - } - - try { - auto results = - ctx.kafka_streams_->Test(self_.stream_name_, limit_batches); - for (const auto &result : results) { - std::map<std::string, query::TypedValue> params_tv; - for (const auto &kv : result.second) { - params_tv.emplace(kv.first, glue::ToTypedValue(kv.second)); - } - results_.emplace_back(result.first, params_tv); - } - } catch (const integrations::kafka::KafkaStreamException &e) { - throw QueryRuntimeException(e.what()); - } - results_it_ = results_.begin(); - is_initialized_ = true; - } - - if (results_it_ == results_.end()) return false; - - frame[self_.query_symbol_] = results_it_->first; - frame[self_.params_symbol_] = results_it_->second; - results_it_++; - - return true; - } - - void Shutdown() override {} - - void Reset() override { throw utils::NotYetImplemented("Test Stream"); } - - private: - const TestStream &self_; - - bool is_initialized_ = false; - std::vector<std::pair<std::string, TypedValue>> results_; - std::vector<std::pair<std::string, TypedValue>>::iterator results_it_ = - results_.begin(); -}; - -std::unique_ptr<Cursor> TestStream::MakeCursor( - database::GraphDbAccessor &db) const { - return std::make_unique<TestStreamCursor>(*this, db); -} - Explain::Explain( const std::shared_ptr<LogicalOperator> &input, const Symbol &output_symbol, const std::function<void(const database::GraphDbAccessor &, diff --git a/src/query/plan/operator.lcp b/src/query/plan/operator.lcp index 7bd488c4b..22009747f 100644 --- a/src/query/plan/operator.lcp +++ b/src/query/plan/operator.lcp @@ -97,13 +97,6 @@ class Distinct; class CreateIndex; class Union; class Cartesian; -class AuthHandler; -class CreateStream; -class DropStream; -class ShowStreams; -class StartStopStream; -class StartStopAllStreams; -class TestStream; class Explain; using LogicalOperatorCompositeVisitor = ::utils::CompositeVisitor< @@ -116,9 +109,7 @@ using LogicalOperatorCompositeVisitor = ::utils::CompositeVisitor< OrderBy, Merge, Optional, Unwind, Distinct, Union, Cartesian, Explain>; using LogicalOperatorLeafVisitor = - ::utils::LeafVisitor<Once, CreateIndex, AuthHandler, CreateStream, - DropStream, ShowStreams, StartStopStream, - StartStopAllStreams, TestStream>; + ::utils::LeafVisitor<Once, CreateIndex>; /** * @brief Base class for hierarhical visitors of @c LogicalOperator class @@ -2003,137 +1994,6 @@ and returns true, once.") cpp<#) (:serialize :capnp)) -(lcp:define-class auth-handler (logical-operator) - ((action "AuthQuery::Action" :scope :public - :capnp-init nil - :capnp-type "Ast.AuthQuery.Action" - :capnp-save (lcp:capnp-save-enum "::query::capnp::AuthQuery::Action" - "AuthQuery::Action" - '(create-role drop-role show-roles - create-user set-password - drop-user show-users set-role - clear-role grant-privilege - deny-privilege revoke-privilege - show-privileges show-role-for-user - show-users-for-role)) - :capnp-load (lcp:capnp-load-enum "::query::capnp::AuthQuery::Action" - "AuthQuery::Action" - '(create-role drop-role show-roles - create-user set-password - drop-user show-users set-role - clear-role grant-privilege - deny-privilege revoke-privilege - show-privileges show-role-for-user - show-users-for-role))) - (user "std::string" :scope :public) - (role "std::string" :scope :public) - (user-or-role "std::string" :scope :public) - (password "Expression *" :scope :public - :capnp-type "Ast.Tree" :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (privileges "std::vector<AuthQuery::Privilege>" :scope :public - :capnp-type "List(Ast.AuthQuery.Privilege)" - :capnp-save - (lambda (builder member capnp-name) - (declare (ignore capnp-name)) - #>cpp - for (size_t i = 0; i < ${member}.size(); ++i) { - switch (${member}[i]) { - case AuthQuery::Privilege::CREATE: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::CREATE); - break; - case AuthQuery::Privilege::DELETE: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::DELETE); - break; - case AuthQuery::Privilege::MATCH: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::MATCH); - break; - case AuthQuery::Privilege::MERGE: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::MERGE); - break; - case AuthQuery::Privilege::SET: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::SET); - break; - case AuthQuery::Privilege::REMOVE: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::REMOVE); - break; - case AuthQuery::Privilege::INDEX: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::INDEX); - break; - case AuthQuery::Privilege::AUTH: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::AUTH); - break; - case AuthQuery::Privilege::STREAM: - ${builder}.set(i, query::capnp::AuthQuery::Privilege::STREAM); - break; - } - } - cpp<#) - :capnp-load - (lambda (reader member-name capnp-name) - (declare (ignore capnp-name)) - #>cpp - for (auto privilege : ${reader}) { - switch (privilege) { - case query::capnp::AuthQuery::Privilege::CREATE: - ${member-name}.push_back(AuthQuery::Privilege::CREATE); - break; - case query::capnp::AuthQuery::Privilege::DELETE: - ${member-name}.push_back(AuthQuery::Privilege::DELETE); - break; - case query::capnp::AuthQuery::Privilege::MATCH: - ${member-name}.push_back(AuthQuery::Privilege::MATCH); - break; - case query::capnp::AuthQuery::Privilege::MERGE: - ${member-name}.push_back(AuthQuery::Privilege::MERGE); - break; - case query::capnp::AuthQuery::Privilege::SET: - ${member-name}.push_back(AuthQuery::Privilege::SET); - break; - case query::capnp::AuthQuery::Privilege::REMOVE: - ${member-name}.push_back(AuthQuery::Privilege::REMOVE); - break; - case query::capnp::AuthQuery::Privilege::INDEX: - ${member-name}.push_back(AuthQuery::Privilege::INDEX); - break; - case query::capnp::AuthQuery::Privilege::AUTH: - ${member-name}.push_back(AuthQuery::Privilege::AUTH); - break; - case query::capnp::AuthQuery::Privilege::STREAM: - ${member-name}.push_back(AuthQuery::Privilege::STREAM); - break; - } - } - cpp<#)) - (user-symbol "Symbol" :scope :public) - (role-symbol "Symbol" :scope :public) - (privilege-symbol "Symbol" :scope :public) - (effective-symbol "Symbol" :scope :public) - (details-symbol "Symbol" :scope :public)) - (:public - #>cpp - AuthHandler() {} - AuthHandler(AuthQuery::Action action, std::string user, std::string role, - std::string user_or_role, Expression * password, - std::vector<AuthQuery::Privilege> privileges, - Symbol user_symbol, Symbol role_symbol, - Symbol privilege_symbol, Symbol effective_symbol, - Symbol details_symbol); - - bool Accept(HierarchicalLogicalOperatorVisitor &visitor) override; - std::unique_ptr<Cursor> MakeCursor(database::GraphDbAccessor & db) - const override; - std::vector<Symbol> OutputSymbols(const SymbolTable &) const override; - virtual std::vector<Symbol> ModifiedSymbols(const SymbolTable &) - const override { return {}; } - - bool HasSingleInput() const override; - std::shared_ptr<LogicalOperator> input() const override; - void set_input(std::shared_ptr<LogicalOperator>) override; - cpp<#) - (:serialize :capnp)) - (lcp:define-class unwind (logical-operator) ((input "std::shared_ptr<LogicalOperator>" :scope :public :capnp-save #'save-operator-pointer @@ -2374,196 +2234,6 @@ vectors of symbols used by each of the inputs.") cpp<#) (:serialize :capnp)) -;;; KAFKA STREAM OPERATORS -(lcp:define-class create-stream (logical-operator) - ((stream-name "std::string" :scope :public) - (stream-uri "Expression *" - :scope :public - :capnp-type "Ast.Tree" - :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (stream-topic "Expression *" - :scope :public - :capnp-type "Ast.Tree" - :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (transform-uri "Expression *" - :scope :public - :capnp-type "Ast.Tree" - :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (batch-interval-in-ms "Expression *" - :scope :public - :capnp-type "Ast.Tree" - :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (batch-size "Expression *" - :scope :public - :capnp-type "Ast.Tree" - :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *"))) - (:documentation - "Creates a new stream with given parameters that imports data.") - (:public - #>cpp - CreateStream() {} - CreateStream(std::string stream_name, Expression *stream_uri, - Expression *stream_topic, Expression *transform_uri, - Expression *batch_interval_in_ms, Expression *batch_size); - DEFVISITABLE(HierarchicalLogicalOperatorVisitor); - std::unique_ptr<Cursor> MakeCursor( - database::GraphDbAccessor &db) const override; - std::vector<Symbol> ModifiedSymbols(const SymbolTable &) const override { - return {}; - } - - bool HasSingleInput() const override; - std::shared_ptr<LogicalOperator> input() const override; - void set_input(std::shared_ptr<LogicalOperator>) override; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class drop-stream (logical-operator) - ((stream-name "std::string" :scope :public)) - (:documentation - "Stops and deletes a stream if it exists.") - (:public - #>cpp - DropStream() {} - explicit DropStream(std::string stream_name); - DEFVISITABLE(HierarchicalLogicalOperatorVisitor); - std::unique_ptr<Cursor> MakeCursor( - database::GraphDbAccessor &db) const override; - std::vector<Symbol> ModifiedSymbols(const SymbolTable &) const override { - return {}; - } - - bool HasSingleInput() const override; - std::shared_ptr<LogicalOperator> input() const override; - void set_input(std::shared_ptr<LogicalOperator>) override; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class show-streams (logical-operator) - ((name-symbol "Symbol" :scope :public) - (uri-symbol "Symbol" :scope :public) - (topic-symbol "Symbol" :scope :public) - (transform-symbol "Symbol" :scope :public) - (status-symbol "Symbol" :scope :public)) - (:documentation - "Shows all streams, started and stopped, that were configured.") - (:public - #>cpp - ShowStreams() {} - ShowStreams(Symbol name_symbol, Symbol endpoint_symbol, Symbol topic_symbol, - Symbol transform_symbol, Symbol status_symbol); - DEFVISITABLE(HierarchicalLogicalOperatorVisitor); - std::unique_ptr<Cursor> MakeCursor( - database::GraphDbAccessor &db) const override; - std::vector<Symbol> OutputSymbols(const SymbolTable &) const override; - std::vector<Symbol> ModifiedSymbols(const SymbolTable &) const override { - return {}; - } - - bool HasSingleInput() const override; - std::shared_ptr<LogicalOperator> input() const override; - void set_input(std::shared_ptr<LogicalOperator>) override; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class start-stop-stream (logical-operator) - ((stream-name "std::string" :scope :public) - (is-start :bool :scope :public) - (limit-batches "Expression *" - :scope :public - :capnp-type "Ast.Tree" - :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *"))) - (:documentation - "Starts or stops a stream. -When starting a stream import, it can be limited by number of batches -If a stream is already running, it wont limit the number of batches that this -stream is importing.") - (:public - #>cpp - StartStopStream() {} - StartStopStream(std::string stream_name, bool is_start, - Expression *limit_batches); - DEFVISITABLE(HierarchicalLogicalOperatorVisitor); - std::unique_ptr<Cursor> MakeCursor( - database::GraphDbAccessor &db) const override; - std::vector<Symbol> ModifiedSymbols(const SymbolTable &) const override { - return {}; - } - - bool HasSingleInput() const override; - std::shared_ptr<LogicalOperator> input() const override; - void set_input(std::shared_ptr<LogicalOperator>) override; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class start-stop-all-streams (logical-operator) - ((stream-name "std::string" :scope :public) - (is-start :bool :scope :public)) - (:documentation - "Starts or stops all stream.") - (:public - #>cpp - StartStopAllStreams() {} - explicit StartStopAllStreams(bool is_start); - DEFVISITABLE(HierarchicalLogicalOperatorVisitor); - std::unique_ptr<Cursor> MakeCursor( - database::GraphDbAccessor &db) const override; - std::vector<Symbol> ModifiedSymbols(const SymbolTable &) const override { - return {}; - } - - bool HasSingleInput() const override; - std::shared_ptr<LogicalOperator> input() const override; - void set_input(std::shared_ptr<LogicalOperator>) override; - cpp<#) - (:serialize :capnp)) - -(lcp:define-class test-stream (logical-operator) - ((stream-name "std::string" :scope :public) - (limit-batches "Expression *" - :scope :public - :capnp-type "Ast.Tree" - :capnp-init nil - :capnp-save #'save-ast-pointer - :capnp-load (load-ast-pointer "Expression *")) - (query-symbol "Symbol" :scope :public) - (params-symbol "Symbol" :scope :public)) - (:documentation - "Test a stream. This will start consuming messages but wont insert anything -in the db.") - (:public - #>cpp - TestStream() {} - TestStream(std::string stream_name, Expression *limit_batches, - Symbol query_symbol, Symbol params_symbol); - DEFVISITABLE(HierarchicalLogicalOperatorVisitor); - std::unique_ptr<Cursor> MakeCursor( - database::GraphDbAccessor &db) const override; - std::vector<Symbol> OutputSymbols(const SymbolTable &) const override; - std::vector<Symbol> ModifiedSymbols(const SymbolTable &) const override { - return {}; - } - - bool HasSingleInput() const override; - std::shared_ptr<LogicalOperator> input() const override; - void set_input(std::shared_ptr<LogicalOperator>) override; - cpp<#) - (:serialize :capnp)) - -;;; END KAFKA STREAM OPERATORS - (lcp:define-class explain (logical-operator) ((input "std::shared_ptr<LogicalOperator>" :scope :public :capnp-save #'save-operator-pointer diff --git a/src/query/plan/preprocess.hpp b/src/query/plan/preprocess.hpp index 0433e43fd..ad069db62 100644 --- a/src/query/plan/preprocess.hpp +++ b/src/query/plan/preprocess.hpp @@ -54,13 +54,6 @@ class UsedSymbolsCollector : public HierarchicalTreeVisitor { bool Visit(ParameterLookup &) override { return true; } bool Visit(query::CreateIndex &) override { return true; } bool Visit(query::CreateUniqueIndex &) override { return true; } - bool Visit(query::AuthQuery &) override { return true; } - bool Visit(query::CreateStream &) override { return true; } - bool Visit(query::DropStream &) override { return true; } - bool Visit(query::ShowStreams &) override { return true; } - bool Visit(query::StartStopStream &) override { return true; } - bool Visit(query::StartStopAllStreams &) override { return true; } - bool Visit(query::TestStream &) override { return true; } std::unordered_set<Symbol> symbols_; const SymbolTable &symbol_table_; diff --git a/src/query/plan/pretty_print.cpp b/src/query/plan/pretty_print.cpp index eee3d7d30..8214fe1a3 100644 --- a/src/query/plan/pretty_print.cpp +++ b/src/query/plan/pretty_print.cpp @@ -148,41 +148,6 @@ bool PlanPrinter::Visit(query::plan::CreateIndex &op) { return true; } -bool PlanPrinter::Visit(query::plan::AuthHandler &op) { - WithPrintLn([](auto &out) { out << "* AuthHandler"; }); - return true; -} - -bool PlanPrinter::Visit(query::plan::CreateStream &op) { - WithPrintLn([](auto &out) { out << "* CreateStream"; }); - return true; -} - -bool PlanPrinter::Visit(query::plan::DropStream &op) { - WithPrintLn([](auto &out) { out << "* DropStream"; }); - return true; -} - -bool PlanPrinter::Visit(query::plan::ShowStreams &op) { - WithPrintLn([](auto &out) { out << "* ShowStreams"; }); - return true; -} - -bool PlanPrinter::Visit(query::plan::StartStopStream &op) { - WithPrintLn([](auto &out) { out << "* StartStopStream"; }); - return true; -} - -bool PlanPrinter::Visit(query::plan::StartStopAllStreams &op) { - WithPrintLn([](auto &out) { out << "* StartStopAllStreams"; }); - return true; -} - -bool PlanPrinter::Visit(query::plan::TestStream &op) { - WithPrintLn([](auto &out) { out << "* TestStream"; }); - return true; -} - bool PlanPrinter::PreVisit(query::plan::Explain &explain) { WithPrintLn([&explain](auto &out) { out << "* Explain {" << explain.output_symbol_.name() << "}"; diff --git a/src/query/plan/pretty_print.hpp b/src/query/plan/pretty_print.hpp index 104cd8216..d8ac32aab 100644 --- a/src/query/plan/pretty_print.hpp +++ b/src/query/plan/pretty_print.hpp @@ -79,15 +79,6 @@ class PlanPrinter : public virtual HierarchicalLogicalOperatorVisitor { bool Visit(Once &) override; bool Visit(CreateIndex &) override; - bool Visit(AuthHandler &) override; - - bool Visit(CreateStream &) override; - bool Visit(DropStream &) override; - bool Visit(ShowStreams &) override; - bool Visit(StartStopStream &) override; - bool Visit(StartStopAllStreams &) override; - bool Visit(TestStream &) override; - /// Call fun with output stream. The stream is prefixed with amount of spaces /// corresponding to the current depth_. template <class TFun> diff --git a/src/query/plan/rule_based_planner.cpp b/src/query/plan/rule_based_planner.cpp index d69092340..244b6ee9b 100644 --- a/src/query/plan/rule_based_planner.cpp +++ b/src/query/plan/rule_based_planner.cpp @@ -407,41 +407,6 @@ class ReturnBodyContext : public HierarchicalTreeVisitor { return true; } - bool Visit(query::AuthQuery &) override { - has_aggregation_.emplace_back(false); - return true; - } - - bool Visit(query::CreateStream &) override { - has_aggregation_.emplace_back(false); - return true; - } - - bool Visit(query::DropStream &) override { - has_aggregation_.emplace_back(false); - return true; - } - - bool Visit(query::ShowStreams &) override { - has_aggregation_.emplace_back(false); - return true; - } - - bool Visit(query::StartStopStream &) override { - has_aggregation_.emplace_back(false); - return true; - } - - bool Visit(query::StartStopAllStreams &) override { - has_aggregation_.emplace_back(false); - return true; - } - - bool Visit(query::TestStream &) override { - has_aggregation_.emplace_back(false); - return true; - } - // Creates NamedExpression with an Identifier for each user declared symbol. // This should be used when body.all_identifiers is true, to generate // expressions for Produce operator. diff --git a/src/query/plan/rule_based_planner.hpp b/src/query/plan/rule_based_planner.hpp index 0b1529a1e..a07854228 100644 --- a/src/query/plan/rule_based_planner.hpp +++ b/src/query/plan/rule_based_planner.hpp @@ -189,59 +189,6 @@ class RuleBasedPlanner { DCHECK(!input_op) << "Unexpected operator before CreateIndex"; input_op = std::make_unique<plan::CreateIndex>( create_index->label_, create_index->properties_, true); - } else if (auto *auth_query = - dynamic_cast<query::AuthQuery *>(clause)) { - DCHECK(!input_op) << "Unexpected operator before AuthQuery"; - auto &symbol_table = context.symbol_table; - input_op = std::make_unique<plan::AuthHandler>( - auth_query->action_, auth_query->user_, auth_query->role_, - auth_query->user_or_role_, auth_query->password_, - auth_query->privileges_, symbol_table.CreateSymbol("user", false), - symbol_table.CreateSymbol("role", false), - symbol_table.CreateSymbol("privilege", false), - symbol_table.CreateSymbol("effective", false), - symbol_table.CreateSymbol("details", false)); - } else if (auto *create_stream = - dynamic_cast<query::CreateStream *>(clause)) { - DCHECK(!input_op) << "Unexpected operator before CreateStream"; - input_op = std::make_unique<plan::CreateStream>( - create_stream->stream_name_, create_stream->stream_uri_, - create_stream->stream_topic_, create_stream->transform_uri_, - create_stream->batch_interval_in_ms_, create_stream->batch_size_); - } else if (auto *drop_stream = - dynamic_cast<query::DropStream *>(clause)) { - DCHECK(!input_op) << "Unexpected operator before DropStream"; - input_op = - std::make_unique<plan::DropStream>(drop_stream->stream_name_); - } else if (dynamic_cast<query::ShowStreams *>(clause)) { - DCHECK(!input_op) << "Unexpected operator before ShowStreams"; - // Create symbols for ShowStreams results - auto &symbol_table = context.symbol_table; - input_op = std::make_unique<plan::ShowStreams>( - symbol_table.CreateSymbol("name", false), - symbol_table.CreateSymbol("uri", false), - symbol_table.CreateSymbol("topic", false), - symbol_table.CreateSymbol("transform", false), - symbol_table.CreateSymbol("status", false)); - } else if (auto *start_stop_stream = - dynamic_cast<query::StartStopStream *>(clause)) { - DCHECK(!input_op) << "Unexpected operator before StartStopStream"; - input_op = std::make_unique<plan::StartStopStream>( - start_stop_stream->stream_name_, start_stop_stream->is_start_, - start_stop_stream->limit_batches_); - } else if (auto *start_stop_all_streams = - dynamic_cast<query::StartStopAllStreams *>(clause)) { - DCHECK(!input_op) << "Unexpected operator before StartStopAllStreams"; - input_op = std::make_unique<plan::StartStopAllStreams>( - start_stop_all_streams->is_start_); - } else if (auto *test_stream = - dynamic_cast<query::TestStream *>(clause)) { - DCHECK(!input_op) << "Unexpected operator before TestStream"; - auto &symbol_table = context.symbol_table; - input_op = std::make_unique<plan::TestStream>( - test_stream->stream_name_, test_stream->limit_batches_, - symbol_table.CreateSymbol("query", false), - symbol_table.CreateSymbol("params", false)); } else { throw utils::NotYetImplemented("clause conversion to operator(s)"); } diff --git a/src/query/transaction_engine.hpp b/src/query/transaction_engine.hpp index 91fae2987..0dd635c03 100644 --- a/src/query/transaction_engine.hpp +++ b/src/query/transaction_engine.hpp @@ -16,9 +16,9 @@ class TransactionEngine final { ~TransactionEngine() { Abort(); } - std::pair<std::vector<std::string>, std::vector<query::AuthQuery::Privilege>> - Interpret(const std::string &query, - const std::map<std::string, PropertyValue> ¶ms) { + std::vector<std::string> Interpret( + const std::string &query, + const std::map<std::string, PropertyValue> ¶ms) { // Clear pending results. results_ = std::experimental::nullopt; @@ -64,7 +64,7 @@ class TransactionEngine final { try { results_.emplace((*interpreter_)(query, *db_accessor_, params, in_explicit_transaction_)); - return {results_->header(), results_->privileges()}; + return results_->header(); } catch (const utils::BasicException &) { AbortCommand(); throw; diff --git a/src/storage/single_node/storage_gc.hpp b/src/storage/single_node/storage_gc.hpp index e9fb7317e..eed69d931 100644 --- a/src/storage/single_node/storage_gc.hpp +++ b/src/storage/single_node/storage_gc.hpp @@ -5,7 +5,6 @@ #include "data_structures/concurrent/concurrent_map.hpp" #include "mvcc/single_node/version_list.hpp" -#include "stats/metrics.hpp" #include "storage/single_node/deferred_deleter.hpp" #include "storage/single_node/edge.hpp" #include "storage/single_node/garbage_collector.hpp" diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt index d7b334a20..3f93c1419 100644 --- a/src/utils/CMakeLists.txt +++ b/src/utils/CMakeLists.txt @@ -7,13 +7,5 @@ set(utils_src_files uuid.cpp watchdog.cpp) -define_add_capnp(utils_src_files utils_capnp_files) - -add_capnp(serialization.capnp) - -add_custom_target(generate_utils_capnp DEPENDS ${utils_capnp_files}) - add_library(mg-utils STATIC ${utils_src_files}) target_link_libraries(mg-utils stdc++fs Threads::Threads fmt glog gflags uuid) -target_link_libraries(mg-utils capnp kj) -add_dependencies(mg-utils generate_utils_capnp) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 82bfddb7e..aa8fe5214 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,6 +27,3 @@ add_subdirectory(property_based) # integration test binaries add_subdirectory(integration) - -# feature benchmark test binaries -add_subdirectory(feature_benchmark) diff --git a/tests/benchmark/CMakeLists.txt b/tests/benchmark/CMakeLists.txt index 15b7c222f..ef271f473 100644 --- a/tests/benchmark/CMakeLists.txt +++ b/tests/benchmark/CMakeLists.txt @@ -51,9 +51,6 @@ target_link_libraries(${test_prefix}edge_storage mg-single-node kvstore_dummy_li add_benchmark(mvcc.cpp) target_link_libraries(${test_prefix}mvcc mg-single-node kvstore_dummy_lib) -add_benchmark(serialization.cpp) -target_link_libraries(${test_prefix}serialization mg-distributed kvstore_dummy_lib) - add_benchmark(tx_engine.cpp) target_link_libraries(${test_prefix}tx_engine mg-single-node kvstore_dummy_lib) diff --git a/tests/distributed/card_fraud/apollo_runs.py b/tests/distributed/card_fraud/apollo_runs.py deleted file mode 100755 index 0301f4572..000000000 --- a/tests/distributed/card_fraud/apollo_runs.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python3 -import json -import os -import re -import subprocess - -from card_fraud import NUM_MACHINES, BINARIES - -# paths -SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) -WORKSPACE_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, "..", "..", "..", "..")) -OUTPUT_DIR_REL = os.path.join(os.path.relpath(SCRIPT_DIR, WORKSPACE_DIR), "output") - -# generate runs -runs = [] - -binaries = list(map(lambda x: os.path.join("..", "..", "build_release", x), BINARIES)) - -for i in range(NUM_MACHINES): - name = "master" if i == 0 else "worker" + str(i) - additional = ["master.py"] if i == 0 else [] - outfile_paths = ["\\./" + OUTPUT_DIR_REL + "/.+"] if i == 0 else [] - if i == 0: - cmd = "master.py" - args = "--machines-num {0} --test-suite card_fraud " \ - "--test card_fraud".format(NUM_MACHINES) - else: - cmd = "jail_service.py" - args = "" - runs.append({ - "name": "distributed__card_fraud__" + name, - "cd": "..", - "supervisor": cmd, - "arguments": args, - "infiles": binaries + [ - "common.py", - "jail_service.py", - "card_fraud/card_fraud.py", - "card_fraud/snapshots/worker_" + str(i), - ] + additional, - "outfile_paths": outfile_paths, - "parallel_run": "distributed__card_fraud", - "slave_group": "remote_4c32g", - "enable_network": True, - }) - -print(json.dumps(runs, indent=4, sort_keys=True)) diff --git a/tests/feature_benchmark/apollo_runs.yaml b/tests/feature_benchmark/apollo_runs.yaml deleted file mode 100644 index 4f3e92c8c..000000000 --- a/tests/feature_benchmark/apollo_runs.yaml +++ /dev/null @@ -1,10 +0,0 @@ -- name: feature_benchmark__kafka - cd: kafka - commands: ./runner.sh - infiles: - - runner.sh # runner script - - transform.py # transform script - - generate.py # dataset generator script - - ../../../build_release/tests/feature_benchmark/kafka/kafka.py # kafka script - - ../../../build_release/tests/feature_benchmark/kafka/benchmark # benchmark binary - enable_network: true diff --git a/tests/integration/CMakeLists.txt b/tests/integration/CMakeLists.txt index 15d3e2e86..1f7abaf31 100644 --- a/tests/integration/CMakeLists.txt +++ b/tests/integration/CMakeLists.txt @@ -6,12 +6,3 @@ add_subdirectory(ssl) # transactions test binaries add_subdirectory(transactions) - -# kafka test binaries -add_subdirectory(kafka) - -# auth test binaries -add_subdirectory(auth) - -# distributed test binaries -add_subdirectory(distributed) diff --git a/tests/integration/apollo_runs.yaml b/tests/integration/apollo_runs.yaml index cdb3daf4d..213519bba 100644 --- a/tests/integration/apollo_runs.yaml +++ b/tests/integration/apollo_runs.yaml @@ -22,31 +22,3 @@ - runner.sh # runner script - ../../../build_debug/memgraph # memgraph binary - ../../../build_debug/tests/integration/transactions/tester # tester binary - -- name: integration__kafka - cd: kafka - commands: ./runner.sh - infiles: - - runner.sh # runner script - - transform.py # transform script - - ../../../build_debug/memgraph # memgraph binary - - ../../../build_debug/kafka.py # kafka script - - ../../../build_debug/tests/integration/kafka/tester # tester binary - enable_network: true - -- name: integration__auth - cd: auth - commands: TIMEOUT=820 ./runner.py - infiles: - - runner.py # runner script - - ../../../build_debug/memgraph # memgraph binary - - ../../../build_debug/tests/integration/auth/checker # checker binary - - ../../../build_debug/tests/integration/auth/tester # tester binary - -- name: integration__distributed - cd: distributed - commands: TIMEOUT=480 ./runner.py - infiles: - - runner.py # runner script - - ../../../build_debug/memgraph_distributed # memgraph distributed binary - - ../../../build_debug/tests/integration/distributed/tester # tester binary diff --git a/tests/macro_benchmark/CMakeLists.txt b/tests/macro_benchmark/CMakeLists.txt index 593d0f2ec..202f1f462 100644 --- a/tests/macro_benchmark/CMakeLists.txt +++ b/tests/macro_benchmark/CMakeLists.txt @@ -15,16 +15,16 @@ function(add_macro_benchmark test_cpp) endfunction(add_macro_benchmark) add_macro_benchmark(clients/pokec_client.cpp) -target_link_libraries(${test_prefix}pokec_client mg-communication mg-io mg-utils mg-stats json) +target_link_libraries(${test_prefix}pokec_client mg-communication mg-io mg-utils json) add_macro_benchmark(clients/graph_500_bfs.cpp) -target_link_libraries(${test_prefix}graph_500_bfs mg-communication mg-io mg-utils mg-stats json) +target_link_libraries(${test_prefix}graph_500_bfs mg-communication mg-io mg-utils json) add_macro_benchmark(clients/bfs_pokec_client.cpp) -target_link_libraries(${test_prefix}bfs_pokec_client mg-communication mg-io mg-utils mg-stats json) +target_link_libraries(${test_prefix}bfs_pokec_client mg-communication mg-io mg-utils json) add_macro_benchmark(clients/query_client.cpp) target_link_libraries(${test_prefix}query_client mg-communication mg-io mg-utils) add_macro_benchmark(clients/card_fraud_client.cpp) -target_link_libraries(${test_prefix}card_fraud_client mg-communication mg-io mg-utils mg-stats json) +target_link_libraries(${test_prefix}card_fraud_client mg-communication mg-io mg-utils json) diff --git a/tests/macro_benchmark/clients/card_fraud_client.cpp b/tests/macro_benchmark/clients/card_fraud_client.cpp index 1de65a906..6d69479dc 100644 --- a/tests/macro_benchmark/clients/card_fraud_client.cpp +++ b/tests/macro_benchmark/clients/card_fraud_client.cpp @@ -5,9 +5,6 @@ #include "gflags/gflags.h" -#include "communication/rpc/client.hpp" -#include "stats/stats.hpp" -#include "stats/stats_rpc_messages.hpp" #include "utils/thread/sync.hpp" #include "long_running_common.hpp" @@ -23,14 +20,6 @@ DEFINE_string(config, "", "test config"); enum class Role { WORKER, ANALYTIC, CLEANUP }; -stats::Gauge &num_vertices = stats::GetGauge("vertices"); -stats::Gauge &num_edges = stats::GetGauge("edges"); - -void UpdateStats() { - num_vertices.Set(num_pos + num_cards + num_transactions); - num_edges.Set(2 * num_transactions); -} - int64_t NumNodesWithLabel(Client &client, std::string label) { std::string query = fmt::format("MATCH (u :{}) RETURN count(u)", label); auto result = ExecuteNTimesTillSuccess(client, query, {}, MAX_RETRIES); @@ -176,7 +165,6 @@ class CardFraudClient : public TestClient { card_id, tx_id, pos_id); num_transactions++; - UpdateStats(); } int64_t UniformInt(int64_t a, int64_t b) { @@ -261,7 +249,6 @@ class CardFraudClient : public TestClient { num_transactions, num_transactions_db, deleted, num_transactions - num_transactions_db); num_transactions = num_transactions_db; - UpdateStats(); } std::this_thread::sleep_for( @@ -334,9 +321,6 @@ int main(int argc, char **argv) { communication::Init(); - stats::InitStatsLogging( - fmt::format("client.long_running.{}.{}", FLAGS_group, FLAGS_scenario)); - Endpoint endpoint(FLAGS_address, FLAGS_port); ClientContext context(FLAGS_use_ssl); Client client(&context); @@ -384,7 +368,5 @@ int main(int argc, char **argv) { RunMultithreadedTest(clients); - stats::StopStatsLogging(); - return 0; } diff --git a/tests/macro_benchmark/clients/graph_500_bfs.cpp b/tests/macro_benchmark/clients/graph_500_bfs.cpp index 0e6d80c34..35ddb60aa 100644 --- a/tests/macro_benchmark/clients/graph_500_bfs.cpp +++ b/tests/macro_benchmark/clients/graph_500_bfs.cpp @@ -6,8 +6,6 @@ #include "gflags/gflags.h" #include "long_running_common.hpp" -#include "stats/stats.hpp" -#include "stats/stats_rpc_messages.hpp" class Graph500BfsClient : public TestClient { public: @@ -55,7 +53,5 @@ int main(int argc, char **argv) { RunMultithreadedTest(clients); - stats::StopStatsLogging(); - return 0; } diff --git a/tests/macro_benchmark/clients/long_running_common.hpp b/tests/macro_benchmark/clients/long_running_common.hpp index d090a3827..94dfb60c4 100644 --- a/tests/macro_benchmark/clients/long_running_common.hpp +++ b/tests/macro_benchmark/clients/long_running_common.hpp @@ -14,8 +14,6 @@ #include "json/json.hpp" -#include "stats/metrics.hpp" -#include "stats/stats.hpp" #include "utils/timer.hpp" #include "common.hpp" @@ -35,9 +33,9 @@ DEFINE_int32(duration, 30, "Number of seconds to execute benchmark"); DEFINE_string(group, "unknown", "Test group name"); DEFINE_string(scenario, "unknown", "Test scenario name"); -auto &executed_queries = stats::GetCounter("executed_queries"); -auto &executed_steps = stats::GetCounter("executed_steps"); -auto &serialization_errors = stats::GetCounter("serialization_errors"); +std::atomic<uint64_t> executed_queries; +std::atomic<uint64_t> executed_steps; +std::atomic<uint64_t> serialization_errors; class TestClient { public: @@ -61,7 +59,7 @@ class TestClient { runner_thread_ = std::thread([&] { while (keep_running_) { Step(); - executed_steps.Bump(); + ++executed_steps; } }); } @@ -84,7 +82,7 @@ class TestClient { std::tie(result, retries) = ExecuteNTimesTillSuccess(client_, query, params, MAX_RETRIES); } catch (const utils::BasicException &e) { - serialization_errors.Bump(MAX_RETRIES); + serialization_errors += MAX_RETRIES; return std::experimental::nullopt; } auto wall_time = timer.Elapsed(); @@ -98,8 +96,8 @@ class TestClient { stats_[query].push_back(std::move(metadata)); } } - executed_queries.Bump(); - serialization_errors.Bump(retries); + ++executed_queries; + serialization_errors += retries; return result; } @@ -179,16 +177,11 @@ void RunMultithreadedTest(std::vector<std::unique_ptr<TestClient>> &clients) { auto it = aggregated_query_stats.insert({stat.first, Value(0.0)}).first; it->second = (it->second.ValueDouble() * old_count + stat.second) / (old_count + new_count); - stats::LogStat( - fmt::format("queries.{}.{}", query_stats.first, stat.first), - (stat.second / new_count)); } - stats::LogStat(fmt::format("queries.{}.count", query_stats.first), - new_count); } - out << "{\"num_executed_queries\": " << executed_queries.Value() << ", " - << "\"num_executed_steps\": " << executed_steps.Value() << ", " + out << "{\"num_executed_queries\": " << executed_queries << ", " + << "\"num_executed_steps\": " << executed_steps << ", " << "\"elapsed_time\": " << timer.Elapsed().count() << ", \"queries\": ["; utils::PrintIterable( diff --git a/tests/manual/CMakeLists.txt b/tests/manual/CMakeLists.txt index 73c5cc0dc..34ce84de3 100644 --- a/tests/manual/CMakeLists.txt +++ b/tests/manual/CMakeLists.txt @@ -30,30 +30,8 @@ target_link_libraries(${test_prefix}binomial mg-utils) add_manual_test(bolt_client.cpp) target_link_libraries(${test_prefix}bolt_client mg-communication) -add_manual_test(card_fraud_generate_snapshot.cpp) -target_link_libraries(${test_prefix}card_fraud_generate_snapshot mg-distributed kvstore_dummy_lib) - -add_manual_test(card_fraud_local.cpp) -target_link_libraries(${test_prefix}card_fraud_local mg-distributed kvstore_dummy_lib gtest) - -add_manual_test(distributed_query_planner.cpp interactive_planning.cpp) -target_link_libraries(${test_prefix}distributed_query_planner mg-distributed - kvstore_dummy_lib) -if (READLINE_FOUND) - target_link_libraries(${test_prefix}distributed_query_planner readline) -endif() - -add_manual_test(distributed_repl.cpp) -target_link_libraries(${test_prefix}distributed_repl mg-distributed kvstore_dummy_lib gtest readline) - add_manual_test(endinan.cpp) -add_manual_test(generate_snapshot.cpp) -target_link_libraries(${test_prefix}generate_snapshot mg-distributed kvstore_dummy_lib) - -add_manual_test(graph_500_generate_snapshot.cpp) -target_link_libraries(${test_prefix}graph_500_generate_snapshot mg-distributed kvstore_dummy_lib) - add_manual_test(kvstore_console.cpp) target_link_libraries(${test_prefix}kvstore_console kvstore_lib gflags glog) diff --git a/tests/qa/apollo_runs.yaml b/tests/qa/apollo_runs.yaml index 40ecd4f09..9466a2314 100644 --- a/tests/qa/apollo_runs.yaml +++ b/tests/qa/apollo_runs.yaml @@ -6,11 +6,3 @@ - ../../config # directory with config files outfile_paths: &OUTFILE_PATHS - \./memgraph/tests/qa/\.quality_assurance_status - -- name: quality_assurance_distributed - commands: TIMEOUT=300 ./continuous_integration --distributed - infiles: - - . # current directory - - ../../build_debug/memgraph_distributed # memgraph distributed debug binary - - ../../config # directory with config files - outfile_paths: *OUTFILE_PATHS diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index 5861cda24..4271bcd6f 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -22,9 +22,6 @@ endfunction(add_unit_test) add_unit_test(bolt_encoder.cpp) target_link_libraries(${test_prefix}bolt_encoder mg-single-node kvstore_dummy_lib) -add_unit_test(concurrent_id_mapper_distributed.cpp) -target_link_libraries(${test_prefix}concurrent_id_mapper_distributed mg-distributed kvstore_dummy_lib) - add_unit_test(concurrent_id_mapper_single_node.cpp) target_link_libraries(${test_prefix}concurrent_id_mapper_single_node mg-single-node kvstore_dummy_lib) @@ -34,9 +31,6 @@ target_link_libraries(${test_prefix}concurrent_map_access mg-single-node kvstore add_unit_test(concurrent_map.cpp) target_link_libraries(${test_prefix}concurrent_map mg-single-node kvstore_dummy_lib) -add_unit_test(counters.cpp) -target_link_libraries(${test_prefix}counters mg-distributed kvstore_dummy_lib) - add_unit_test(cypher_main_visitor.cpp) target_link_libraries(${test_prefix}cypher_main_visitor mg-single-node kvstore_dummy_lib) @@ -46,9 +40,6 @@ target_link_libraries(${test_prefix}database_key_index mg-single-node kvstore_du add_unit_test(database_label_property_index.cpp) target_link_libraries(${test_prefix}database_label_property_index mg-single-node kvstore_dummy_lib) -add_unit_test(database_master.cpp) -target_link_libraries(${test_prefix}database_master mg-distributed kvstore_dummy_lib) - add_unit_test(database_transaction_timeout.cpp) target_link_libraries(${test_prefix}database_transaction_timeout mg-single-node kvstore_dummy_lib) @@ -58,64 +49,19 @@ target_link_libraries(${test_prefix}datastructure_union_find mg-single-node kvst add_unit_test(deferred_deleter.cpp) target_link_libraries(${test_prefix}deferred_deleter mg-single-node kvstore_dummy_lib) -add_unit_test(distributed_coordination.cpp) -target_link_libraries(${test_prefix}distributed_coordination mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_data_exchange.cpp) -target_link_libraries(${test_prefix}distributed_data_exchange mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_dgp_vertex_migrator.cpp) -target_link_libraries(${test_prefix}distributed_dgp_vertex_migrator mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_durability.cpp) -target_link_libraries(${test_prefix}distributed_durability mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_dynamic_worker.cpp) -target_link_libraries(${test_prefix}distributed_dynamic_worker mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_gc.cpp) -target_link_libraries(${test_prefix}distributed_gc mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_graph_db.cpp) -target_link_libraries(${test_prefix}distributed_graph_db mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_interpretation.cpp) -target_link_libraries(${test_prefix}distributed_interpretation mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_query_plan.cpp) -target_link_libraries(${test_prefix}distributed_query_plan mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_reset.cpp) -target_link_libraries(${test_prefix}distributed_reset mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_serialization.cpp) -target_link_libraries(${test_prefix}distributed_serialization mg-distributed kvstore_dummy_lib) - -add_unit_test(distributed_updates.cpp) -target_link_libraries(${test_prefix}distributed_updates mg-distributed kvstore_dummy_lib) - # TODO (buda): Replace token sharing with centralized solution and write an appropriate test. # add_unit_test(distributed_token_sharing.cpp) # target_link_libraries(${test_prefix}distributed_token_sharing memgraph_lib kvstore_dummy_lib) -add_unit_test(bfs_distributed.cpp) -target_link_libraries(${test_prefix}bfs_distributed mg-distributed kvstore_dummy_lib) - add_unit_test(bfs_single_node.cpp) target_link_libraries(${test_prefix}bfs_single_node mg-single-node kvstore_dummy_lib) -add_unit_test(distributed_dgp_partitioner.cpp) -target_link_libraries(${test_prefix}distributed_dgp_partitioner mg-distributed kvstore_dummy_lib) - add_unit_test(durability.cpp) target_link_libraries(${test_prefix}durability mg-single-node kvstore_dummy_lib) add_unit_test(dynamic_bitset.cpp) target_link_libraries(${test_prefix}dynamic_bitset mg-single-node kvstore_dummy_lib) -add_unit_test(gid.cpp) -target_link_libraries(${test_prefix}gid mg-distributed kvstore_dummy_lib) - add_unit_test(graph_db_accessor.cpp) target_link_libraries(${test_prefix}graph_db_accessor mg-single-node kvstore_dummy_lib) @@ -131,9 +77,6 @@ target_link_libraries(${test_prefix}interpreter mg-single-node kvstore_dummy_lib add_unit_test(kvstore.cpp) target_link_libraries(${test_prefix}kvstore kvstore_lib glog) -add_unit_test(metrics.cpp) -target_link_libraries(${test_prefix}metrics mg-single-node kvstore_dummy_lib) - add_unit_test(mvcc.cpp) target_link_libraries(${test_prefix}mvcc mg-single-node kvstore_dummy_lib) @@ -179,9 +122,6 @@ target_link_libraries(${test_prefix}query_plan_match_filter_return mg-single-nod add_unit_test(query_plan.cpp) target_link_libraries(${test_prefix}query_plan mg-single-node kvstore_dummy_lib) -add_unit_test(query_required_privileges.cpp) -target_link_libraries(${test_prefix}query_required_privileges mg-single-node kvstore_dummy_lib) - add_unit_test(query_semantic.cpp) target_link_libraries(${test_prefix}query_semantic mg-single-node kvstore_dummy_lib) @@ -194,9 +134,6 @@ target_link_libraries(${test_prefix}queue mg-single-node kvstore_dummy_lib) add_unit_test(record_edge_vertex_accessor.cpp) target_link_libraries(${test_prefix}record_edge_vertex_accessor mg-single-node kvstore_dummy_lib) -add_unit_test(serialization.cpp) -target_link_libraries(${test_prefix}serialization mg-distributed kvstore_dummy_lib) - add_unit_test(skiplist_access.cpp) target_link_libraries(${test_prefix}skiplist_access mg-single-node kvstore_dummy_lib) @@ -218,15 +155,9 @@ target_link_libraries(${test_prefix}state_delta mg-single-node kvstore_dummy_lib add_unit_test(static_bitset.cpp) target_link_libraries(${test_prefix}static_bitset mg-single-node kvstore_dummy_lib) -add_unit_test(storage_address.cpp) -target_link_libraries(${test_prefix}storage_address mg-distributed kvstore_dummy_lib) - add_unit_test(stripped.cpp) target_link_libraries(${test_prefix}stripped mg-single-node kvstore_dummy_lib) -add_unit_test(transaction_engine_distributed.cpp) -target_link_libraries(${test_prefix}transaction_engine_distributed mg-distributed kvstore_dummy_lib) - add_unit_test(transaction_engine_single_node.cpp) target_link_libraries(${test_prefix}transaction_engine_single_node mg-single-node kvstore_dummy_lib) @@ -253,9 +184,6 @@ target_link_libraries(${test_prefix}communication_buffer mg-communication) add_unit_test(network_timeouts.cpp) target_link_libraries(${test_prefix}network_timeouts mg-communication) -add_unit_test(rpc.cpp) -target_link_libraries(${test_prefix}rpc mg-communication) - # Test data structures add_unit_test(ring_buffer.cpp) @@ -310,10 +238,6 @@ target_link_libraries(${test_prefix}utils_timestamp mg-utils) add_unit_test(utils_watchdog.cpp) target_link_libraries(${test_prefix}utils_watchdog mg-utils) -# Test mg-auth - -add_unit_test(auth.cpp) -target_link_libraries(${test_prefix}auth mg-auth kvstore_lib) # Test LCP diff --git a/tests/unit/bolt_session.cpp b/tests/unit/bolt_session.cpp index a402959c6..68ce13b23 100644 --- a/tests/unit/bolt_session.cpp +++ b/tests/unit/bolt_session.cpp @@ -50,11 +50,6 @@ class TestSession : public Session<TestInputStream, TestOutputStream> { void Abort() override {} - bool Authenticate(const std::string &username, - const std::string &password) override { - return true; - } - private: std::string query_; }; diff --git a/tests/unit/cypher_main_visitor.cpp b/tests/unit/cypher_main_visitor.cpp index f3e09f39d..0b8ff298b 100644 --- a/tests/unit/cypher_main_visitor.cpp +++ b/tests/unit/cypher_main_visitor.cpp @@ -1894,474 +1894,6 @@ TYPED_TEST(CypherMainVisitorTest, UnionAll) { ASSERT_FALSE(return_clause->body_.distinct); } -template <typename AstGeneratorT> -void check_auth_query(std::string input, AuthQuery::Action action, - std::string user, std::string role, - std::string user_or_role, - std::experimental::optional<TypedValue> password, - std::vector<AuthQuery::Privilege> privileges) { - AstGeneratorT ast_generator(input); - auto *query = ast_generator.query_; - ASSERT_TRUE(query->single_query_ && - query->single_query_->clauses_.size() == 1U); - auto auth_query = - dynamic_cast<AuthQuery *>(query->single_query_->clauses_[0]); - EXPECT_EQ(auth_query->action_, action); - EXPECT_EQ(auth_query->user_, user); - EXPECT_EQ(auth_query->role_, role); - EXPECT_EQ(auth_query->user_or_role_, user_or_role); - ASSERT_EQ(static_cast<bool>(auth_query->password_), - static_cast<bool>(password)); - if (password) { - ast_generator.CheckLiteral(auth_query->password_, *password); - } - EXPECT_EQ(auth_query->privileges_, privileges); -} - -TYPED_TEST(CypherMainVisitorTest, UserOrRoleName) { - ASSERT_THROW(TypeParam("CREATE ROLE `us|er`"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE ROLE `us er`"), SyntaxException); - check_auth_query<TypeParam>("CREATE ROLE `user`", - AuthQuery::Action::CREATE_ROLE, "", "user", "", - {}, {}); - check_auth_query<TypeParam>("CREATE ROLE us___er", - AuthQuery::Action::CREATE_ROLE, "", "us___er", "", - {}, {}); - check_auth_query<TypeParam>("CREATE ROLE `us+er`", - AuthQuery::Action::CREATE_ROLE, "", "us+er", "", - {}, {}); -} - -TYPED_TEST(CypherMainVisitorTest, CreateRole) { - ASSERT_THROW(TypeParam("CREATE ROLE"), SyntaxException); - check_auth_query<TypeParam>("CREATE ROLE rola", - AuthQuery::Action::CREATE_ROLE, "", "rola", "", - {}, {}); - ASSERT_THROW(TypeParam("CREATE ROLE lagano rolamo"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, DropRole) { - ASSERT_THROW(TypeParam("DROP ROLE"), SyntaxException); - check_auth_query<TypeParam>("DROP ROLE rola", AuthQuery::Action::DROP_ROLE, - "", "rola", "", {}, {}); - ASSERT_THROW(TypeParam("DROP ROLE lagano rolamo"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, ShowRoles) { - ASSERT_THROW(TypeParam("SHOW ROLES ROLES"), SyntaxException); - check_auth_query<TypeParam>("SHOW ROLES", AuthQuery::Action::SHOW_ROLES, "", - "", "", {}, {}); -} - -TYPED_TEST(CypherMainVisitorTest, CreateUser) { - ASSERT_THROW(TypeParam("CREATE USER"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER 123"), SyntaxException); - check_auth_query<TypeParam>("CREATE USER user", - AuthQuery::Action::CREATE_USER, "user", "", "", - {}, {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY 'password'", - AuthQuery::Action::CREATE_USER, "user", "", "", - "password", {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY ''", - AuthQuery::Action::CREATE_USER, "user", "", "", - "", {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY null", - AuthQuery::Action::CREATE_USER, "user", "", "", - TypedValue::Null, {}); - ASSERT_THROW(TypeParam("CRATE USER user IDENTIFIED BY password"), - SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER user IDENTIFIED BY 5"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER user IDENTIFIED BY "), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, SetPassword) { - ASSERT_THROW(TypeParam("SET PASSWORD FOR"), SyntaxException); - ASSERT_THROW(TypeParam("SET PASSWORD FOR user "), SyntaxException); - check_auth_query<TypeParam>("SET PASSWORD FOR user TO null", - AuthQuery::Action::SET_PASSWORD, "user", "", "", - TypedValue::Null, {}); - check_auth_query<TypeParam>("SET PASSWORD FOR user TO 'password'", - AuthQuery::Action::SET_PASSWORD, "user", "", "", - "password", {}); - ASSERT_THROW(TypeParam("SET PASSWORD FOR user To 5"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, DropUser) { - ASSERT_THROW(TypeParam("DROP USER"), SyntaxException); - check_auth_query<TypeParam>("DROP USER user", AuthQuery::Action::DROP_USER, - "user", "", "", {}, {}); - ASSERT_THROW(TypeParam("DROP USER lagano rolamo"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, ShowUsers) { - ASSERT_THROW(TypeParam("SHOW USERS ROLES"), SyntaxException); - check_auth_query<TypeParam>("SHOW USERS", AuthQuery::Action::SHOW_USERS, "", - "", "", {}, {}); -} - -TYPED_TEST(CypherMainVisitorTest, SetRole) { - ASSERT_THROW(TypeParam("SET ROLE"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE user"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE FOR user"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE FOR user TO"), SyntaxException); - check_auth_query<TypeParam>("SET ROLE FOR user TO role", - AuthQuery::Action::SET_ROLE, "user", "role", "", - {}, {}); - check_auth_query<TypeParam>("SET ROLE FOR user TO null", - AuthQuery::Action::SET_ROLE, "user", "null", "", - {}, {}); -} - -TYPED_TEST(CypherMainVisitorTest, ClearRole) { - ASSERT_THROW(TypeParam("CLEAR ROLE"), SyntaxException); - ASSERT_THROW(TypeParam("CLEAR ROLE user"), SyntaxException); - ASSERT_THROW(TypeParam("CLEAR ROLE FOR user TO"), SyntaxException); - check_auth_query<TypeParam>("CLEAR ROLE FOR user", - AuthQuery::Action::CLEAR_ROLE, "user", "", "", {}, - {}); -} - -TYPED_TEST(CypherMainVisitorTest, GrantPrivilege) { - ASSERT_THROW(TypeParam("GRANT"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT BLABLA TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT MATCH, TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT MATCH, BLABLA TO user"), SyntaxException); - check_auth_query<TypeParam>("GRANT MATCH TO user", - AuthQuery::Action::GRANT_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "GRANT MATCH, AUTH TO user", AuthQuery::Action::GRANT_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); -} - -TYPED_TEST(CypherMainVisitorTest, DenyPrivilege) { - ASSERT_THROW(TypeParam("DENY"), SyntaxException); - ASSERT_THROW(TypeParam("DENY TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY BLABLA TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY MATCH, TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY MATCH, BLABLA TO user"), SyntaxException); - check_auth_query<TypeParam>("DENY MATCH TO user", - AuthQuery::Action::DENY_PRIVILEGE, "", "", "user", - {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "DENY MATCH, AUTH TO user", AuthQuery::Action::DENY_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); -} - -TYPED_TEST(CypherMainVisitorTest, RevokePrivilege) { - ASSERT_THROW(TypeParam("REVOKE"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE BLABLA FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE MATCH, FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE MATCH, BLABLA FROM user"), SyntaxException); - check_auth_query<TypeParam>("REVOKE MATCH FROM user", - AuthQuery::Action::REVOKE_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "REVOKE MATCH, AUTH FROM user", AuthQuery::Action::REVOKE_PRIVILEGE, "", - "", "user", {}, - {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); - check_auth_query<TypeParam>( - "REVOKE ALL PRIVILEGES FROM user", AuthQuery::Action::REVOKE_PRIVILEGE, - "", "", "user", {}, - {AuthQuery::Privilege::CREATE, AuthQuery::Privilege::DELETE, - AuthQuery::Privilege::MATCH, AuthQuery::Privilege::MERGE, - AuthQuery::Privilege::SET, AuthQuery::Privilege::REMOVE, - AuthQuery::Privilege::INDEX, AuthQuery::Privilege::AUTH, - AuthQuery::Privilege::STREAM}); -} - -TYPED_TEST(CypherMainVisitorTest, ShowPrivileges) { - ASSERT_THROW(TypeParam("SHOW PRIVILEGES FOR"), SyntaxException); - check_auth_query<TypeParam>("SHOW PRIVILEGES FOR user", - AuthQuery::Action::SHOW_PRIVILEGES, "", "", - "user", {}, {}); - ASSERT_THROW(TypeParam("SHOW PRIVILEGES FOR user1, user2"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, ShowRoleForUser) { - ASSERT_THROW(TypeParam("SHOW ROLE FOR "), SyntaxException); - check_auth_query<TypeParam>("SHOW ROLE FOR user", - AuthQuery::Action::SHOW_ROLE_FOR_USER, "user", "", - "", {}, {}); - ASSERT_THROW(TypeParam("SHOW ROLE FOR user1, user2"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, ShowUsersForRole) { - ASSERT_THROW(TypeParam("SHOW USERS FOR "), SyntaxException); - check_auth_query<TypeParam>("SHOW USERS FOR role", - AuthQuery::Action::SHOW_USERS_FOR_ROLE, "", - "role", "", {}, {}); - ASSERT_THROW(TypeParam("SHOW USERS FOR role1, role2"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, CreateStream) { - auto check_create_stream = - [](std::string input, const std::string &stream_name, - const std::string &stream_uri, const std::string &stream_topic, - const std::string &transform_uri, - std::experimental::optional<int64_t> batch_interval_in_ms, - std::experimental::optional<int64_t> batch_size) { - TypeParam ast_generator(input); - auto *query = ast_generator.query_; - ASSERT_TRUE(query->single_query_); - auto *single_query = query->single_query_; - ASSERT_EQ(single_query->clauses_.size(), 1U); - auto *create_stream = - dynamic_cast<CreateStream *>(single_query->clauses_[0]); - ASSERT_TRUE(create_stream); - EXPECT_EQ(create_stream->stream_name_, stream_name); - ASSERT_TRUE(create_stream->stream_uri_); - ast_generator.CheckLiteral(create_stream->stream_uri_, - TypedValue(stream_uri)); - ASSERT_TRUE(create_stream->stream_topic_); - ast_generator.CheckLiteral(create_stream->stream_topic_, - TypedValue(stream_topic)); - ASSERT_TRUE(create_stream->transform_uri_); - ast_generator.CheckLiteral(create_stream->transform_uri_, - TypedValue(transform_uri)); - if (batch_interval_in_ms) { - ASSERT_TRUE(create_stream->batch_interval_in_ms_); - ast_generator.CheckLiteral(create_stream->batch_interval_in_ms_, - TypedValue(*batch_interval_in_ms)); - } else { - EXPECT_EQ(create_stream->batch_interval_in_ms_, nullptr); - } - if (batch_size) { - ASSERT_TRUE(create_stream->batch_size_); - ast_generator.CheckLiteral(create_stream->batch_size_, - TypedValue(*batch_size)); - } else { - EXPECT_EQ(create_stream->batch_size_, nullptr); - } - }; - - check_create_stream( - "CREATE STREAM stream AS LOAD DATA KAFKA 'localhost' " - "WITH TOPIC 'tropika' " - "WITH TRANSFORM 'localhost/test.py'", - "stream", "localhost", "tropika", "localhost/test.py", - std::experimental::nullopt, std::experimental::nullopt); - - check_create_stream( - "CreaTE StreaM stream AS LOad daTA KAFKA 'localhost' " - "WitH TopIC 'tropika' " - "WITH TRAnsFORM 'localhost/test.py' bAtCH inTErvAL 168", - "stream", "localhost", "tropika", "localhost/test.py", 168, - std::experimental::nullopt); - - check_create_stream( - "CreaTE StreaM stream AS LOad daTA KAFKA 'localhost' " - "WITH TopIC 'tropika' " - "WITH TRAnsFORM 'localhost/test.py' bAtCH SizE 17", - "stream", "localhost", "tropika", "localhost/test.py", - std::experimental::nullopt, 17); - - check_create_stream( - "CreaTE StreaM stream AS LOad daTA KAFKA 'localhost' " - "WitH TOPic 'tropika' " - "WITH TRAnsFORM 'localhost/test.py' bAtCH inTErvAL 168 Batch SIze 17", - "stream", "localhost", "tropika", "localhost/test.py", 168, 17); - - EXPECT_THROW(check_create_stream( - "CREATE STREAM stream AS LOAD DATA KAFKA 'localhost' " - "WITH TRANSFORM 'localhost/test.py' BATCH INTERVAL 'jedan' ", - "stream", "localhost", "tropika", "localhost/test.py", 168, - std::experimental::nullopt), - SyntaxException); - EXPECT_THROW(check_create_stream( - "CREATE STREAM stream AS LOAD DATA KAFKA 'localhost' " - "WITH TOPIC 'tropika' " - "WITH TRANSFORM 'localhost/test.py' BATCH SIZE 'jedan' ", - "stream", "localhost", "tropika", "localhost/test.py", - std::experimental::nullopt, 17), - SyntaxException); - EXPECT_THROW(check_create_stream( - "CREATE STREAM 123 AS LOAD DATA KAFKA 'localhost' " - "WITH TOPIC 'tropika' " - "WITH TRANSFORM 'localhost/test.py' BATCH INTERVAL 168 ", - "stream", "localhost", "tropika", "localhost/test.py", 168, - std::experimental::nullopt), - SyntaxException); - EXPECT_THROW(check_create_stream( - "CREATE STREAM stream AS LOAD DATA KAFKA localhost " - "WITH TOPIC 'tropika' " - "WITH TRANSFORM 'localhost/test.py'", - "stream", "localhost", "tropika", "localhost/test.py", - std::experimental::nullopt, std::experimental::nullopt), - SyntaxException); - EXPECT_THROW(check_create_stream( - "CREATE STREAM stream AS LOAD DATA KAFKA 'localhost' " - "WITH TOPIC 2" - "WITH TRANSFORM localhost/test.py BATCH INTERVAL 168 ", - "stream", "localhost", "tropika", "localhost/test.py", 168, - std::experimental::nullopt), - SyntaxException); - EXPECT_THROW(check_create_stream( - "CREATE STREAM stream AS LOAD DATA KAFKA 'localhost' " - "WITH TOPIC 'tropika'" - "WITH TRANSFORM localhost/test.py BATCH INTERVAL 168 ", - "stream", "localhost", "tropika", "localhost/test.py", 168, - std::experimental::nullopt), - SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, DropStream) { - auto check_drop_stream = [](std::string input, - const std::string &stream_name) { - TypeParam ast_generator(input); - auto *query = ast_generator.query_; - ASSERT_TRUE(query->single_query_); - auto *single_query = query->single_query_; - ASSERT_EQ(single_query->clauses_.size(), 1U); - auto *drop_stream = dynamic_cast<DropStream *>(single_query->clauses_[0]); - ASSERT_TRUE(drop_stream); - EXPECT_EQ(drop_stream->stream_name_, stream_name); - }; - - check_drop_stream("DRop stREAm stream", "stream"); - check_drop_stream("DRop stREAm strim", "strim"); - - EXPECT_THROW(check_drop_stream("DROp sTREAM", ""), SyntaxException); - - EXPECT_THROW(check_drop_stream("DROP STreAM 123", "123"), SyntaxException); - - EXPECT_THROW(check_drop_stream("DroP STREAM '123'", "123"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, ShowStreams) { - auto check_show_streams = [](std::string input) { - TypeParam ast_generator(input); - auto *query = ast_generator.query_; - ASSERT_TRUE(query->single_query_); - auto *single_query = query->single_query_; - ASSERT_EQ(single_query->clauses_.size(), 1U); - auto *show_streams = dynamic_cast<ShowStreams *>(single_query->clauses_[0]); - EXPECT_TRUE(show_streams); - }; - - check_show_streams("SHOW STREAMS"); - - EXPECT_THROW(check_show_streams("SHOW STREAMS lololo"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, StartStopStream) { - auto check_start_stop_stream = - [](std::string input, const std::string &stream_name, bool is_start, - std::experimental::optional<int64_t> limit_batches) { - TypeParam ast_generator(input); - auto *query = ast_generator.query_; - ASSERT_TRUE(query->single_query_); - auto *single_query = query->single_query_; - ASSERT_EQ(single_query->clauses_.size(), 1U); - auto *start_stop_stream = - dynamic_cast<StartStopStream *>(single_query->clauses_[0]); - EXPECT_TRUE(start_stop_stream); - - EXPECT_EQ(start_stop_stream->stream_name_, stream_name); - EXPECT_EQ(start_stop_stream->is_start_, is_start); - - if (limit_batches) { - ASSERT_TRUE(is_start); - ASSERT_TRUE(start_stop_stream->limit_batches_); - ast_generator.CheckLiteral(start_stop_stream->limit_batches_, - TypedValue(*limit_batches)); - } else { - EXPECT_EQ(start_stop_stream->limit_batches_, nullptr); - } - }; - - check_start_stop_stream("stARt STreaM STREAM", "STREAM", true, - std::experimental::nullopt); - check_start_stop_stream("stARt STreaM strim", "strim", true, - std::experimental::nullopt); - check_start_stop_stream("StARt STreAM strim LimIT 10 BATchES", "strim", true, - 10); - - check_start_stop_stream("StoP StrEAM strim", "strim", false, - std::experimental::nullopt); - - EXPECT_THROW(check_start_stop_stream("staRT STReaM 'strim'", "strim", true, - std::experimental::nullopt), - SyntaxException); - EXPECT_THROW(check_start_stop_stream("sTART STReaM strim LImiT 'dva' BATCheS", - "strim", true, 2), - SyntaxException); - EXPECT_THROW(check_start_stop_stream("StoP STreAM 'strim'", "strim", false, - std::experimental::nullopt), - SyntaxException); - EXPECT_THROW(check_start_stop_stream("STOp sTREAM strim LIMit 2 baTCHES", - "strim", false, 2), - SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, StartStopAllStreams) { - auto check_start_stop_all_streams = [](std::string input, bool is_start) { - TypeParam ast_generator(input); - auto *query = ast_generator.query_; - ASSERT_TRUE(query->single_query_); - auto *single_query = query->single_query_; - ASSERT_EQ(single_query->clauses_.size(), 1U); - auto *start_stop_all_streams = - dynamic_cast<StartStopAllStreams *>(single_query->clauses_[0]); - EXPECT_TRUE(start_stop_all_streams); - - EXPECT_EQ(start_stop_all_streams->is_start_, is_start); - }; - - check_start_stop_all_streams("STarT AlL StreAMs", true); - - check_start_stop_all_streams("StoP aLL STrEAMs", false); - - EXPECT_THROW(check_start_stop_all_streams("StaRT aLL STreAM", true), - SyntaxException); - - EXPECT_THROW(check_start_stop_all_streams("SToP AlL STREaM", false), - SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, TestStream) { - auto check_test_stream = - [](std::string input, const std::string &stream_name, - std::experimental::optional<int64_t> limit_batches) { - TypeParam ast_generator(input); - auto *query = ast_generator.query_; - ASSERT_TRUE(query->single_query_); - auto *single_query = query->single_query_; - ASSERT_EQ(single_query->clauses_.size(), 1U); - auto *test_stream = - dynamic_cast<TestStream *>(single_query->clauses_[0]); - EXPECT_TRUE(test_stream); - - EXPECT_EQ(test_stream->stream_name_, stream_name); - - if (limit_batches) { - ASSERT_TRUE(test_stream->limit_batches_); - ast_generator.CheckLiteral(test_stream->limit_batches_, - TypedValue(*limit_batches)); - } else { - EXPECT_EQ(test_stream->limit_batches_, nullptr); - } - }; - - check_test_stream("TesT STreaM strim", "strim", std::experimental::nullopt); - check_test_stream("TesT STreaM STREAM", "STREAM", std::experimental::nullopt); - check_test_stream("tESt STreAM STREAM LimIT 10 BATchES", "STREAM", 10); - - check_test_stream("Test StrEAM STREAM", "STREAM", std::experimental::nullopt); - - EXPECT_THROW(check_test_stream("tEST STReaM 'strim'", "strim", - std::experimental::nullopt), - SyntaxException); - EXPECT_THROW( - check_test_stream("test STReaM strim LImiT 'dva' BATCheS", "strim", 2), - SyntaxException); - EXPECT_THROW(check_test_stream("test STreAM 'strim'", "strim", - std::experimental::nullopt), - SyntaxException); -} - TYPED_TEST(CypherMainVisitorTest, TestExplainRegularQuery) { { TypeParam ast_generator("RETURN n"); @@ -2378,17 +1910,4 @@ TYPED_TEST(CypherMainVisitorTest, TestExplainExplainQuery) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestExplainAuthQuery) { - TypeParam ast_generator("SHOW ROLES"); - EXPECT_FALSE(ast_generator.query_->explain_); - EXPECT_THROW(TypeParam ast_generator("EXPLAIN SHOW ROLES"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, TestExplainStreamQuery) { - TypeParam ast_generator("SHOW STREAMS"); - EXPECT_FALSE(ast_generator.query_->explain_); - EXPECT_THROW(TypeParam ast_generator("EXPLAIN SHOW STREAMS"), - SyntaxException); -} - } // namespace diff --git a/tests/unit/query_plan.cpp b/tests/unit/query_plan.cpp index 60eb22fe5..f973d5cec 100644 --- a/tests/unit/query_plan.cpp +++ b/tests/unit/query_plan.cpp @@ -16,8 +16,6 @@ #include "query/plan/operator.hpp" #include "query/plan/planner.hpp" -#include <capnp/message.h> - #include "query_common.hpp" namespace query { @@ -1319,153 +1317,4 @@ TYPED_TEST(TestPlanner, ReturnAsteriskOmitsLambdaSymbols) { } } -TYPED_TEST(TestPlanner, AuthQuery) { - // Check if everything is properly forwarded from ast node to the operator - FakeDbAccessor dba; - AstStorage storage; - auto *query = - QUERY(SINGLE_QUERY(AUTH_QUERY(query::AuthQuery::Action::DROP_ROLE, "user", - "role", "user_or_role", LITERAL("password"), - std::vector<query::AuthQuery::Privilege>( - {query::AuthQuery::Privilege::MATCH, - query::AuthQuery::Privilege::AUTH})))); - CheckPlan<TypeParam>( - query, storage, - ExpectAuthHandler(query::AuthQuery::Action::DROP_ROLE, "user", "role", - "user_or_role", LITERAL("password"), - {query::AuthQuery::Privilege::MATCH, - query::AuthQuery::Privilege::AUTH})); -} - -TYPED_TEST(TestPlanner, CreateStream) { - std::string stream_name("kafka"), stream_uri("localhost:1234"), - stream_topic("tropik"), transform_uri("localhost:1234/file.py"); - int64_t batch_interval_in_ms = 100; - int64_t batch_size = 10; - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = - QUERY(SINGLE_QUERY(CREATE_STREAM(stream_name, stream_uri, stream_topic, - transform_uri, nullptr, nullptr))); - auto expected = ExpectCreateStream( - stream_name, LITERAL(stream_uri), LITERAL(stream_topic), - LITERAL(transform_uri), nullptr, nullptr); - CheckPlan<TypeParam>(query, storage, expected); - } - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY( - CREATE_STREAM(stream_name, stream_uri, stream_topic, transform_uri, - LITERAL(batch_interval_in_ms), nullptr))); - auto expected = ExpectCreateStream( - stream_name, LITERAL(stream_uri), LITERAL(stream_topic), - LITERAL(transform_uri), LITERAL(batch_interval_in_ms), nullptr); - CheckPlan<TypeParam>(query, storage, expected); - } - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY( - CREATE_STREAM(stream_name, stream_uri, stream_topic, transform_uri, - nullptr, LITERAL(batch_size)))); - auto expected = ExpectCreateStream( - stream_name, LITERAL(stream_uri), LITERAL(stream_topic), - LITERAL(transform_uri), nullptr, LITERAL(batch_size)); - CheckPlan<TypeParam>(query, storage, expected); - } - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY( - CREATE_STREAM(stream_name, stream_uri, stream_topic, transform_uri, - LITERAL(batch_interval_in_ms), LITERAL(batch_size)))); - auto expected = - ExpectCreateStream(stream_name, LITERAL(stream_uri), - LITERAL(stream_topic), LITERAL(transform_uri), - LITERAL(batch_interval_in_ms), LITERAL(batch_size)); - CheckPlan<TypeParam>(query, storage, expected); - } -} - -TYPED_TEST(TestPlanner, DropStream) { - std::string stream_name("kafka"); - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY(DROP_STREAM(stream_name))); - auto expected = ExpectDropStream(stream_name); - CheckPlan<TypeParam>(query, storage, expected); -} - -TYPED_TEST(TestPlanner, ShowStreams) { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY(SHOW_STREAMS)); - auto expected = ExpectShowStreams(); - CheckPlan<TypeParam>(query, storage, expected); -} - -TYPED_TEST(TestPlanner, StartStopStream) { - std::string stream_name("kafka"); - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY(START_STREAM(stream_name, nullptr))); - auto expected = ExpectStartStopStream(stream_name, true, nullptr); - CheckPlan<TypeParam>(query, storage, expected); - } - { - FakeDbAccessor dba; - AstStorage storage; - auto limit_batches = LITERAL(10); - auto *query = QUERY(SINGLE_QUERY(START_STREAM(stream_name, limit_batches))); - auto expected = ExpectStartStopStream(stream_name, true, limit_batches); - CheckPlan<TypeParam>(query, storage, expected); - } - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY(STOP_STREAM(stream_name))); - auto expected = ExpectStartStopStream(stream_name, false, nullptr); - CheckPlan<TypeParam>(query, storage, expected); - } -} - -TYPED_TEST(TestPlanner, StartStopAllStreams) { - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY(START_ALL_STREAMS)); - auto expected = ExpectStartStopAllStreams(true); - CheckPlan<TypeParam>(query, storage, expected); - } - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY(STOP_ALL_STREAMS)); - auto expected = ExpectStartStopAllStreams(false); - CheckPlan<TypeParam>(query, storage, expected); - } -} - -TYPED_TEST(TestPlanner, TestStream) { - std::string stream_name("kafka"); - { - FakeDbAccessor dba; - AstStorage storage; - auto *query = QUERY(SINGLE_QUERY(TEST_STREAM(stream_name, nullptr))); - auto expected = ExpectTestStream(stream_name, nullptr); - CheckPlan<TypeParam>(query, storage, expected); - } - { - FakeDbAccessor dba; - AstStorage storage; - auto limit_batches = LITERAL(10); - auto *query = QUERY(SINGLE_QUERY(TEST_STREAM(stream_name, limit_batches))); - auto expected = ExpectTestStream(stream_name, limit_batches); - CheckPlan<TypeParam>(query, storage, expected); - } -} - } // namespace diff --git a/tests/unit/query_plan_checker.hpp b/tests/unit/query_plan_checker.hpp index 282c46b30..56b80b831 100644 --- a/tests/unit/query_plan_checker.hpp +++ b/tests/unit/query_plan_checker.hpp @@ -93,15 +93,6 @@ class PlanChecker : public virtual HierarchicalLogicalOperatorVisitor { return false; } - VISIT(AuthHandler); - - VISIT(CreateStream); - VISIT(DropStream); - VISIT(ShowStreams); - VISIT(StartStopStream); - VISIT(StartStopAllStreams); - VISIT(TestStream); - PRE_VISIT(Explain); #undef PRE_VISIT @@ -151,7 +142,6 @@ using ExpectLimit = OpChecker<Limit>; using ExpectOrderBy = OpChecker<OrderBy>; using ExpectUnwind = OpChecker<Unwind>; using ExpectDistinct = OpChecker<Distinct>; -using ExpectShowStreams = OpChecker<ShowStreams>; class ExpectExpandVariable : public OpChecker<ExpandVariable> { public: @@ -323,39 +313,6 @@ class ExpectScanAllByLabelPropertyRange std::experimental::optional<ScanAllByLabelPropertyRange::Bound> upper_bound_; }; -class ExpectAuthHandler : public OpChecker<AuthHandler> { - public: - ExpectAuthHandler(query::AuthQuery::Action action, std::string user, - std::string role, std::string user_or_role, - query::Expression *password, - std::vector<query::AuthQuery::Privilege> privileges) - : action_(action), - user_(user), - role_(role), - user_or_role_(user_or_role), - password_(password), - privileges_(privileges) {} - - void ExpectOp(AuthHandler &auth_handler, const SymbolTable &) override { - EXPECT_EQ(auth_handler.action_, action_); - EXPECT_EQ(auth_handler.user_, user_); - EXPECT_EQ(auth_handler.role_, role_); - EXPECT_EQ(auth_handler.user_or_role_, user_or_role_); - // TODO(mtomic): We need to somehow test the password expression. - EXPECT_TRUE(password_); - EXPECT_TRUE(auth_handler.password_); - EXPECT_EQ(auth_handler.privileges_, privileges_); - } - - private: - query::AuthQuery::Action action_; - std::string user_; - std::string role_; - std::string user_or_role_; - query::Expression *password_{nullptr}; - std::vector<query::AuthQuery::Privilege> privileges_; -}; - class ExpectCreateIndex : public OpChecker<CreateIndex> { public: ExpectCreateIndex(storage::Label label, storage::Property property) @@ -393,130 +350,6 @@ class ExpectCartesian : public OpChecker<Cartesian> { const std::list<std::unique_ptr<BaseOpChecker>> &right_; }; -class ExpectCreateStream : public OpChecker<CreateStream> { - public: - ExpectCreateStream(std::string stream_name, query::Expression *stream_uri, - query::Expression *stream_topic, - query::Expression *transform_uri, - query::Expression *batch_interval_in_ms, - query::Expression *batch_size) - : stream_name_(stream_name), - stream_uri_(stream_uri), - stream_topic_(stream_topic), - transform_uri_(transform_uri), - batch_interval_in_ms_(batch_interval_in_ms), - batch_size_(batch_size) {} - - void ExpectOp(CreateStream &create_stream, const SymbolTable &) override { - EXPECT_EQ(create_stream.stream_name_, stream_name_); - // TODO: Proper expression equality - EXPECT_EQ(typeid(create_stream.stream_uri_).hash_code(), - typeid(stream_uri_).hash_code()); - EXPECT_EQ(typeid(create_stream.stream_topic_).hash_code(), - typeid(stream_topic_).hash_code()); - EXPECT_EQ(typeid(create_stream.transform_uri_).hash_code(), - typeid(transform_uri_).hash_code()); - if (batch_interval_in_ms_ && create_stream.batch_interval_in_ms_) { - EXPECT_EQ(typeid(create_stream.batch_interval_in_ms_).hash_code(), - typeid(batch_interval_in_ms_).hash_code()); - } else { - EXPECT_TRUE(batch_interval_in_ms_ == nullptr && - create_stream.batch_interval_in_ms_ == nullptr); - } - if (batch_size_ && create_stream.batch_size_) { - EXPECT_EQ(typeid(create_stream.batch_size_).hash_code(), - typeid(batch_size_).hash_code()); - } else { - EXPECT_TRUE(batch_size_ == nullptr && - create_stream.batch_size_ == nullptr); - } - } - - private: - std::string stream_name_; - query::Expression *stream_uri_; - query::Expression *stream_topic_; - query::Expression *transform_uri_; - query::Expression *batch_interval_in_ms_; - query::Expression *batch_size_; -}; - -class ExpectDropStream : public OpChecker<DropStream> { - public: - explicit ExpectDropStream(std::string stream_name) - : stream_name_(stream_name) {} - - void ExpectOp(DropStream &drop_stream, const SymbolTable &) override { - EXPECT_EQ(drop_stream.stream_name_, stream_name_); - } - - private: - std::string stream_name_; -}; - -class ExpectStartStopStream : public OpChecker<StartStopStream> { - public: - ExpectStartStopStream(std::string stream_name, bool is_start, - query::Expression *limit_batches) - : stream_name_(stream_name), - is_start_(is_start), - limit_batches_(limit_batches) {} - - void ExpectOp(StartStopStream &start_stop_stream, - const SymbolTable &) override { - EXPECT_EQ(start_stop_stream.stream_name_, stream_name_); - EXPECT_EQ(start_stop_stream.is_start_, is_start_); - // TODO: Proper expression equality - if (limit_batches_ && start_stop_stream.limit_batches_) { - EXPECT_EQ(typeid(start_stop_stream.limit_batches_).hash_code(), - typeid(limit_batches_).hash_code()); - } else { - EXPECT_TRUE(limit_batches_ == nullptr && - start_stop_stream.limit_batches_ == nullptr); - } - } - - private: - std::string stream_name_; - bool is_start_; - query::Expression *limit_batches_; -}; - -class ExpectStartStopAllStreams : public OpChecker<StartStopAllStreams> { - public: - explicit ExpectStartStopAllStreams(bool is_start) : is_start_(is_start) {} - - void ExpectOp(StartStopAllStreams &start_stop_all_streams, - const SymbolTable &) override { - EXPECT_EQ(start_stop_all_streams.is_start_, is_start_); - } - - private: - bool is_start_; -}; - -class ExpectTestStream : public OpChecker<TestStream> { - public: - ExpectTestStream(std::string stream_name, query::Expression *limit_batches) - : stream_name_(stream_name), limit_batches_(limit_batches) {} - - void ExpectOp(TestStream &test_stream, const SymbolTable &) override { - EXPECT_EQ(test_stream.stream_name_, stream_name_); - // TODO: Proper expression equality - if (limit_batches_ && test_stream.limit_batches_) { - EXPECT_EQ(typeid(test_stream.limit_batches_).hash_code(), - typeid(limit_batches_).hash_code()); - } else { - EXPECT_TRUE(limit_batches_ == nullptr && - test_stream.limit_batches_ == nullptr); - } - } - - private: - std::string stream_name_; - query::Expression *limit_batches_; -}; - template <class T> std::list<std::unique_ptr<BaseOpChecker>> MakeCheckers(T arg) { std::list<std::unique_ptr<BaseOpChecker>> l; diff --git a/tools/src/CMakeLists.txt b/tools/src/CMakeLists.txt index a1fc382ce..b1b024e04 100644 --- a/tools/src/CMakeLists.txt +++ b/tools/src/CMakeLists.txt @@ -2,10 +2,6 @@ add_executable(mg_import_csv mg_import_csv/main.cpp) target_link_libraries(mg_import_csv mg-single-node kvstore_dummy_lib) -# StatsD Target -add_executable(mg_statsd mg_statsd/main.cpp) -target_link_libraries(mg_statsd mg-communication mg-io mg-utils mg-stats) - # Generate a version.hpp file set(VERSION_STRING ${memgraph_VERSION}) configure_file(../../src/version.hpp.in version.hpp @ONLY) diff --git a/tools/tests/CMakeLists.txt b/tools/tests/CMakeLists.txt index 6c1597db6..1d9bf9726 100644 --- a/tools/tests/CMakeLists.txt +++ b/tools/tests/CMakeLists.txt @@ -3,9 +3,6 @@ include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) add_executable(mg_recovery_check mg_recovery_check.cpp) target_link_libraries(mg_recovery_check mg-single-node gtest gtest_main kvstore_dummy_lib) -add_executable(mg_statsd_client statsd/mg_statsd_client.cpp) -target_link_libraries(mg_statsd_client mg-communication mg-io mg-utils mg-stats) - # Copy CSV data to CMake build dir configure_file(csv/comment_nodes.csv csv/comment_nodes.csv COPYONLY) configure_file(csv/comment_nodes_2.csv csv/comment_nodes_2.csv COPYONLY)