| 1 | //===----------------------------------------------------------------------===// |
| 2 | // DuckDB |
| 3 | // |
| 4 | // duckdb/common/row_operations/row_operations.hpp |
| 5 | // |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #pragma once |
| 10 | |
| 11 | #include "duckdb/common/enums/expression_type.hpp" |
| 12 | #include "duckdb/common/types.hpp" |
| 13 | |
| 14 | namespace duckdb { |
| 15 | |
| 16 | class Allocator; |
| 17 | struct AggregateObject; |
| 18 | struct AggregateFilterData; |
| 19 | class DataChunk; |
| 20 | class RowLayout; |
| 21 | class TupleDataLayout; |
| 22 | class RowDataCollection; |
| 23 | struct SelectionVector; |
| 24 | class StringHeap; |
| 25 | class Vector; |
| 26 | struct UnifiedVectorFormat; |
| 27 | |
| 28 | struct RowOperationsState { |
| 29 | RowOperationsState(Allocator &allocator) : allocator(allocator) { |
| 30 | } |
| 31 | |
| 32 | Allocator &allocator; |
| 33 | }; |
| 34 | |
| 35 | // RowOperations contains a set of operations that operate on data using a RowLayout |
| 36 | struct RowOperations { |
| 37 | //===--------------------------------------------------------------------===// |
| 38 | // Aggregation Operators |
| 39 | //===--------------------------------------------------------------------===// |
| 40 | //! initialize - unaligned addresses |
| 41 | static void InitializeStates(TupleDataLayout &layout, Vector &addresses, const SelectionVector &sel, idx_t count); |
| 42 | //! destructor - unaligned addresses, updated |
| 43 | static void DestroyStates(RowOperationsState &state, TupleDataLayout &layout, Vector &addresses, idx_t count); |
| 44 | //! update - aligned addresses |
| 45 | static void UpdateStates(RowOperationsState &state, AggregateObject &aggr, Vector &addresses, DataChunk &payload, |
| 46 | idx_t arg_idx, idx_t count); |
| 47 | //! filtered update - aligned addresses |
| 48 | static void UpdateFilteredStates(RowOperationsState &state, AggregateFilterData &filter_data, AggregateObject &aggr, |
| 49 | Vector &addresses, DataChunk &payload, idx_t arg_idx); |
| 50 | //! combine - unaligned addresses, updated |
| 51 | static void CombineStates(RowOperationsState &state, TupleDataLayout &layout, Vector &sources, Vector &targets, |
| 52 | idx_t count); |
| 53 | //! finalize - unaligned addresses, updated |
| 54 | static void FinalizeStates(RowOperationsState &state, TupleDataLayout &layout, Vector &addresses, DataChunk &result, |
| 55 | idx_t aggr_idx); |
| 56 | |
| 57 | //===--------------------------------------------------------------------===// |
| 58 | // Read/Write Operators |
| 59 | //===--------------------------------------------------------------------===// |
| 60 | //! Scatter group data to the rows. Initialises the ValidityMask. |
| 61 | static void Scatter(DataChunk &columns, UnifiedVectorFormat col_data[], const RowLayout &layout, Vector &rows, |
| 62 | RowDataCollection &string_heap, const SelectionVector &sel, idx_t count); |
| 63 | //! Gather a single column. |
| 64 | //! If heap_ptr is not null, then the data is assumed to contain swizzled pointers, |
| 65 | //! which will be unswizzled in memory. |
| 66 | static void Gather(Vector &rows, const SelectionVector &row_sel, Vector &col, const SelectionVector &col_sel, |
| 67 | const idx_t count, const RowLayout &layout, const idx_t col_no, const idx_t build_size = 0, |
| 68 | data_ptr_t heap_ptr = nullptr); |
| 69 | //! Full Scan an entire columns |
| 70 | static void FullScanColumn(const TupleDataLayout &layout, Vector &rows, Vector &col, idx_t count, idx_t col_idx); |
| 71 | |
| 72 | //===--------------------------------------------------------------------===// |
| 73 | // Comparison Operators |
| 74 | //===--------------------------------------------------------------------===// |
| 75 | //! Compare a block of key data against the row values to produce an updated selection that matches |
| 76 | //! and a second (optional) selection of non-matching values. |
| 77 | //! Returns the number of matches remaining in the selection. |
| 78 | using Predicates = vector<ExpressionType>; |
| 79 | |
| 80 | static idx_t Match(DataChunk &columns, UnifiedVectorFormat col_data[], const TupleDataLayout &layout, Vector &rows, |
| 81 | const Predicates &predicates, SelectionVector &sel, idx_t count, SelectionVector *no_match, |
| 82 | idx_t &no_match_count); |
| 83 | |
| 84 | //===--------------------------------------------------------------------===// |
| 85 | // Heap Operators |
| 86 | //===--------------------------------------------------------------------===// |
| 87 | //! Compute the entry sizes of a vector with variable size type (used before building heap buffer space). |
| 88 | static void ComputeEntrySizes(Vector &v, idx_t entry_sizes[], idx_t vcount, idx_t ser_count, |
| 89 | const SelectionVector &sel, idx_t offset = 0); |
| 90 | //! Compute the entry sizes of vector data with variable size type (used before building heap buffer space). |
| 91 | static void ComputeEntrySizes(Vector &v, UnifiedVectorFormat &vdata, idx_t entry_sizes[], idx_t vcount, |
| 92 | idx_t ser_count, const SelectionVector &sel, idx_t offset = 0); |
| 93 | //! Scatter vector with variable size type to the heap. |
| 94 | static void HeapScatter(Vector &v, idx_t vcount, const SelectionVector &sel, idx_t ser_count, idx_t col_idx, |
| 95 | data_ptr_t *key_locations, data_ptr_t *validitymask_locations, idx_t offset = 0); |
| 96 | //! Scatter vector data with variable size type to the heap. |
| 97 | static void HeapScatterVData(UnifiedVectorFormat &vdata, PhysicalType type, const SelectionVector &sel, |
| 98 | idx_t ser_count, idx_t col_idx, data_ptr_t *key_locations, |
| 99 | data_ptr_t *validitymask_locations, idx_t offset = 0); |
| 100 | //! Gather a single column with variable size type from the heap. |
| 101 | static void HeapGather(Vector &v, const idx_t &vcount, const SelectionVector &sel, const idx_t &col_idx, |
| 102 | data_ptr_t key_locations[], data_ptr_t validitymask_locations[]); |
| 103 | |
| 104 | //===--------------------------------------------------------------------===// |
| 105 | // Sorting Operators |
| 106 | //===--------------------------------------------------------------------===// |
| 107 | //! Scatter vector data to the rows in radix-sortable format. |
| 108 | static void RadixScatter(Vector &v, idx_t vcount, const SelectionVector &sel, idx_t ser_count, |
| 109 | data_ptr_t key_locations[], bool desc, bool has_null, bool nulls_first, idx_t prefix_len, |
| 110 | idx_t width, idx_t offset = 0); |
| 111 | |
| 112 | //===--------------------------------------------------------------------===// |
| 113 | // Out-of-Core Operators |
| 114 | //===--------------------------------------------------------------------===// |
| 115 | //! Swizzles blob pointers to offset within heap row |
| 116 | static void SwizzleColumns(const RowLayout &layout, const data_ptr_t base_row_ptr, const idx_t count); |
| 117 | //! Swizzles the base pointer of each row to offset within heap block |
| 118 | static void SwizzleHeapPointer(const RowLayout &layout, data_ptr_t row_ptr, const data_ptr_t heap_base_ptr, |
| 119 | const idx_t count, const idx_t base_offset = 0); |
| 120 | //! Copies 'count' heap rows that are pointed to by the rows at 'row_ptr' to 'heap_ptr' and swizzles the pointers |
| 121 | static void CopyHeapAndSwizzle(const RowLayout &layout, data_ptr_t row_ptr, const data_ptr_t heap_base_ptr, |
| 122 | data_ptr_t heap_ptr, const idx_t count); |
| 123 | |
| 124 | //! Unswizzles the base offset within heap block the rows to pointers |
| 125 | static void UnswizzleHeapPointer(const RowLayout &layout, const data_ptr_t base_row_ptr, |
| 126 | const data_ptr_t base_heap_ptr, const idx_t count); |
| 127 | //! Unswizzles all offsets back to pointers |
| 128 | static void UnswizzlePointers(const RowLayout &layout, const data_ptr_t base_row_ptr, |
| 129 | const data_ptr_t base_heap_ptr, const idx_t count); |
| 130 | }; |
| 131 | |
| 132 | } // namespace duckdb |
| 133 | |