1- #include " typed_local.h"
2- #include " query_executor.h"
31#include " get_value.h"
2+ #include " query_executor.h"
3+ #include " typed_local.h"
4+
5+ #include < ydb/core/formats/arrow/arrow_helpers.h>
6+ #include < ydb/core/grpc_services/base/base.h>
7+ #include < ydb/core/grpc_services/local_rpc/local_rpc.h>
8+
9+ #include < ydb/public/api/protos/ydb_table.pb.h>
410
511namespace NKikimr ::NKqp {
612
@@ -37,8 +43,8 @@ TString TTypedLocalHelper::GetMultiColumnTestTableSchema(ui32 reps) const {
3743 return result;
3844}
3945
40- void TTypedLocalHelper::CreateMultiColumnOlapTableWithStore (ui32 reps, ui32 storeShardsCount, ui32 tableShardsCount) {
41- CreateSchemaOlapTablesWithStore (GetMultiColumnTestTableSchema (reps), {TableName}, " olapStore" , storeShardsCount, tableShardsCount);
46+ void TTypedLocalHelper::CreateMultiColumnOlapTableWithStore (ui32 reps, ui32 storeShardsCount, ui32 tableShardsCount) {
47+ CreateSchemaOlapTablesWithStore (GetMultiColumnTestTableSchema (reps), { TableName }, " olapStore" , storeShardsCount, tableShardsCount);
4248}
4349
4450void TTypedLocalHelper::ExecuteSchemeQuery (const TString& alterQuery, const NYdb::EStatus expectedStatus /* = EStatus::SUCCESS*/ ) const {
@@ -69,7 +75,8 @@ void TTypedLocalHelper::PrintCount() {
6975}
7076
7177NKikimr::NKqp::TTypedLocalHelper::TDistribution TTypedLocalHelper::GetDistribution (const bool verbose /* = false*/ ) {
72- const TString selectQuery = " PRAGMA Kikimr.OptUseFinalizeByKey='true';SELECT COUNT(*) as c, field FROM `" + TablePath + " ` GROUP BY field ORDER BY field" ;
78+ const TString selectQuery =
79+ " PRAGMA Kikimr.OptUseFinalizeByKey='true';SELECT COUNT(*) as c, field FROM `" + TablePath + " ` GROUP BY field ORDER BY field" ;
7380
7481 auto tableClient = KikimrRunner.GetTableClient ();
7582 auto rows = ExecuteScanQuery (tableClient, selectQuery, verbose);
@@ -101,7 +108,8 @@ NKikimr::NKqp::TTypedLocalHelper::TDistribution TTypedLocalHelper::GetDistributi
101108 return TDistribution (count, *minCount, *maxCount, groups.size ());
102109}
103110
104- void TTypedLocalHelper::GetVolumes (ui64& rawBytes, ui64& bytes, const bool verbose /* = false*/ , const std::vector<TString> columnNames /* = {}*/ ) {
111+ void TTypedLocalHelper::GetVolumes (
112+ ui64& rawBytes, ui64& bytes, const bool verbose /* = false*/ , const std::vector<TString> columnNames /* = {}*/ ) {
105113 TString selectQuery = " SELECT * FROM `" + TablePath + " /.sys/primary_index_stats` WHERE Activity == 1" ;
106114 if (columnNames.size ()) {
107115 selectQuery += " AND EntityName IN ('" + JoinSeq (" ','" , columnNames) + " ')" ;
@@ -160,7 +168,9 @@ void TTypedLocalHelper::GetCount(ui64& count) {
160168
161169void TTypedLocalHelper::FillPKOnly (const double pkKff /* = 0*/ , const ui32 numRows /* = 800000*/ ) const {
162170 std::vector<NArrow::NConstruction::IArrayBuilder::TPtr> builders;
163- builders.emplace_back (NArrow::NConstruction::TSimpleArrayConstructor<NArrow::NConstruction::TIntSeqFiller<arrow::Int64Type>>::BuildNotNullable (" pk_int" , numRows * pkKff));
171+ builders.emplace_back (
172+ NArrow::NConstruction::TSimpleArrayConstructor<NArrow::NConstruction::TIntSeqFiller<arrow::Int64Type>>::BuildNotNullable (
173+ " pk_int" , numRows * pkKff));
164174 NArrow::NConstruction::TRecordBatchConstructor batchBuilder (builders);
165175 std::shared_ptr<arrow::RecordBatch> batch = batchBuilder.BuildBatch (numRows);
166176 TBase::SendDataViaActorSystem (TablePath, batch);
@@ -181,4 +191,47 @@ void TTypedLocalHelper::GetStats(std::vector<NJson::TJsonValue>& stats, const bo
181191 }
182192}
183193
184- }
194+ void TTypedLocalHelper::TWritingGuard::SendDataViaActorSystem (TString testTable, std::shared_ptr<arrow::RecordBatch> batch,
195+ const Ydb::StatusIds_StatusCode expectedStatus /* = = Ydb::StatusIds::SUCCESS*/ ) const {
196+ auto * runtime = KikimrRunner.GetTestServer ().GetRuntime ();
197+
198+ UNIT_ASSERT (batch);
199+ UNIT_ASSERT (batch->num_rows ());
200+ auto data = NArrow::SerializeBatchNoCompression (batch);
201+ UNIT_ASSERT (!data.empty ());
202+ TString serializedSchema = NArrow::SerializeSchema (*batch->schema ());
203+ UNIT_ASSERT (serializedSchema);
204+
205+ Ydb::Table::BulkUpsertRequest request;
206+ request.mutable_arrow_batch_settings ()->set_schema (serializedSchema);
207+ request.set_data (data);
208+ request.set_table (testTable);
209+
210+ using TEvBulkUpsertRequest = NGRpcService::TGrpcRequestOperationCall<Ydb::Table::BulkUpsertRequest, Ydb::Table::BulkUpsertResponse>;
211+ auto future = NRpcService::DoLocalRpc<TEvBulkUpsertRequest>(std::move (request), " " , " " , runtime->GetActorSystem (0 ));
212+ Responses.fetch_add (1 );
213+ auto * responsesLocal = &Responses;
214+ future.Subscribe ([responsesLocal, expectedStatus](const NThreading::TFuture<Ydb::Table::BulkUpsertResponse> f) mutable {
215+ responsesLocal->fetch_add (-1 );
216+ auto op = f.GetValueSync ().operation ();
217+ if (op.status () != Ydb::StatusIds::SUCCESS) {
218+ for (auto & issue : op.issues ()) {
219+ Cerr << issue.message () << " " ;
220+ }
221+ Cerr << " \n " ;
222+ }
223+ UNIT_ASSERT_VALUES_EQUAL (op.status (), expectedStatus);
224+ });
225+ }
226+
227+ void TTypedLocalHelper::TWritingGuard::WaitWritings () {
228+ auto * runtime = KikimrRunner.GetTestServer ().GetRuntime ();
229+ TDispatchOptions options;
230+ options.CustomFinalCondition = [&]() {
231+ return Responses.load () == 0 ;
232+ };
233+
234+ runtime->DispatchEvents (options);
235+ }
236+
237+ } // namespace NKikimr::NKqp
0 commit comments