1616// under the License.
1717
1818#include < ostream>
19+ #include < sstream>
1920#include < string>
21+ #include < vector>
2022
2123#include " arrow/array.h"
2224#include " arrow/pretty_print.h"
@@ -32,20 +34,35 @@ namespace arrow {
3234
3335class ArrayPrinter : public ArrayVisitor {
3436 public:
35- ArrayPrinter (const Array& array, std::ostream* sink) : array_(array), sink_(sink) {}
37+ ArrayPrinter (const Array& array, int indent, std::ostream* sink)
38+ : array_(array), indent_(indent), sink_(sink) {}
3639
3740 Status Print () { return VisitArray (array_); }
3841
3942 Status VisitArray (const Array& array) { return array.Accept (this ); }
4043
4144 template <typename T>
42- typename std::enable_if<IsNumeric <T>::value, void >::type WriteDataValues (
45+ typename std::enable_if<IsInteger <T>::value, void >::type WriteDataValues (
4346 const T& array) {
4447 const auto data = array.raw_data ();
4548 for (int i = 0 ; i < array.length (); ++i) {
4649 if (i > 0 ) { (*sink_) << " , " ; }
4750 if (array.IsNull (i)) {
4851 (*sink_) << " null" ;
52+ } else {
53+ (*sink_) << static_cast <int64_t >(data[i]);
54+ }
55+ }
56+ }
57+
58+ template <typename T>
59+ typename std::enable_if<IsFloatingPoint<T>::value, void >::type WriteDataValues (
60+ const T& array) {
61+ const auto data = array.raw_data ();
62+ for (int i = 0 ; i < array.length (); ++i) {
63+ if (i > 0 ) { (*sink_) << " , " ; }
64+ if (array.IsNull (i)) {
65+ Write (" null" );
4966 } else {
5067 (*sink_) << data[i];
5168 }
@@ -60,7 +77,7 @@ class ArrayPrinter : public ArrayVisitor {
6077 for (int i = 0 ; i < array.length (); ++i) {
6178 if (i > 0 ) { (*sink_) << " , " ; }
6279 if (array.IsNull (i)) {
63- (*sink_) << " null" ;
80+ Write ( " null" ) ;
6481 } else {
6582 const char * buf = reinterpret_cast <const char *>(array.GetValue (i, &length));
6683 (*sink_) << " \" " << std::string (buf, length) << " \" " ;
@@ -74,9 +91,9 @@ class ArrayPrinter : public ArrayVisitor {
7491 for (int i = 0 ; i < array.length (); ++i) {
7592 if (i > 0 ) { (*sink_) << " , " ; }
7693 if (array.IsNull (i)) {
77- (*sink_) << " null" ;
94+ Write ( " null" ) ;
7895 } else {
79- (*sink_) << (array.Value (i) ? " true" : " false" );
96+ Write (array.Value (i) ? " true" : " false" );
8097 }
8198 }
8299 }
@@ -148,42 +165,77 @@ class ArrayPrinter : public ArrayVisitor {
148165 }
149166
150167 Status Visit (const ListArray& array) override {
151- // auto type = static_cast<const ListType*>(array.type().get());
152- // for (size_t i = 0; i < fields.size(); ++i) {
153- // RETURN_NOT_OK(VisitArray(fields[i]->name, *arrays[i].get()));
154- // }
155- // return WriteChildren(type->children(), {array.values()});
168+ Newline ();
169+ Write (" -- is_valid: " );
170+ BooleanArray is_valid (array.length (), array.null_bitmap ());
171+ PrettyPrint (is_valid, indent_ + 2 , sink_);
172+
173+ Newline ();
174+ Write (" -- offsets: " );
175+ Int32Array offsets (array.length () + 1 , array.offsets ());
176+ PrettyPrint (offsets, indent_ + 2 , sink_);
177+
178+ Newline ();
179+ Write (" -- values: " );
180+ PrettyPrint (*array.values ().get (), indent_ + 2 , sink_);
181+
156182 return Status::OK ();
157183 }
158184
159185 Status Visit (const StructArray& array) override {
160- // auto type = static_cast<const StructType*>(array.type().get());
161- // for (size_t i = 0; i < fields.size(); ++i) {
162- // RETURN_NOT_OK(VisitArray(fields[i]->name, *arrays[i].get()));
163- // }
164- // return WriteChildren(type->children(), array.fields());
186+ Newline ();
187+ Write (" -- is_valid: " );
188+ BooleanArray is_valid (array.length (), array.null_bitmap ());
189+ PrettyPrint (is_valid, indent_ + 2 , sink_);
190+
191+ const std::vector<std::shared_ptr<Array>>& fields = array.fields ();
192+ for (size_t i = 0 ; i < fields.size (); ++i) {
193+ Newline ();
194+ std::stringstream ss;
195+ ss << " -- child " << i << " type: " << fields[i]->type ()->ToString () << " values: " ;
196+ Write (ss.str ());
197+ PrettyPrint (*fields[i].get (), indent_ + 2 , sink_);
198+ }
199+
165200 return Status::OK ();
166201 }
167202
168203 Status Visit (const UnionArray& array) override {
169204 return Status::NotImplemented (" union" );
170205 }
171206
207+ void Write (const char * data) { (*sink_) << data; }
208+
209+ void Write (const std::string& data) { (*sink_) << data; }
210+
211+ void Newline () {
212+ (*sink_) << " \n " ;
213+ Indent ();
214+ }
215+
216+ void Indent () {
217+ for (int i = 0 ; i < indent_; ++i) {
218+ (*sink_) << " " ;
219+ }
220+ }
221+
172222 private:
173223 const Array& array_;
224+ int indent_;
225+
174226 std::ostream* sink_;
175227};
176228
177- Status PrettyPrint (const Array& arr, std::ostream* sink) {
178- ArrayPrinter printer (arr, sink);
229+ Status PrettyPrint (const Array& arr, int indent, std::ostream* sink) {
230+ ArrayPrinter printer (arr, indent, sink);
179231 return printer.Print ();
180232}
181233
182- Status PrettyPrint (const RecordBatch& batch, std::ostream* sink) {
234+ Status PrettyPrint (const RecordBatch& batch, int indent, std::ostream* sink) {
183235 for (int i = 0 ; i < batch.num_columns (); ++i) {
184236 const std::string& name = batch.column_name (i);
185237 (*sink) << name << " : " ;
186- RETURN_NOT_OK (PrettyPrint (*batch.column (i).get (), sink));
238+ RETURN_NOT_OK (PrettyPrint (*batch.column (i).get (), indent + 2 , sink));
187239 (*sink) << " \n " ;
188240 }
189241 return Status::OK ();
0 commit comments