Add filtering based on registered event types (#155)

* Add filtering to TriggerContextCollector

* Add all predefined variable to ANY triggers

* Make variable names consistent with event types
This commit is contained in:
János Benjamin Antal
2021-05-25 14:18:27 +02:00
committed by Antonio Andelic
parent 1abee1ed3a
commit e8a1d15a55
10 changed files with 1245 additions and 863 deletions

View File

@@ -606,58 +606,6 @@ InterpreterContext::InterpreterContext(storage::Storage *db, const std::filesyst
Interpreter::Interpreter(InterpreterContext *interpreter_context) : interpreter_context_(interpreter_context) {
MG_ASSERT(interpreter_context_, "Interpreter context must not be NULL");
// try {
// {
// auto storage_acc = interpreter_context_->db->Access();
// DbAccessor dba(&storage_acc);
// auto triggers_acc = interpreter_context_->before_commit_triggers.access();
// triggers_acc.insert(Trigger{"BeforeDelete",
// "UNWIND deletedVertices as u CREATE(:DELETED_VERTEX {id: id(u) + 10})",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::VERTEX_DELETE});
// triggers_acc.insert(Trigger{"BeforeUpdatePropertyi",
// "UNWIND assignedVertexProperties as u SET u.vertex.two = u.new",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::VERTEX_UPDATE});
// triggers_acc.insert(Trigger{"BeforeDeleteEdge", "UNWIND deletedEdges as u CREATE(:DELETED_EDGE {id: id(u) +10})
// ",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::EDGE_DELETE});
// // triggers_acc.insert(Trigger{"BeforeDelete2", "UNWIND deletedEdges as u SET u.deleted = 0",
// // &interpreter_context_->ast_cache, &dba,
// // &interpreter_context_->antlr_lock});
// triggers_acc.insert(Trigger{"BeforeDeleteProcedure",
// "CALL script.procedure('VERTEX_UPDATE', updatedVertices) YIELD * RETURN *",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::VERTEX_UPDATE});
// triggers_acc.insert(Trigger{"BeforeCreator", "UNWIND createdVertices as u SET u.before = id(u) + 10",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::VERTEX_CREATE});
// triggers_acc.insert(Trigger{"BeforeCreatorEdge", "UNWIND createdEdges as u SET u.before = id(u) + 10",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::EDGE_CREATE});
// triggers_acc.insert(Trigger{"BeforeSetLabelProcedure",
// "CALL label.procedure('VERTEX_UPDATE', assignedVertexLabels) YIELD * RETURN *",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::VERTEX_UPDATE});
// }
// {
// auto storage_acc = interpreter_context->db->Access();
// DbAccessor dba(&storage_acc);
// auto triggers_acc = interpreter_context->after_commit_triggers.access();
// triggers_acc.insert(Trigger{"AfterDelete", "UNWIND deletedVertices as u CREATE(:DELETED {id: u.id + 100})",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::VERTEX_DELETE});
// triggers_acc.insert(Trigger{"AfterCreator", "UNWIND createdVertices as u SET u.after = u.id + 100",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock,
// TriggerEventType::VERTEX_CREATE});
// triggers_acc.insert(Trigger{
// "AfterUpdateProcedure", "CALL script.procedure('UPDATE',updatedObjects) YIELD * RETURN *",
// &interpreter_context_->ast_cache, &dba, &interpreter_context_->antlr_lock, TriggerEventType::UPDATE});
// }
// } catch (const utils::BasicException &e) {
// spdlog::critical("Failed to create a trigger because: {}", e.what());
// }
}
PreparedQuery Interpreter::PrepareTransactionQuery(std::string_view query_upper) {
@@ -675,7 +623,7 @@ PreparedQuery Interpreter::PrepareTransactionQuery(std::string_view query_upper)
execution_db_accessor_.emplace(db_accessor_.get());
if (interpreter_context_->trigger_store->HasTriggers()) {
trigger_context_collector_.emplace();
trigger_context_collector_.emplace(interpreter_context_->trigger_store->GetEventTypes());
}
};
} else if (query_upper == "COMMIT") {
@@ -1504,7 +1452,7 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string,
execution_db_accessor_.emplace(db_accessor_.get());
if (utils::Downcast<CypherQuery>(parsed_query.query) && interpreter_context_->trigger_store->HasTriggers()) {
trigger_context_collector_.emplace();
trigger_context_collector_.emplace(interpreter_context_->trigger_store->GetEventTypes());
}
}
@@ -1648,6 +1596,7 @@ void Interpreter::Commit() {
std::optional<TriggerContext> trigger_context = std::nullopt;
if (trigger_context_collector_) {
trigger_context.emplace(std::move(*trigger_context_collector_).TransformToTriggerContext());
trigger_context_collector_.reset();
}
if (trigger_context) {
@@ -1667,6 +1616,12 @@ void Interpreter::Commit() {
SPDLOG_DEBUG("Finished executing before commit triggers");
}
const auto reset_necessary_members = [this]() {
execution_db_accessor_.reset();
db_accessor_.reset();
trigger_context_collector_.reset();
};
auto maybe_constraint_violation = db_accessor_->Commit();
if (maybe_constraint_violation.HasError()) {
const auto &constraint_violation = maybe_constraint_violation.GetError();
@@ -1675,9 +1630,7 @@ void Interpreter::Commit() {
auto label_name = execution_db_accessor_->LabelToName(constraint_violation.label);
MG_ASSERT(constraint_violation.properties.size() == 1U);
auto property_name = execution_db_accessor_->PropertyToName(*constraint_violation.properties.begin());
execution_db_accessor_.reset();
db_accessor_.reset();
trigger_context_collector_.reset();
reset_necessary_members();
throw QueryException("Unable to commit due to existence constraint violation on :{}({})", label_name,
property_name);
break;
@@ -1688,9 +1641,7 @@ void Interpreter::Commit() {
utils::PrintIterable(
property_names_stream, constraint_violation.properties, ", ",
[this](auto &stream, const auto &prop) { stream << execution_db_accessor_->PropertyToName(prop); });
execution_db_accessor_.reset();
db_accessor_.reset();
trigger_context_collector_.reset();
reset_necessary_members();
throw QueryException("Unable to commit due to unique constraint violation on :{}({})", label_name,
property_names_stream.str());
break;
@@ -1714,9 +1665,7 @@ void Interpreter::Commit() {
});
}
execution_db_accessor_.reset();
db_accessor_.reset();
trigger_context_collector_.reset();
reset_necessary_members();
SPDLOG_DEBUG("Finished comitting the transaction");
}