userver: userver/ydb/table.hpp Source File
Loading...
Searching...
No Matches
table.hpp
1#pragma once
2
3#include <ydb-cpp-sdk/client/table/table.h>
4
5#include <userver/dynamic_config/source.hpp>
6#include <userver/utils/statistics/fwd.hpp>
7
8#include <userver/ydb/builder.hpp>
9#include <userver/ydb/query.hpp>
10#include <userver/ydb/response.hpp>
11#include <userver/ydb/settings.hpp>
12#include <userver/ydb/transaction.hpp>
13
14namespace NMonitoring {
15class TMetricRegistry;
16} // namespace NMonitoring
17
18USERVER_NAMESPACE_BEGIN
19
20namespace tracing {
21class Span;
22} // namespace tracing
23
24namespace utils {
25class RetryBudget;
26} // namespace utils
27
28namespace ydb {
29
30namespace impl {
31struct Stats;
32struct TableSettings;
33class Driver;
34struct RequestContext;
35enum class IsStreaming : bool {};
36} // namespace impl
37
38using ScanQuerySettings = NYdb::NTable::TStreamExecScanQuerySettings;
39
40class TableClient final {
41 public:
42 /// @cond
43 // For internal use only.
44 TableClient(impl::TableSettings settings,
45 OperationSettings operation_settings,
46 dynamic_config::Source config_source,
47 std::shared_ptr<impl::Driver> driver);
48
49 ~TableClient();
50 /// @endcond
51
52 /// Query for creating/deleting tables
53 void ExecuteSchemeQuery(const std::string& query);
54
55 void MakeDirectory(const std::string& path);
56 void RemoveDirectory(const std::string& path);
57
58 NYdb::NScheme::TDescribePathResult DescribePath(std::string_view path);
59 NYdb::NScheme::TListDirectoryResult ListDirectory(std::string_view path);
60
61 NYdb::NTable::TDescribeTableResult DescribeTable(std::string_view path);
62 void CreateTable(std::string_view path,
63 NYdb::NTable::TTableDescription&& table_desc);
64 void DropTable(std::string_view path);
65
66 /// @name Data queries execution
67 /// Execute a single data query outside of transactions. Query parameters are
68 /// passed in `Args` as "string key - value" pairs:
69 ///
70 /// @code
71 /// client.ExecuteDataQuery(query, "name1", value1, "name2", value2, ...);
72 /// @endcode
73 ///
74 /// Use ydb::PreparedArgsBuilder for storing a generic buffer of query params
75 /// if needed.
76 ///
77 /// @{
78 template <typename... Args>
79 ExecuteResponse ExecuteDataQuery(const Query& query, Args&&... args);
80
81 template <typename... Args>
82 ExecuteResponse ExecuteDataQuery(OperationSettings settings,
83 const Query& query, Args&&... args);
84
85 ExecuteResponse ExecuteDataQuery(OperationSettings settings,
86 const Query& query,
87 PreparedArgsBuilder&& builder);
88
89 ExecuteResponse ExecuteDataQuery(QuerySettings query_settings,
90 OperationSettings settings,
91 const Query& query,
92 PreparedArgsBuilder&& builder);
93 /// @}
94
95 /// @name Transactions
96 /// @brief Begin a transaction with the specified name. The settings are used
97 /// for the `BEGIN` statement.
98 /// @see ydb::Transaction
99 ///
100 /// @{
101 Transaction Begin(std::string transaction_name,
102 OperationSettings settings = {});
103
104 Transaction Begin(std::string transaction_name, TransactionMode tx_mode);
105 /// @}
106
107 /// Builder for storing dynamic query params.
108 PreparedArgsBuilder GetBuilder() const;
109
110 /// Efficiently write large ranges of table data.
111 void BulkUpsert(std::string_view table, NYdb::TValue&& rows,
112 OperationSettings settings = {});
113
114 /// Efficiently write large ranges of table data.
115 /// The passed range of structs is serialized to TValue.
116 template <typename RangeOfStructs>
117 void BulkUpsert(std::string_view table, const RangeOfStructs& rows,
118 OperationSettings settings = {});
119
120 /// Efficiently read large ranges of table data.
121 ReadTableResults ReadTable(
122 std::string_view table,
123 NYdb::NTable::TReadTableSettings&& read_settings = {},
124 OperationSettings settings = {});
125
126 /// @name Scan queries execution
127 /// A separate data access interface designed primarily for performing
128 /// analytical ad-hoc queries.
129 /// @{
130 template <typename... Args>
131 ScanQueryResults ExecuteScanQuery(const Query& query, Args&&... args);
132
133 template <typename... Args>
134 ScanQueryResults ExecuteScanQuery(ScanQuerySettings&& scan_settings,
135 OperationSettings settings,
136 const Query& query, Args&&... args);
137
138 ScanQueryResults ExecuteScanQuery(ScanQuerySettings&& scan_settings,
139 OperationSettings settings,
140 const Query& query,
141 PreparedArgsBuilder&& builder);
142 /// @}
143
144 /// @cond
145 // For internal use only.
146 friend void DumpMetric(utils::statistics::Writer& writer,
147 const TableClient& table_client);
148 /// @endcond
149
150 /// Get native table client
151 /// @warning Use with care! Facilities from
152 /// `<core/include/userver/drivers/subscribable_futures.hpp>` can help with
153 /// non-blocking wait operations.
155
156 utils::RetryBudget& GetRetryBudget();
157
158 private:
159 friend class Transaction;
160 friend struct impl::RequestContext;
161
162 std::string JoinDbPath(std::string_view path) const;
163
164 void Select1();
165
166 NYdb::NTable::TExecDataQuerySettings ToExecQuerySettings(
167 QuerySettings query_settings) const;
168
169 template <typename... Args>
170 PreparedArgsBuilder MakeBuilder(Args&&... args);
171
172 // Func: (TSession, const std::string& full_path, const Settings&)
173 // -> NThreading::TFuture<T>
174 // OR
175 // (TTableClient&, const std::string& full_path, const Settings&)
176 // -> NThreading::TFuture<T>
177 // ExecuteSchemeQueryImpl -> T
178 template <typename Settings, typename Func>
179 auto ExecuteWithPathImpl(std::string_view path,
180 std::string_view operation_name,
181 OperationSettings&& settings, Func&& func);
182
183 dynamic_config::Source config_source_;
184 const OperationSettings default_settings_;
185 const bool keep_in_query_cache_;
186 std::unique_ptr<impl::Stats> stats_;
187 std::shared_ptr<impl::Driver> driver_;
188 std::unique_ptr<NYdb::NScheme::TSchemeClient> scheme_client_;
189 std::unique_ptr<NYdb::NTable::TTableClient> table_client_;
190};
191
192template <typename... Args>
193PreparedArgsBuilder TableClient::MakeBuilder(Args&&... args) {
194 auto builder = GetBuilder();
195 builder.AddParams(std::forward<Args>(args)...);
196 return builder;
197}
198
199template <typename... Args>
200ExecuteResponse TableClient::ExecuteDataQuery(const Query& query,
201 Args&&... args) {
202 return ExecuteDataQuery(OperationSettings{}, query,
203 MakeBuilder(std::forward<Args>(args)...));
204}
205
206template <typename... Args>
207ExecuteResponse TableClient::ExecuteDataQuery(OperationSettings settings,
208 const Query& query,
209 Args&&... args) {
210 return ExecuteDataQuery(settings, query,
211 MakeBuilder(std::forward<Args>(args)...));
212}
213
214template <typename RangeOfStructs>
215void TableClient::BulkUpsert(std::string_view table, const RangeOfStructs& rows,
216 OperationSettings settings) {
217 NYdb::TValueBuilder builder;
218 ydb::Write(builder, rows);
219 BulkUpsert(table, builder.Build(), std::move(settings));
220}
221
222template <typename... Args>
223ScanQueryResults TableClient::ExecuteScanQuery(const Query& query,
224 Args&&... args) {
225 return ExecuteScanQuery(ScanQuerySettings{}, OperationSettings{}, query,
226 MakeBuilder(std::forward<Args>(args)...));
227}
228
229template <typename... Args>
230ScanQueryResults TableClient::ExecuteScanQuery(
231 ScanQuerySettings&& scan_settings, OperationSettings settings,
232 const Query& query, Args&&... args) {
233 return ExecuteScanQuery(std::move(scan_settings), std::move(settings), query,
234 MakeBuilder(std::forward<Args>(args)...));
235}
236
237} // namespace ydb
238
239USERVER_NAMESPACE_END