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