From d6e08e9d8d3ac9b356ac50cee22b41f828160247 Mon Sep 17 00:00:00 2001 From: Douglas Rumbaugh Date: Thu, 27 Jul 2023 18:21:26 -0400 Subject: Expanded query interface Query interface now enables skipping of delete processing and stopping query processing when first match is found. --- include/framework/DynamicExtension.h | 41 ++++++++++++++++++++++++++++++------ include/framework/QueryInterface.h | 10 ++++++++- 2 files changed, 43 insertions(+), 8 deletions(-) (limited to 'include/framework') diff --git a/include/framework/DynamicExtension.h b/include/framework/DynamicExtension.h index bd09e1f..5c903b9 100644 --- a/include/framework/DynamicExtension.h +++ b/include/framework/DynamicExtension.h @@ -121,16 +121,39 @@ public: Q::process_query_states(parms, states, buffer_state); - std::vector> query_results(shards.size() + 1); + std::vector>> query_results(shards.size() + 1); // Execute the query for the buffer auto buffer_results = Q::buffer_query(buffer, buffer_state, parms); - query_results[0] = filter_deletes(buffer_results, {-1, -1}, buffer); + query_results[0] = std::move(filter_deletes(buffer_results, {-1, -1}, buffer)); + if constexpr (Q::EARLY_ABORT) { + if (query_results[0].size() > 0) { + auto result = Q::merge(query_results, parms); + for (size_t i=0; i 0) { + auto result = Q::merge(query_results, parms); + for (size_t i=0; iappend(rec, ts); } - std::vector filter_deletes(std::vector> &records, ShardID shid, Buffer *buffer) { - std::vector processed_records; + std::vector> filter_deletes(std::vector> &records, ShardID shid, Buffer *buffer) { + if constexpr (!Q::SKIP_DELETE_FILTER) { + return records; + } + + std::vector> processed_records; processed_records.reserve(records.size()); // For delete tagging, we just need to check the delete bit on each @@ -276,7 +303,7 @@ private: continue; } - processed_records.emplace_back(rec.rec); + processed_records.emplace_back(rec); } return processed_records; @@ -305,7 +332,7 @@ private: } } - processed_records.emplace_back(rec.rec); + processed_records.emplace_back(rec); } return processed_records; diff --git a/include/framework/QueryInterface.h b/include/framework/QueryInterface.h index 886bdc8..46a1ce1 100644 --- a/include/framework/QueryInterface.h +++ b/include/framework/QueryInterface.h @@ -8,11 +8,12 @@ */ #pragma once +#include #include #include "util/types.h" template -concept QueryInterface = requires(Q q, void *p) { +concept QueryInterface = requires(Q q, void *p, std::vector &s) { /* {q.get_query_state(p, p)} -> std::convertible_to; @@ -22,6 +23,13 @@ concept QueryInterface = requires(Q q, void *p) { {q.merge()}; {q.delete_query_state(p)}; */ + {Q::EARLY_ABORT} -> std::convertible_to; + {Q::SKIP_DELETE_FILTER} -> std::convertible_to; + //{Q::get_query_state(p, p)} -> std::convertible_to; + //{Q::get_buffer_query_state(p, p)} -> std::convertible_to; + {Q::process_query_states(p, s, p)}; {Q::delete_query_state(std::declval())} -> std::same_as; + {Q::delete_buffer_query_state(p)}; + }; -- cgit v1.2.3