@@ -427,28 +427,30 @@ DataType MeanAggregatorData::get_output_data_type() {
427
427
void MeanAggregatorData::aggregate (const ColumnWithStrings& input_column, const std::vector<size_t >& groups, size_t unique_values) {
428
428
fractions_.resize (unique_values);
429
429
sparse_map_.resize (unique_values);
430
- details::visit_type (input_column.column_ ->type ().data_type (), [&input_column, &groups, this ] (auto col_tag) {
430
+ util::BitSet::bulk_insert_iterator inserter (sparse_map_);
431
+ details::visit_type (input_column.column_ ->type ().data_type (), [&input_column, &groups, &inserter, this ] (auto col_tag) {
431
432
using col_type_info = ScalarTypeInfo<decltype (col_tag)>;
432
433
if constexpr (is_sequence_type (col_type_info::data_type)) {
433
434
util::raise_rte (" String aggregations not currently supported" );
434
435
} else if constexpr (is_empty_type (col_type_info::data_type)) {
435
436
return ;
436
437
}
437
- Column::for_each_enumerated<typename col_type_info::TDT>(*input_column.column_ , [&groups, this ](auto enumerating_it) {
438
+ Column::for_each_enumerated<typename col_type_info::TDT>(*input_column.column_ , [&groups, &inserter, this ](auto enumerating_it) {
438
439
auto & fraction = fractions_[groups[enumerating_it.idx ()]];
439
440
if constexpr ((is_floating_point_type (col_type_info ::data_type))) {
440
441
if (ARCTICDB_LIKELY (!std::isnan (enumerating_it.value ()))) {
441
442
fraction.numerator_ += static_cast <double >(enumerating_it.value ());
442
443
++fraction.denominator_ ;
443
- sparse_map_. set ( groups[enumerating_it.idx ()]) ;
444
+ inserter = groups[enumerating_it.idx ()];
444
445
}
445
446
} else {
446
447
fraction.numerator_ += static_cast <double >(enumerating_it.value ());
447
448
++fraction.denominator_ ;
448
- sparse_map_. set ( groups[enumerating_it.idx ()]) ;
449
+ inserter = groups[enumerating_it.idx ()];
449
450
}
450
451
});
451
452
});
453
+ inserter.flush ();
452
454
}
453
455
454
456
SegmentInMemory MeanAggregatorData::finalize (const ColumnName& output_column_name, bool , size_t unique_values) {
@@ -492,22 +494,24 @@ std::optional<Value> MeanAggregatorData::get_default_value() {
492
494
void CountAggregatorData::aggregate (const ColumnWithStrings& input_column, const std::vector<size_t >& groups, size_t unique_values) {
493
495
aggregated_.resize (unique_values);
494
496
sparse_map_.resize (unique_values);
495
- details::visit_type (input_column.column_ ->type ().data_type (), [&input_column, &groups, this ] (auto col_tag) {
497
+ util::BitSet::bulk_insert_iterator inserter (sparse_map_);
498
+ details::visit_type (input_column.column_ ->type ().data_type (), [&input_column, &groups, &inserter, this ] (auto col_tag) {
496
499
using col_type_info = ScalarTypeInfo<decltype (col_tag)>;
497
- Column::for_each_enumerated<typename col_type_info::TDT>(*input_column.column_ , [&groups, this ](auto enumerating_it) {
500
+ Column::for_each_enumerated<typename col_type_info::TDT>(*input_column.column_ , [&groups, &inserter, this ](auto enumerating_it) {
498
501
if constexpr (is_floating_point_type (col_type_info::data_type)) {
499
502
if (ARCTICDB_LIKELY (!std::isnan (enumerating_it.value ()))) {
500
503
auto & val = aggregated_[groups[enumerating_it.idx ()]];
501
504
++val;
502
- sparse_map_. set ( groups[enumerating_it.idx ()]) ;
505
+ inserter = groups[enumerating_it.idx ()];
503
506
}
504
507
} else {
505
508
auto & val = aggregated_[groups[enumerating_it.idx ()]];
506
509
++val;
507
- sparse_map_. set ( groups[enumerating_it.idx ()]) ;
510
+ inserter = groups[enumerating_it.idx ()];
508
511
}
509
512
});
510
513
});
514
+ inserter.flush ();
511
515
}
512
516
513
517
SegmentInMemory CountAggregatorData::finalize (const ColumnName& output_column_name, bool , size_t unique_values) {
@@ -551,9 +555,10 @@ void FirstAggregatorData::aggregate(const ColumnWithStrings& input_column, const
551
555
using GlobalRawType = typename GlobalTypeDescriptorTag::DataTypeTag::raw_type;
552
556
aggregated_.resize (sizeof (GlobalRawType)* unique_values);
553
557
sparse_map_.resize (unique_values);
558
+ util::BitSet::bulk_insert_iterator inserter (sparse_map_);
554
559
auto col_data = input_column.column_ ->data ();
555
560
auto out_ptr = reinterpret_cast <GlobalRawType*>(aggregated_.data ());
556
- details::visit_type (input_column.column_ ->type ().data_type (), [this , &groups, &out_ptr, &col_data] (auto col_tag) {
561
+ details::visit_type (input_column.column_ ->type ().data_type (), [this , &groups, &out_ptr, &col_data, &inserter ] (auto col_tag) {
557
562
using ColumnTagType = std::decay_t <decltype (col_tag)>;
558
563
using ColumnType = typename ColumnTagType::raw_type;
559
564
auto groups_pos = 0 ;
@@ -566,18 +571,19 @@ void FirstAggregatorData::aggregate(const ColumnWithStrings& input_column, const
566
571
if (is_first_group_el || std::isnan (static_cast <ColumnType>(val))) {
567
572
groups_cache_.insert (groups[groups_pos]);
568
573
val = GlobalRawType (*ptr);
569
- sparse_map_. set ( groups[groups_pos]) ;
574
+ inserter = groups[groups_pos];
570
575
}
571
576
} else {
572
577
if (is_first_group_el) {
573
578
groups_cache_.insert (groups[groups_pos]);
574
579
val = GlobalRawType (*ptr);
575
- sparse_map_. set ( groups[groups_pos]) ;
580
+ inserter = groups[groups_pos];
576
581
}
577
582
}
578
583
}
579
584
}
580
585
});
586
+ inserter.flush ();
581
587
});
582
588
}
583
589
}
@@ -625,9 +631,10 @@ void LastAggregatorData::aggregate(const ColumnWithStrings& input_column, const
625
631
using GlobalRawType = typename GlobalTypeDescriptorTag::DataTypeTag::raw_type;
626
632
aggregated_.resize (sizeof (GlobalRawType)* unique_values);
627
633
sparse_map_.resize (unique_values);
634
+ util::BitSet::bulk_insert_iterator inserter (sparse_map_);
628
635
auto col_data = input_column.column_ ->data ();
629
636
auto out_ptr = reinterpret_cast <GlobalRawType*>(aggregated_.data ());
630
- details::visit_type (input_column.column_ ->type ().data_type (), [&groups, &out_ptr, &col_data, this ] (auto col_tag) {
637
+ details::visit_type (input_column.column_ ->type ().data_type (), [&groups, &out_ptr, &col_data, &inserter, this ] (auto col_tag) {
631
638
using ColumnTagType = std::decay_t <decltype (col_tag)>;
632
639
using ColumnType = typename ColumnTagType::raw_type;
633
640
auto groups_pos = 0 ;
@@ -641,15 +648,16 @@ void LastAggregatorData::aggregate(const ColumnWithStrings& input_column, const
641
648
if (is_first_group_el || !std::isnan (static_cast <ColumnType>(curr))) {
642
649
groups_cache_.insert (groups[groups_pos]);
643
650
val = curr;
644
- sparse_map_. set ( groups[groups_pos]) ;
651
+ inserter = groups[groups_pos];
645
652
}
646
653
} else {
647
654
val = GlobalRawType (*ptr);
648
- sparse_map_. set ( groups[groups_pos]) ;
655
+ inserter = groups[groups_pos];
649
656
}
650
657
}
651
658
}
652
659
});
660
+ inserter.flush ();
653
661
});
654
662
}
655
663
}
0 commit comments