Skip to content

Commit 8634552

Browse files
committed
custom_aggregator comparator, sort by categories
1 parent 471716b commit 8634552

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

src/dataframe/impl/data_source.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,8 @@ data_source::final_info::final_info(const data_source &source) :
552552
for (std::size_t d{}; d < dimensions; ++d) {
553553
auto val = source.dimensions[d].values[r];
554554
record +=
555-
source.dimension_names[d] + ':'
555+
source.dimension_names[d] + '['
556+
+ std::to_string(static_cast<int32_t>(val)) + "]:"
556557
+ (val == nav ? "null"
557558
: source.dimensions[d].categories[val])
558559
+ ";";

src/dataframe/impl/dataframe.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,9 @@ void dataframe::set_sort(series_identifier series,
159159
case dimension: {
160160
std::optional<std::vector<std::uint32_t>> indices;
161161
if (const auto &dim = unsafe_get<dimension>(ser).second;
162-
std::ranges::is_sorted(
163-
indices.emplace(dim.get_indices(sort)))
162+
((sort_ptr && *sort_ptr == sort_type::by_categories)
163+
|| std::ranges::is_sorted(
164+
indices.emplace(dim.get_indices(sort))))
164165
&& (na_pos == dim.na_pos || !dim.contains_nav))
165166
break;
166167

@@ -180,12 +181,16 @@ void dataframe::set_sort(series_identifier series,
180181
throw std::runtime_error(
181182
"Measure series cannot be sorted by categories.");
182183
switch (*sort_ptr) {
184+
default:
183185
case sort_type::less:
184186
case sort_type::greater: break;
185187
case sort_type::natural_less:
186188
case sort_type::natural_greater:
187189
throw std::runtime_error(
188190
"Measure series cannot be sorted by natural order.");
191+
case sort_type::by_categories:
192+
throw std::runtime_error(
193+
"Measure series cannot be sorted by categories.");
189194
}
190195
break;
191196
}

src/dataframe/interface.h

+22-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,13 @@ enum class aggregator_type {
2424
exists
2525
};
2626

27-
enum class sort_type { less, greater, natural_less, natural_greater };
27+
enum class sort_type {
28+
less,
29+
greater,
30+
natural_less,
31+
natural_greater,
32+
by_categories
33+
};
2834

2935
enum class na_position { last, first };
3036

@@ -47,6 +53,21 @@ struct custom_aggregator
4753
{
4854
return std::visit<std::string_view>(std::identity{}, name);
4955
}
56+
57+
auto operator<=>(const custom_aggregator &oth) const
58+
{
59+
return get_name() <=> oth.get_name();
60+
}
61+
62+
auto operator!=(const custom_aggregator &oth) const
63+
{
64+
return get_name() != oth.get_name();
65+
}
66+
67+
auto operator==(const custom_aggregator &oth) const
68+
{
69+
return get_name() == oth.get_name();
70+
}
5071
};
5172

5273
class dataframe_interface :

0 commit comments

Comments
 (0)