11
11
#include < arcticdb/entity/type_utils.hpp>
12
12
13
13
namespace arcticdb {
14
+ // / @param convert_int_to_float This will convert all integer types (both signed and unsigned) to FLOAT64 without
15
+ // / performing any type checks. This is available only via the V1 Library API and is used by tick collectors. It can
16
+ // / be true only if descriptors are merged during a compact_incomplete call. Otherwise, it must be false.
14
17
StreamDescriptor merge_descriptors (
15
18
const StreamDescriptor &original,
16
19
std::span<const std::shared_ptr<FieldCollection>> entries,
17
- const std::unordered_set<std::string_view> &filtered_set,
18
- const std::optional<IndexDescriptorImpl>& default_index) {
20
+ const std::unordered_set<std::string_view>& filtered_set,
21
+ const std::optional<IndexDescriptorImpl>& default_index,
22
+ bool convert_int_to_float) {
19
23
using namespace arcticdb ::stream;
20
24
std::vector<std::string_view> merged_fields;
21
25
std::unordered_map<std::string_view, TypeDescriptor> merged_fields_map;
@@ -55,10 +59,10 @@ StreamDescriptor merge_descriptors(
55
59
);
56
60
}
57
61
58
- for (size_t idx = has_index ? 1u : 0u ; idx < static_cast < size_t >( fields->size () ); ++idx) {
62
+ for (size_t idx = has_index ? 1u : 0u ; idx < fields->size (); ++idx) {
59
63
const auto & field = fields->at (idx);
60
64
const auto & type_desc = field.type ();
61
- if (filtered_set.empty () || (filtered_set. find ( field.name ()) != filtered_set. end ())) {
65
+ if (! filtered_set.contains ( field.name ())) {
62
66
if (auto existing = merged_fields_map.find (field.name ()); existing != merged_fields_map.end ()) {
63
67
auto existing_type_desc = existing->second ;
64
68
if (existing_type_desc != type_desc) {
@@ -68,17 +72,22 @@ StreamDescriptor merge_descriptors(
68
72
" New type descriptor : {}" ,
69
73
field.name (), existing_type_desc, type_desc
70
74
);
71
- auto new_descriptor = has_valid_common_type (existing_type_desc, type_desc);
72
- if (new_descriptor) {
73
- merged_fields_map[field.name ()] = *new_descriptor;
75
+ if (convert_int_to_float && is_integer_type (existing_type_desc.data_type ()) && is_integer_type (type_desc.data_type ())) {
76
+ merged_fields_map[field.name ()] = TypeDescriptor{DataType::FLOAT64, existing_type_desc.dimension ()};
74
77
} else {
75
- schema::raise <ErrorCode::E_DESCRIPTOR_MISMATCH>(
76
- " No valid common type between {} and {} for column {}" ,
77
- existing_type_desc,
78
- type_desc,
79
- field.name ()
80
- );
78
+ auto new_descriptor = has_valid_common_type (existing_type_desc, type_desc);
79
+ if (new_descriptor) {
80
+ merged_fields_map[field.name ()] = *new_descriptor;
81
+ } else {
82
+ schema::raise <ErrorCode::E_DESCRIPTOR_MISMATCH>(
83
+ " No valid common type between {} and {} for column {}" ,
84
+ existing_type_desc,
85
+ type_desc,
86
+ field.name ()
87
+ );
88
+ }
81
89
}
90
+
82
91
}
83
92
} else {
84
93
merged_fields.emplace_back (field.name ());
@@ -98,46 +107,50 @@ StreamDescriptor merge_descriptors(
98
107
const StreamDescriptor &original,
99
108
const std::vector<std::shared_ptr<FieldCollection>> &entries,
100
109
const std::optional<std::vector<std::string>> &filtered_columns,
101
- const std::optional<IndexDescriptorImpl>& default_index) {
110
+ const std::optional<IndexDescriptorImpl>& default_index,
111
+ bool convert_int_to_float) {
102
112
std::unordered_set<std::string_view> filtered_set = filtered_columns.has_value ()
103
113
? std::unordered_set<std::string_view>(filtered_columns->begin (), filtered_columns->end ())
104
114
: std::unordered_set<std::string_view>{};
105
- return merge_descriptors (original, entries, filtered_set, default_index);
115
+ return merge_descriptors (original, entries, filtered_set, default_index, convert_int_to_float );
106
116
}
107
117
108
118
StreamDescriptor merge_descriptors (
109
119
const StreamDescriptor& original,
110
120
std::span<const std::shared_ptr<FieldCollection>> entries,
111
121
const std::optional<std::vector<std::string>>& filtered_columns,
112
- const std::optional<IndexDescriptorImpl>& default_index) {
122
+ const std::optional<IndexDescriptorImpl>& default_index,
123
+ bool convert_int_to_float) {
113
124
std::unordered_set<std::string_view> filtered_set = filtered_columns.has_value ()
114
125
? std::unordered_set<std::string_view>(filtered_columns->begin (), filtered_columns->end ())
115
126
: std::unordered_set<std::string_view>{};
116
- return merge_descriptors (original, entries, filtered_set, default_index);
127
+ return merge_descriptors (original, entries, filtered_set, default_index, convert_int_to_float );
117
128
}
118
129
119
130
StreamDescriptor merge_descriptors (
120
131
const StreamDescriptor &original,
121
132
const std::vector<pipelines::SliceAndKey> &entries,
122
133
const std::optional<std::vector<std::string>> &filtered_columns,
123
- const std::optional<IndexDescriptorImpl>& default_index) {
134
+ const std::optional<IndexDescriptorImpl>& default_index,
135
+ bool convert_int_to_float) {
124
136
std::vector<std::shared_ptr<FieldCollection>> fields;
125
137
for (const auto &entry : entries) {
126
138
fields.push_back (std::make_shared<FieldCollection>(entry.slice_ .desc ()->fields ().clone ()));
127
139
}
128
- return merge_descriptors (original, fields, filtered_columns, default_index);
140
+ return merge_descriptors (original, fields, filtered_columns, default_index, convert_int_to_float );
129
141
}
130
142
131
143
StreamDescriptor merge_descriptors (
132
144
const std::shared_ptr<Store>& store,
133
145
const StreamDescriptor &original,
134
146
const std::vector<pipelines::SliceAndKey> &entries,
135
147
const std::unordered_set<std::string_view> &filtered_set,
136
- const std::optional<IndexDescriptorImpl>& default_index) {
148
+ const std::optional<IndexDescriptorImpl>& default_index,
149
+ bool convert_int_to_float) {
137
150
std::vector<std::shared_ptr<FieldCollection>> fields;
138
151
for (const auto &entry : entries) {
139
152
fields.push_back (std::make_shared<FieldCollection>(entry.segment (store).descriptor ().fields ().clone ()));
140
153
}
141
- return merge_descriptors (original, fields, filtered_set, default_index);
154
+ return merge_descriptors (original, fields, filtered_set, default_index, convert_int_to_float );
142
155
}
143
156
}
0 commit comments