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:
committed by
Antonio Andelic
parent
1abee1ed3a
commit
e8a1d15a55
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user