@@ -94,6 +94,24 @@ std::pair<std::vector<FieldReference>, SortIndiciesFieldsList> PreprocessAggrega
94
94
return {std::move (fields), {sort_indicies_aliases.begin (), sort_indicies_aliases.end ()}};
95
95
}
96
96
97
+ /* Separate fields into basic and sortable. The second vector contains flags indicating
98
+ whether the field at the same index in the first vector is sortable or not. */
99
+ std::pair<std::vector<FieldReference>, std::vector<bool >> GetBasicFields (
100
+ absl::Span<const std::string_view> fields, const search::Schema& schema) {
101
+ const size_t fields_count = fields.size ();
102
+ std::vector<bool > is_sortable_field (fields_count);
103
+ std::vector<FieldReference> basic_fields;
104
+ basic_fields.reserve (fields_count);
105
+ for (size_t i = 0 ; i < fields_count; ++i) {
106
+ bool is_sortable = IsSortableField (fields[i], schema);
107
+ is_sortable_field[i] = is_sortable;
108
+ if (!is_sortable) {
109
+ basic_fields.emplace_back (fields[i]);
110
+ }
111
+ }
112
+ return {std::move (basic_fields), std::move (is_sortable_field)};
113
+ }
114
+
97
115
} // namespace
98
116
99
117
bool FieldReference::IsJsonPath (std::string_view name) {
@@ -497,19 +515,8 @@ join::Vector<join::OwnedEntry> ShardDocIndex::PreagregateDataForJoin(
497
515
search::SearchAlgorithm* search_algo) const {
498
516
auto search_results = search_algo->Search (&*indices_);
499
517
500
- // First filter out sortable and non-sortable fields
501
- // We will load them in different ways
502
518
const size_t fields_count = join_fields.size ();
503
- std::vector<bool > is_sortable_field (fields_count);
504
- std::vector<FieldReference> basic_fields;
505
- basic_fields.reserve (fields_count);
506
- for (size_t i = 0 ; i < fields_count; ++i) {
507
- bool is_sortable = IsSortableField (join_fields[i], base_->schema );
508
- is_sortable_field[i] = is_sortable;
509
- if (!is_sortable) {
510
- basic_fields.emplace_back (join_fields[i]);
511
- }
512
- }
519
+ const auto [basic_fields, is_sortable_field] = GetBasicFields (join_fields, base_->schema );
513
520
514
521
join::Vector<join::OwnedEntry> result;
515
522
result.reserve (search_results.ids .size ());
@@ -561,16 +568,7 @@ ShardDocIndex::FieldsValuesPerDocId ShardDocIndex::LoadKeysData(
561
568
const OpArgs& op_args, const absl::flat_hash_set<search::DocId>& doc_ids,
562
569
absl::Span<const std::string_view> fields_to_load) const {
563
570
const size_t fields_count = fields_to_load.size ();
564
- std::vector<bool > is_sortable_field (fields_count);
565
- std::vector<FieldReference> basic_fields;
566
- basic_fields.reserve (fields_count);
567
- for (size_t i = 0 ; i < fields_count; ++i) {
568
- bool is_sortable = IsSortableField (fields_to_load[i], base_->schema );
569
- is_sortable_field[i] = is_sortable;
570
- if (!is_sortable) {
571
- basic_fields.emplace_back (fields_to_load[i]);
572
- }
573
- }
571
+ const auto [basic_fields, is_sortable_field] = GetBasicFields (fields_to_load, base_->schema );
574
572
575
573
FieldsValuesPerDocId result;
576
574
result.reserve (doc_ids.size ());
0 commit comments