fsaintjacques commented on a change in pull request #7026:
URL: https://github.com/apache/arrow/pull/7026#discussion_r417218364
##########
File path: cpp/src/arrow/scalar.cc
##########
@@ -252,6 +270,100 @@ Result<std::shared_ptr<Scalar>> Scalar::Parse(const
std::shared_ptr<DataType>& t
return ScalarParseImpl{type, s}.Finish();
}
+struct ScalarFromArraySlotImpl {
+ template <typename T>
+ using ScalarType = typename TypeTraits<T>::ScalarType;
+
+ Status Visit(const NullArray& a) {
+ out_ = std::make_shared<NullScalar>();
+ return Status::OK();
+ }
+
+ Status Visit(const BooleanArray& a) { return Finish(a.Value(index_)); }
+
+ template <typename T>
+ Status Visit(const NumericArray<T>& a) {
+ return Finish(a.Value(index_));
+ }
+
+ template <typename T>
+ Status Visit(const BaseBinaryArray<T>& a) {
+ return Finish(a.GetString(index_));
+ }
+
+ Status Visit(const FixedSizeBinaryArray& a) { return
Finish(a.GetString(index_)); }
+
+ Status Visit(const DayTimeIntervalArray& a) { return
Finish(a.Value(index_)); }
+
+ template <typename T>
+ Status Visit(const BaseListArray<T>& a) {
+ return Finish(a.value_slice(index_));
+ }
+
+ Status Visit(const FixedSizeListArray& a) { return
Finish(a.value_slice(index_)); }
+
+ Status Visit(const StructArray& a) {
+ ScalarVector children;
+ for (const auto& child : a.fields()) {
+ children.emplace_back();
+ ARROW_ASSIGN_OR_RAISE(children.back(), Scalar::FromArraySlot(*child,
index_));
+ }
+ return Finish(std::move(children));
+ }
+
+ Status Visit(const UnionArray& a) {
+ return Status::NotImplemented("Non-null UnionScalar");
+ }
+
+ Status Visit(const DictionaryArray& a) {
+ ARROW_ASSIGN_OR_RAISE(auto index, Scalar::FromArraySlot(*a.indices(),
index_));
Review comment:
Multiple problems here:
1. Confusing naming with `index`, `index_`, `index64`,
2. We shouldn't use Scalar because its dynamic typing is convenient,, it
should stick to C++ type system. You can add a method `int64_t
DictionaryArray::GetValueIndex(int64_t row_index)` that will properly upcast to
int64_t independent of `indices` type. This Visit method becomes trivial
afterward.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]