/* * include/query/pointlookup.h * * Copyright (C) 2024 Douglas B. Rumbaugh * * Distributed under the Modified BSD License. * * A query class for point lookup operations. * * TODO: Currently, this only supports point lookups for unique keys (which * is the case for the trie that we're building this to use). It would be * pretty straightforward to extend it to return *all* records that match * the search_key (including tombstone cancellation--it's invertible) to * support non-unique indexes, or at least those implementing * lower_bound(). */ #pragma once #include "framework/QueryRequirements.h" namespace de { namespace pl { template struct Parms { decltype(R::key) search_key; }; template struct State { }; template struct BufferState { BufferView *buffer; BufferState(BufferView *buffer) : buffer(buffer) {} }; template S> class Query { public: constexpr static bool EARLY_ABORT=true; constexpr static bool SKIP_DELETE_FILTER=true; static void *get_query_state(S *shard, void *parms) { return nullptr; } static void* get_buffer_query_state(BufferView *buffer, void *parms) { auto res = new BufferState(buffer); return res; } static void process_query_states(void *query_parms, std::vector &shard_states, void* buffer_state) { return; } static std::vector> query(S *shard, void *q_state, void *parms) { auto p = (Parms *) parms; auto s = (State *) q_state; std::vector> result; auto r = shard->point_lookup({p->search_key, 0}); if (r) { result.push_back(*r); } return result; } static std::vector> buffer_query(void *state, void *parms) { auto p = (Parms *) parms; auto s = (BufferState *) state; std::vector> records; for (size_t i=0; ibuffer->get_record_count(); i++) { auto rec = s->buffer->get(i); if (rec->rec.key == p->search_key) { records.push_back(*rec); return records; } } return records; } static std::vector merge(std::vector>> &results, void *parms) { std::vector output; for (auto r : results) { if (r.size() > 0) { if (r[0].is_deleted() || r[0].is_tombstone()) { return output; } output.append(r[0].rec); return output; } } } static void delete_query_state(void *state) { auto s = (State *) state; delete s; } static void delete_buffer_query_state(void *state) { auto s = (BufferState *) state; delete s; } }; }}