@@ -27,12 +27,12 @@ using TExec = arrow::Status(*)(arrow::compute::KernelContext*, const arrow::comp
27
27
28
28
class TUdfKernelState : public arrow ::compute::KernelState {
29
29
public:
30
- TUdfKernelState (const TVector<const TType*>& argTypes, const TType* outputType, bool onlyScalars, const ITypeInfoHelper* typeInfoHelper, const IPgBuilder& pgBuilder )
30
+ TUdfKernelState (const TVector<const TType*>& argTypes, const TType* outputType, bool onlyScalars, const ITypeInfoHelper* typeInfoHelper, const IValueBuilder* valueBuilder )
31
31
: ArgTypes_(argTypes)
32
32
, OutputType_(outputType)
33
33
, OnlyScalars_(onlyScalars)
34
34
, TypeInfoHelper_(typeInfoHelper)
35
- , PgBuilder_(pgBuilder )
35
+ , ValueBuilder_(valueBuilder )
36
36
{
37
37
Readers_.resize (ArgTypes_.size ());
38
38
}
@@ -48,7 +48,7 @@ class TUdfKernelState : public arrow::compute::KernelState {
48
48
IArrayBuilder& GetArrayBuilder () {
49
49
Y_ENSURE (!OnlyScalars_);
50
50
if (!ArrayBuilder_) {
51
- ArrayBuilder_ = MakeArrayBuilder (*TypeInfoHelper_, OutputType_, *GetYqlMemoryPool (), TypeInfoHelper_->GetMaxBlockLength (OutputType_), &PgBuilder_ );
51
+ ArrayBuilder_ = MakeArrayBuilder (*TypeInfoHelper_, OutputType_, *GetYqlMemoryPool (), TypeInfoHelper_->GetMaxBlockLength (OutputType_), &ValueBuilder_-> GetPgBuilder () );
52
52
}
53
53
54
54
return *ArrayBuilder_;
@@ -62,13 +62,18 @@ class TUdfKernelState : public arrow::compute::KernelState {
62
62
63
63
return *ScalarBuilder_;
64
64
}
65
+
66
+ const IValueBuilder& GetValueBuilder () {
67
+ Y_ENSURE (ValueBuilder_);
68
+ return *ValueBuilder_;
69
+ }
65
70
66
71
private:
67
72
const TVector<const TType*> ArgTypes_;
68
73
const TType* OutputType_;
69
74
const bool OnlyScalars_;
70
75
const ITypeInfoHelper* TypeInfoHelper_;
71
- const IPgBuilder& PgBuilder_;
76
+ const IValueBuilder* ValueBuilder_;
72
77
TVector<std::unique_ptr<IBlockReader>> Readers_;
73
78
std::unique_ptr<IArrayBuilder> ArrayBuilder_;
74
79
std::unique_ptr<IScalarBuilder> ScalarBuilder_;
@@ -157,7 +162,7 @@ class TSimpleArrowUdfImpl : public TBoxedValue {
157
162
}
158
163
}
159
164
160
- TUdfKernelState kernelState (ArgTypes_, OutputType_, OnlyScalars_, TypeInfoHelper_.Get (), valueBuilder-> GetPgBuilder () );
165
+ TUdfKernelState kernelState (ArgTypes_, OutputType_, OnlyScalars_, TypeInfoHelper_.Get (), valueBuilder);
161
166
arrow::compute::ExecContext execContext (GetYqlMemoryPool ());
162
167
arrow::compute::KernelContext kernelContext (&execContext);
163
168
kernelContext.SetState (&kernelState);
@@ -351,7 +356,8 @@ TReader* CastToBlockReaderImpl(IBlockReader& reader) {
351
356
352
357
template <typename TDerived, typename TReader = IBlockReader, typename TArrayBuilderImpl = IArrayBuilder, typename TScalarBuilderImpl = IScalarBuilder>
353
358
struct TUnaryKernelExec {
354
- static arrow::Status Do (arrow::compute::KernelContext* ctx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
359
+
360
+ static arrow::Status Do (arrow::compute::KernelContext* ctx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
355
361
auto & state = dynamic_cast <TUdfKernelState&>(*ctx->state ());
356
362
auto & reader = state.GetReader (0 );
357
363
auto * readerImpl = CastToBlockReaderImpl<TReader>(reader);
@@ -362,9 +368,10 @@ struct TUnaryKernelExec {
362
368
auto * builderImpl = CastToScalarBuilderImpl<TScalarBuilderImpl>(builder);
363
369
364
370
auto item = readerImpl->GetScalarItem (*arg.scalar ());
365
- TDerived::Process (item, [&](TBlockItem out) {
371
+ auto sink = [&](auto out) {
366
372
*res = builderImpl->Build (out);
367
- });
373
+ };
374
+ TDerived::Process (item, state.GetValueBuilder (), sink);
368
375
}
369
376
else {
370
377
auto & array = *arg.array ();
@@ -377,9 +384,10 @@ struct TUnaryKernelExec {
377
384
for (int64_t i = 0 ; i < array.length ;) {
378
385
for (size_t j = 0 ; j < maxBlockLength && i < array.length ; ++j, ++i) {
379
386
auto item = readerImpl->GetItem (array, i);
380
- TDerived::Process (item, [&](TBlockItem out) {
387
+ auto sink = [&](auto out) {
381
388
builderImpl->Add (out);
382
- });
389
+ };
390
+ TDerived::Process (item, state.GetValueBuilder (), sink);
383
391
}
384
392
auto outputDatum = builderImpl->Build (false );
385
393
ForEachArrayData (outputDatum, [&](const auto & arr) { outputArrays.push_back (arr); });
@@ -411,9 +419,11 @@ struct TBinaryKernelExec {
411
419
412
420
auto item1 = reader1Impl->GetScalarItem (*arg1.scalar ());
413
421
auto item2 = reader2Impl->GetScalarItem (*arg2.scalar ());
414
- TDerived::Process (item1, item2, [&](TBlockItem out) {
422
+
423
+ auto sink = [&](TBlockItem out) {
415
424
*res = builderImpl->Build (out);
416
- });
425
+ };
426
+ TDerived::Process (item1, item2, state.GetValueBuilder (), sink);
417
427
}
418
428
else if (arg1.is_scalar () && arg2.is_array ()) {
419
429
auto item1 = reader1Impl->GetScalarItem (*arg1.scalar ());
@@ -427,9 +437,11 @@ struct TBinaryKernelExec {
427
437
for (int64_t i = 0 ; i < array2.length ;) {
428
438
for (size_t j = 0 ; j < maxBlockLength && i < array2.length ; ++j, ++i) {
429
439
auto item2 = reader2Impl->GetItem (array2, i);
430
- TDerived::Process (item1, item2, [&](TBlockItem out) {
440
+
441
+ auto sink = [&](TBlockItem out) {
431
442
builderImpl->Add (out);
432
- });
443
+ };
444
+ TDerived::Process (item1, item2, state.GetValueBuilder (), sink);
433
445
}
434
446
auto outputDatum = builder.Build (false );
435
447
ForEachArrayData (outputDatum, [&](const auto & arr) { outputArrays.push_back (arr); });
@@ -448,9 +460,11 @@ struct TBinaryKernelExec {
448
460
for (int64_t i = 0 ; i < array1.length ;) {
449
461
for (size_t j = 0 ; j < maxBlockLength && i < array1.length ; ++j, ++i) {
450
462
auto item1 = reader1Impl->GetItem (array1, i);
451
- TDerived::Process (item1, item2, [&](TBlockItem out) {
463
+
464
+ auto sink = [&](TBlockItem out) {
452
465
builderImpl->Add (out);
453
- });
466
+ };
467
+ TDerived::Process (item1, item2, state.GetValueBuilder (), sink);
454
468
}
455
469
auto outputDatum = builder.Build (false );
456
470
ForEachArrayData (outputDatum, [&](const auto & arr) { outputArrays.push_back (arr); });
@@ -470,11 +484,13 @@ struct TBinaryKernelExec {
470
484
Y_ENSURE (array1.length == array2.length );
471
485
for (int64_t i = 0 ; i < array1.length ;) {
472
486
for (size_t j = 0 ; j < maxBlockLength && i < array1.length ; ++j, ++i) {
473
- auto item1 = reader1.GetItem (array1, i);
474
- auto item2 = reader2.GetItem (array2, i);
475
- TDerived::Process (item1, item2, [&](TBlockItem out) {
487
+ auto item1 = reader1Impl->GetItem (array1, i);
488
+ auto item2 = reader2Impl->GetItem (array2, i);
489
+
490
+ auto sink = [&](TBlockItem out) {
476
491
builderImpl->Add (out);
477
- });
492
+ };
493
+ TDerived::Process (item1, item2, state.GetValueBuilder (), sink);
478
494
}
479
495
auto outputDatum = builder.Build (false );
480
496
ForEachArrayData (outputDatum, [&](const auto & arr) { outputArrays.push_back (arr); });
@@ -529,9 +545,11 @@ struct TGenericKernelExec {
529
545
auto & reader = state.GetReader (k);
530
546
args[k] = reader.GetScalarItem (*batch[k].scalar ());
531
547
}
532
- TDerived::Process (items, [&](TBlockItem out) {
548
+
549
+ auto sink = [&](TBlockItem out) {
533
550
*res = builderImpl->Build (out);
534
- });
551
+ };
552
+ TDerived::Process (items, state.GetValueBuilder (), sink);
535
553
} else {
536
554
auto & builder = state.GetArrayBuilder ();
537
555
auto * builderImpl = CastToArrayBuilderImpl<TArrayBuilderImpl>(builder);
@@ -559,9 +577,11 @@ struct TGenericKernelExec {
559
577
560
578
args[k] = reader.GetItem (*batch[k].array (), i);
561
579
}
562
- TDerived::Process (items, [&](TBlockItem out) {
580
+
581
+ auto sink = [&](TBlockItem out) {
563
582
builderImpl->Add (out);
564
- });
583
+ };
584
+ TDerived::Process (items, state.GetValueBuilder (), sink);
565
585
}
566
586
auto outputDatum = builderImpl->Build (false );
567
587
ForEachArrayData (outputDatum, [&](const auto & arr) { outputArrays.push_back (arr); });
0 commit comments