@@ -35,7 +35,7 @@ using arrow::internal::TDigestScalerK1;
3535using arrow::internal::VisitSetBitRunsVoid;
3636
3737struct TDigestBaseImpl : public ScalarAggregator {
38- explicit TDigestBaseImpl (std::unique_ptr <TDigest::Scaler> scaler, uint32_t buffer_size)
38+ explicit TDigestBaseImpl (std::shared_ptr <TDigest::Scaler> scaler, uint32_t buffer_size)
3939 : tdigest{std::move (scaler), buffer_size}, count{0 }, all_valid{true } {
4040 out_type = struct_ ({
4141 field (" mean" , list (field (" item" , float64 (), false )), false ),
@@ -57,7 +57,7 @@ struct TDigestBaseImpl : public ScalarAggregator {
5757 return Status::OK ();
5858 }
5959
60- static Result<std::unique_ptr <TDigest::Scaler>> MakeScaler (
60+ static Result<std::shared_ptr <TDigest::Scaler>> MakeScaler (
6161 TDigestOptions::Scaler scaler, uint32_t delta) {
6262 switch (scaler) {
6363 case TDigestOptions::K0:
@@ -288,7 +288,7 @@ struct TDigestImpl
288288 // using TDigestBaseImpl::tdigest;
289289
290290 explicit TDigestImpl (const TDigestOptions& options, const DataType& in_type,
291- std::unique_ptr <TDigest::Scaler> scaler)
291+ std::shared_ptr <TDigest::Scaler> scaler)
292292 : TDigestInputConsumerImpl<ArrowType, TDigestQuantileFinalizer>(
293293 // TDigestInputConsumerImpl
294294 options.skip_nulls, in_type,
@@ -302,7 +302,7 @@ template <typename ArrowType>
302302struct TDigestMapImpl
303303 : public TDigestInputConsumerImpl<ArrowType, TDigestCentroidFinalizer> {
304304 explicit TDigestMapImpl (const TDigestMapOptions& options, const DataType& in_type,
305- std::unique_ptr <TDigest::Scaler> scaler)
305+ std::shared_ptr <TDigest::Scaler> scaler)
306306 : TDigestInputConsumerImpl<ArrowType, TDigestCentroidFinalizer>(
307307
308308 // TDigestInputConsumerImpl
@@ -314,7 +314,7 @@ struct TDigestMapImpl
314314
315315struct TDigestReduceImpl : public TDigestCentroidConsumerImpl <TDigestCentroidFinalizer> {
316316 explicit TDigestReduceImpl (const TDigestReduceOptions& options,
317- std::unique_ptr <TDigest::Scaler> scaler)
317+ std::shared_ptr <TDigest::Scaler> scaler)
318318 : TDigestCentroidConsumerImpl<TDigestCentroidFinalizer>(
319319 // TDigestCentroidConsumerImpl
320320 // TDigestCentroidFinalizer
@@ -325,7 +325,7 @@ struct TDigestReduceImpl : public TDigestCentroidConsumerImpl<TDigestCentroidFin
325325struct TDigestQuantileImpl
326326 : public TDigestCentroidConsumerImpl<TDigestQuantileFinalizer> {
327327 explicit TDigestQuantileImpl (const TDigestQuantileOptions& options,
328- std::unique_ptr <TDigest::Scaler> scaler)
328+ std::shared_ptr <TDigest::Scaler> scaler)
329329 : TDigestCentroidConsumerImpl<TDigestQuantileFinalizer>(
330330
331331 // TDigestCentroidConsumerImpl
@@ -335,10 +335,10 @@ struct TDigestQuantileImpl
335335 std::move (scaler), options.delta) {}
336336};
337337
338- struct TDigestQuantileScalarImpl : public TDigestQuantileImpl {
338+ struct TDigestQuantileScalarImpl : public KernelState {
339339 explicit TDigestQuantileScalarImpl (const TDigestQuantileOptions& options,
340- std::unique_ptr <TDigest::Scaler> scaler)
341- : TDigestQuantileImpl (options, std::move(scaler)) {}
340+ std::shared_ptr <TDigest::Scaler> scaler)
341+ : options (options), scaler( std::move(scaler)) {}
342342
343343 static Result<std::unique_ptr<KernelState>> Init (KernelContext* ctx,
344344 const KernelInitArgs& args) {
@@ -354,33 +354,35 @@ struct TDigestQuantileScalarImpl : public TDigestQuantileImpl {
354354 return state->OutputType ();
355355 }
356356
357- size_t OutputSize () const { return this -> q .size (); }
357+ size_t OutputSize () const { return options. q .size (); }
358358
359359 TypeHolder OutputType () const {
360360 return fixed_size_list (field (" item" , float64 ()), OutputSize ());
361361 }
362362
363363 static Status Exec (KernelContext* ctx, const ExecSpan& batch, ExecResult* out) {
364364 auto state = checked_cast<TDigestQuantileScalarImpl*>(ctx->state ());
365+ TDigestQuantileImpl tdigest (state->options , state->scaler );
365366 auto value_builder = std::make_shared<DoubleBuilder>(ctx->memory_pool ());
366367 const auto output_size = state->OutputSize ();
367368 FixedSizeListBuilder fsl_builder (
368369 ctx->memory_pool (), checked_pointer_cast<arrow::ArrayBuilder>(value_builder),
369370 output_size);
370371
371372 std::shared_ptr<Array> array = MakeArray (batch[0 ].array .ToArrayData ());
373+
372374 for (int i = 0 ; i < array->length (); ++i) {
373375 if (array->IsValid (i)) {
374376 ARROW_RETURN_NOT_OK (fsl_builder.Append ());
375377 ARROW_ASSIGN_OR_RAISE (auto scalar, array->GetScalar (i));
376- state-> Reset ();
377- ARROW_RETURN_NOT_OK (state-> Consume (scalar.get ()));
378+ tdigest. Reset ();
379+ ARROW_RETURN_NOT_OK (tdigest. Consume (scalar.get ()));
378380
379- if (state-> isNull ()) {
381+ if (tdigest. isNull ()) {
380382 ARROW_RETURN_NOT_OK (value_builder->AppendNulls (output_size));
381383 } else {
382384 for (size_t i = 0 ; i < output_size; ++i) {
383- ARROW_RETURN_NOT_OK (value_builder->Append (state-> Quantile (i)));
385+ ARROW_RETURN_NOT_OK (value_builder->Append (tdigest. Quantile (i)));
384386 }
385387 }
386388 } else {
@@ -392,6 +394,10 @@ struct TDigestQuantileScalarImpl : public TDigestQuantileImpl {
392394 out->value = std::move (out_array->data ());
393395 return Status::OK ();
394396 }
397+
398+ private:
399+ TDigestQuantileOptions options;
400+ std::shared_ptr<TDigest::Scaler> scaler;
395401};
396402
397403template <template <typename > typename TDigestImpl_T, typename TDigestOptions_T>
0 commit comments