1//===----------------------------------------------------------------------===//
2// DuckDB
3//
4// duckdb/execution/index/art/art_key.hpp
5//
6//
7//===----------------------------------------------------------------------===//
8
9#pragma once
10
11#include "duckdb/common/common.hpp"
12#include "duckdb/common/exception.hpp"
13#include "duckdb/common/radix.hpp"
14#include "duckdb/common/types/string_type.hpp"
15#include "duckdb/common/types/value.hpp"
16#include "duckdb/storage/arena_allocator.hpp"
17
18namespace duckdb {
19
20class ARTKey {
21public:
22 ARTKey();
23 ARTKey(const data_ptr_t &data, const uint32_t &len);
24 ARTKey(ArenaAllocator &allocator, const uint32_t &len);
25
26 uint32_t len;
27 data_ptr_t data;
28
29public:
30 template <class T>
31 static inline ARTKey CreateARTKey(ArenaAllocator &allocator, const LogicalType &type, T element) {
32 auto data = ARTKey::CreateData<T>(allocator, element);
33 return ARTKey(data, sizeof(element));
34 }
35
36 template <class T>
37 static inline ARTKey CreateARTKey(ArenaAllocator &allocator, const LogicalType &type, const Value &element) {
38 return CreateARTKey(allocator, type, element.GetValueUnsafe<T>());
39 }
40
41 template <class T>
42 static inline void CreateARTKey(ArenaAllocator &allocator, const LogicalType &type, ARTKey &key, T element) {
43 key.data = ARTKey::CreateData<T>(allocator, element);
44 key.len = sizeof(element);
45 }
46
47 template <class T>
48 static inline void CreateARTKey(ArenaAllocator &allocator, const LogicalType &type, ARTKey &key,
49 const Value element) {
50 key.data = ARTKey::CreateData<T>(allocator, element.GetValueUnsafe<T>());
51 key.len = sizeof(element);
52 }
53
54public:
55 data_t &operator[](size_t i) {
56 return data[i];
57 }
58 const data_t &operator[](size_t i) const {
59 return data[i];
60 }
61 bool operator>(const ARTKey &k) const;
62 bool operator<(const ARTKey &k) const;
63 bool operator>=(const ARTKey &k) const;
64 bool operator==(const ARTKey &k) const;
65
66 inline bool ByteMatches(const ARTKey &other, const uint32_t &depth) const {
67 return data[depth] == other[depth];
68 }
69 inline bool Empty() const {
70 return len == 0;
71 }
72 void ConcatenateARTKey(ArenaAllocator &allocator, ARTKey &concat_key);
73
74private:
75 template <class T>
76 static inline data_ptr_t CreateData(ArenaAllocator &allocator, T value) {
77 auto data = allocator.Allocate(size: sizeof(value));
78 Radix::EncodeData<T>(data, value);
79 return data;
80 }
81};
82
83template <>
84ARTKey ARTKey::CreateARTKey(ArenaAllocator &allocator, const LogicalType &type, string_t value);
85template <>
86ARTKey ARTKey::CreateARTKey(ArenaAllocator &allocator, const LogicalType &type, const char *value);
87template <>
88void ARTKey::CreateARTKey(ArenaAllocator &allocator, const LogicalType &type, ARTKey &key, string_t value);
89} // namespace duckdb
90