summaryrefslogtreecommitdiffstats
path: root/include/framework/interface/Query.h
blob: 4e9a3fbfa3de953c26df4b77edca978b334ce865 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
 * include/framework/interface/Query.h
 *
 * Copyright (C) 2023-2024 Douglas B. Rumbaugh <drumbaugh@psu.edu>
 *
 * Distributed under the Modified BSD License.
 *
 */
#pragma once

#include "framework/QueryRequirements.h"

namespace de {

/*
 *
 *
 */
template <typename QUERY, typename SHARD,
          typename RESULT = typename QUERY::ResultType,
          typename LOCAL_RESULT = typename QUERY::LocalResultType,
          typename PARAMETERS = typename QUERY::Parameters,
          typename LOCAL = typename QUERY::LocalQuery,
          typename LOCAL_BUFFER = typename QUERY::LocalQueryBuffer>
concept QueryInterface = requires(PARAMETERS *parameters, LOCAL *local,
                                  LOCAL_BUFFER *buffer_query, SHARD *shard,
                                  std::vector<LOCAL *> &local_queries,
                                  std::vector<LOCAL_RESULT> &local_results,
                                  RESULT &result,
                                  BufferView<typename SHARD::RECORD> *bv) {
  /*
   * Given a set of query parameters and a shard, return a local query
   * object for that shard.
   */
  { QUERY::local_preproc(shard, parameters) } -> std::convertible_to<LOCAL *>;

  /*
   * Given a set of query parameters and a buffer view, return a local
   * query object for the buffer.
   * NOTE: for interface reasons, the pointer to the buffer view MUST be
   *       stored inside of the local query object. The future buffer
   *       query routine will access the buffer by way of this pointer.
   */
  {
    QUERY::local_preproc_buffer(bv, parameters)
    } -> std::convertible_to<LOCAL_BUFFER *>;

  /*
   * Given a full set of local queries, and the buffer query, make any
   * necessary adjustments to the local queries in-place, to account for
   * global information. If no additional processing is required, this
   * function can be left empty.
   */
  {QUERY::distribute_query(parameters, local_queries, buffer_query)};

  /*
   * Answer the local query, defined by `local` against `shard` and return
   * a vector of LOCAL_RESULT objects defining the query result.
   */
  { QUERY::local_query(shard, local) } -> std::convertible_to<LOCAL_RESULT>;

  /*
   * Answer the local query defined by `local` against the buffer (which
   * should be accessed by a pointer inside of `local`) and return a vector
   * of LOCAL_RESULT objects defining the query result.
   */
  {
    QUERY::local_query_buffer(buffer_query)
    } -> std::convertible_to<LOCAL_RESULT>;

  /*
   * Process the local results from the buffer and all of the shards,
   * stored in `local_results`, and insert the associated ResultType
   * objects into the `result` vector, which represents the final result
   * of the query. Updates to this vector are done in-place.
   */
  {QUERY::combine(local_results, parameters, result)};

  /*
   * Process the post-combine `result` vector of ResultType objects,
   * in the context of the global and local query parameters, to determine
   * if the query should be repeated. If so, make any necessary adjustments
   * to the local query objects and return True. Otherwise, return False.
   *
   * If no repetition is needed for a given problem type, simply return
   * False immediately and the query will end.
   */
  {
    QUERY::repeat(parameters, result, local_queries, buffer_query)
    } -> std::same_as<bool>;

  /*
   * If this flag is True, then the query will immediately stop and return
   * a result as soon as the first non-deleted LocalRecordType is found.
   * Otherwise, every Shard and the buffer will be queried and the results
   * merged, like normal.
   *
   * This is largely an optimization flag for use with point-lookup, or
   * other single-record result queries
   */
  { QUERY::EARLY_ABORT } -> std::convertible_to<bool>;

  /*
   * If false, the built-in delete filtering that the framework can
   * apply to the local results, prior to calling combine, will be skipped.
   * This general filtering can be inefficient, particularly for tombstone
   * -based deletes, and so if a more efficient manual filtering can be
   * performed, it is worth setting this to True and doing that filtering
   * in the combine step.
   *
   * If deletes are not a consideration for your problem, it's also best
   * to turn this off, as it'll avoid the framework making an extra pass
   * over the local results prior to combining them.
   *
   * TODO: Temporarily disabling this, as we've dropped framework-level
   *       delete filtering for the time being.
   */
  /* { QUERY::SKIP_DELETE_FILTER } -> std::convertible_to<bool>; */
};
} // namespace de