3333#include " arrow/types/primitive.h"
3434#include " arrow/types/string.h"
3535#include " arrow/types/struct.h"
36+ #include " arrow/util/memory-pool.h"
3637#include " arrow/util/status.h"
3738
3839namespace arrow {
@@ -847,23 +848,163 @@ class JsonSchemaReader {
847848 const rj::Value& json_schema_;
848849};
849850
850- // class JsonArrayReader {
851- // public:
852- // explicit JsonArrayReader(const rj::Value& json_array, const Schema& schema)
853- // : json_array_(json_array), schema_(schema) {}
851+ class JsonArrayReader {
852+ public:
853+ explicit JsonArrayReader (
854+ MemoryPool* pool, const rj::Value& json_array, const Schema& schema)
855+ : pool_(pool), json_array_(json_array), schema_(schema) {}
856+
857+ Status GetResult (std::shared_ptr<Array>* array) {
858+ if (!json_array_.IsObject ()) {
859+ return Status::Invalid (" Array was not a JSON object" );
860+ }
861+ const auto & json_array = json_array_.GetObject ();
862+
863+ const auto & json_name = json_array.FindMember (" name" );
864+ RETURN_NOT_STRING (" name" , json_name, json_array);
865+
866+ return GetArrayFromStruct (
867+ json_array_, json_name.GetString (), schema_.fields (), array);
868+ }
869+
870+ Status GetArrayFromStruct (const rj::Value& obj, const std::string& name,
871+ const std::vector<std::shared_ptr<Field>>& fields, std::shared_ptr<Array>* array) {
872+ std::shared_ptr<Field> result = nullptr ;
873+
874+ for (const std::shared_ptr<Field>& field : fields) {
875+ if (field->name == name) {
876+ result = field;
877+ break ;
878+ }
879+ }
880+
881+ if (result == nullptr ) {
882+ std::stringstream ss;
883+ ss << " Field named " << name << " not found in struct/schema" ;
884+ return Status::KeyError (ss.str ());
885+ }
886+
887+ return GetArray (obj, result->type , array);
888+ }
889+
890+ template <typename T>
891+ Status ReadArray (const rj::Value& obj, const std::vector<bool >& is_valid,
892+ const std::shared_ptr<DataType>& type, std::shared_ptr<Array>* array) {
893+ typename TypeTraits<T>::BuilderType builder (pool_, type);
894+ const auto & json_array = obj.GetObject ();
854895
855- // Status GetArray(std::shared_ptr<Array>* array) {
856- // if (!json_array_.IsObject()) {
857- // return Status::Invalid("Array was not a JSON object");
858- // }
896+ const auto & json_data = json_array.FindMember (" DATA" );
897+ RETURN_NOT_ARRAY (" DATA" , json_data, json_array);
859898
860- // return Status::OK();
861- // }
899+ const auto & json_data_arr = json_type_ids->value .GetArray ();
862900
863- // private:
864- // const rj::Value& json_array_;
865- // const Schema& schema_;
866- // };
901+ for (auto i = 0 ; i < json_data_arr.Size (); ++i) {
902+ if (!is_valid[i]) {
903+ builder.AppendNull ();
904+ continue ;
905+ }
906+
907+ const rj::Value& val = json_data_arr[i];
908+ if (IsSignedInt<T>::value) {
909+ builder.Append (val.GetInt64 ());
910+ } else if (IsUnsignedInt<T>::value) {
911+ builder.Append (val.GetUint64 ());
912+ } else if (IsFloatingPoint<T>::value) {
913+ builder.Append (val.GetFloat ());
914+ } else if (std::is_base_of<BooleanType, T>::value) {
915+ builder.Append (val.GetBool ());
916+ } else {
917+ // We are in the wrong function
918+ return Status::Invalid (type->ToString ());
919+ }
920+ }
921+
922+ return builder.Finish (array);
923+ }
924+
925+ template <typename T>
926+ typename std::enable_if<std::is_base_of<BinaryType, T>::value, Status>::type
927+ ReadArray (const rj::Value& obj, const std::shared_ptr<DataType>& type,
928+ std::shared_ptr<Array>* array) {}
929+
930+ template <typename T>
931+ typename std::enable_if<std::is_base_of<ListType, T>::value, Status>::type
932+ ReadArray (const rj::Value& obj, const std::shared_ptr<DataType>& type,
933+ std::shared_ptr<Array>* array) {}
934+
935+ template <typename T>
936+ typename std::enable_if<std::is_base_of<StructType, T>::value, Status>::type
937+ ReadArray (const rj::Value& obj, const std::shared_ptr<DataType>& type,
938+ std::shared_ptr<Array>* array) {}
939+
940+ template <typename T>
941+ typename std::enable_if<std::is_base_of<NullType, T>::value, Status>::type
942+ ReadArray (const rj::Value& obj, const std::shared_ptr<DataType>& type,
943+ std::shared_ptr<Array>* array) {}
944+
945+ Status GetArray (const rj::Value& obj, const std::shared_ptr<DataType>& type,
946+ std::shared_ptr<Array>* array) {
947+ if (!obj.IsObject ()) { return Status::Invalid (" Array was not a JSON object" ); }
948+ const auto & json_array = obj.GetObject ();
949+
950+ const auto & json_length = json_array.FindMember (" count" );
951+ RETURN_NOT_INT (" count" , json_length, json_array);
952+
953+ const auto & json_validity = json_array.FindMember (" VALIDITY" );
954+ RETURN_NOT_ARRAY (" VALIDITY" , json_validity, json_array);
955+
956+ std::vector<bool > is_valid (count);
957+
958+ #define TYPE_CASE (TYPE ) \
959+ case TYPE::type_enum: \
960+ return ReadArray<TYPE>(obj, type, array);
961+
962+ #define NOT_IMPLEMENTED_CASE (TYPE_ENUM ) \
963+ case Type::TYPE_ENUM: \
964+ std::stringstream ss; \
965+ ss << type->ToString (); \
966+ return Status::NotImplemented (ss.str ());
967+
968+ switch (type->type ) {
969+ TYPE_CASE (NullType);
970+ TYPE_CASE (BooleanType);
971+ TYPE_CASE (UInt8Type);
972+ TYPE_CASE (Int8Type);
973+ TYPE_CASE (UInt16Type);
974+ TYPE_CASE (Int16Type);
975+ TYPE_CASE (UInt32Type);
976+ TYPE_CASE (Int32Type);
977+ TYPE_CASE (UInt64Type);
978+ TYPE_CASE (Int64Type);
979+ TYPE_CASE (HalfFloatType);
980+ TYPE_CASE (FloatType);
981+ TYPE_CASE (DoubleType);
982+ TYPE_CASE (StringType);
983+ TYPE_CASE (BinaryType);
984+ NOT_IMPLEMENTED_CASE (DATE);
985+ NOT_IMPLEMENTED_CASE (TIMESTAMP);
986+ NOT_IMPLEMENTED_CASE (TIME);
987+ NOT_IMPLEMENTED_CASE (INTERVAL);
988+ TYPE_CASE (ListType);
989+ TYPE_CASE (StructType);
990+ NOT_IMPLEMENTED_CASE (UNION);
991+ default :
992+ std::stringstream ss;
993+ ss << type->ToString ();
994+ return Status::NotImplemented (ss.str ());
995+ };
996+
997+ #undef TYPE_CASE
998+ #undef NOT_IMPLEMENTED_CASE
999+
1000+ return Status::OK ();
1001+ }
1002+
1003+ private:
1004+ MemoryPool* pool;
1005+ const rj::Value& json_array_;
1006+ const Schema& schema_;
1007+ };
8671008
8681009Status WriteJsonSchema (const Schema& schema, RjWriter* json_writer) {
8691010 JsonSchemaWriter converter (schema, json_writer);
@@ -875,17 +1016,17 @@ Status ReadJsonSchema(const rj::Value& json_schema, std::shared_ptr<Schema>* sch
8751016 return converter.GetSchema (schema);
8761017}
8771018
878- // Status WriteJsonArray(
879- // const std::string& name, const Array& array, RjWriter* json_writer) {
880- // JsonArrayWriter converter(name, array, json_writer);
881- // converter.Write();
882- // }
883-
884- // Status ReadJsonArray(
885- // const rj::Value& json_array, const Schema& schema, std::shared_ptr<Array>* array) {
886- // JsonArrayReader converter(json_array, schema);
887- // return converter.GetArray(array);
888- // }
1019+ Status WriteJsonArray (
1020+ const std::string& name, const Array& array, RjWriter* json_writer) {
1021+ JsonArrayWriter converter (name, array, json_writer);
1022+ return converter.Write ();
1023+ }
1024+
1025+ Status ReadJsonArray (MemoryPool* pool, const rj::Value& json_array, const Schema& schema,
1026+ std::shared_ptr<Array>* array) {
1027+ JsonArrayReader converter (pool, json_array, schema);
1028+ return converter.GetArray (array);
1029+ }
8891030
8901031} // namespace ipc
8911032} // namespace arrow
0 commit comments