2525#include < utility>
2626#include < vector>
2727
28+ #include < simdjson.h>
29+
2830#include " arrow/array.h"
2931#include " arrow/array/builder_binary.h"
3032#include " arrow/io/memory.h"
3133#include " arrow/json/converter.h"
34+ #include " arrow/json/json_writer_internal.h"
3235#include " arrow/json/options.h"
3336#include " arrow/json/parser.h"
34- #include " arrow/json/rapidjson_defs .h"
37+ #include " arrow/result .h"
3538#include " arrow/testing/gtest_util.h"
3639#include " arrow/testing/random.h"
3740#include " arrow/type.h"
3841#include " arrow/util/checked_cast.h"
42+ #include " arrow/util/simdjson_internal.h"
3943#include " arrow/visit_type_inline.h"
4044
41- #include " rapidjson/document.h"
42- #include " rapidjson/prettywriter.h"
43- #include " rapidjson/reader.h"
44- #include " rapidjson/writer.h"
45-
4645namespace arrow {
4746
4847using internal::checked_cast;
4948
5049namespace json {
5150
52- namespace rj = arrow::rapidjson;
53-
54- using rj::StringBuffer;
5551using std::string_view;
56- using Writer = rj::Writer<StringBuffer> ;
52+ using Writer = JsonWriter ;
5753
5854struct GenerateOptions {
5955 // Probability of a field being written
@@ -87,35 +83,43 @@ inline static Status Generate(
8783
8884template <typename Engine>
8985struct GenerateImpl {
90- Status Visit (const NullType&) { return OK (writer.Null ()); }
86+ Status Visit (const NullType&) {
87+ writer.Null ();
88+ return Status::OK ();
89+ }
9190
9291 Status Visit (const BooleanType&) {
93- return OK (writer.Bool (std::uniform_int_distribution<uint16_t >{}(e) & 1 ));
92+ writer.Bool (std::uniform_int_distribution<uint16_t >{}(e) & 1 );
93+ return Status::OK ();
9494 }
9595
9696 template <typename T>
9797 enable_if_physical_unsigned_integer<T, Status> Visit (const T&) {
9898 auto val = std::uniform_int_distribution<>{}(e);
99- return OK (writer.Uint64 (static_cast <typename T::c_type>(val)));
99+ writer.Uint64 (static_cast <typename T::c_type>(val));
100+ return Status::OK ();
100101 }
101102
102103 template <typename T>
103104 enable_if_physical_signed_integer<T, Status> Visit (const T&) {
104105 auto val = std::uniform_int_distribution<>{}(e);
105- return OK (writer.Int64 (static_cast <typename T::c_type>(val)));
106+ writer.Int64 (static_cast <typename T::c_type>(val));
107+ return Status::OK ();
106108 }
107109
108110 template <typename T>
109111 enable_if_physical_floating_point<T, Status> Visit (const T&) {
110112 auto val = std::normal_distribution<typename T::c_type>{0 , 1 << 10 }(e);
111- return OK (writer.Double (val));
113+ writer.Double (val);
114+ return Status::OK ();
112115 }
113116
114117 Status GenerateUtf8 (const DataType&) {
115118 auto num_codepoints = std::poisson_distribution<>{4 }(e);
116119 auto seed = std::uniform_int_distribution<uint32_t >{}(e);
117120 std::string s = RandomUtf8String (seed, num_codepoints);
118- return OK (writer.String (s));
121+ writer.String (s);
122+ return Status::OK ();
119123 }
120124
121125 template <typename T>
@@ -132,7 +136,8 @@ struct GenerateImpl {
132136 for (int i = 0 ; i < size; ++i) {
133137 RETURN_NOT_OK (Generate (t.value_type (), e, &writer, options));
134138 }
135- return OK (writer.EndArray (size));
139+ writer.EndArray ();
140+ return Status::OK ();
136141 }
137142
138143 Status Visit (const ListViewType& t) { return NotImplemented (t); }
@@ -162,7 +167,7 @@ struct GenerateImpl {
162167 }
163168
164169 Engine& e;
165- rj:: Writer<rj::StringBuffer> & writer;
170+ Writer& writer;
166171 const GenerateOptions& options;
167172};
168173
@@ -180,12 +185,9 @@ inline static Status Generate(const std::shared_ptr<DataType>& type, Engine& e,
180185template <typename Engine>
181186inline static Status Generate (const std::vector<std::shared_ptr<Field>>& fields,
182187 Engine& e, Writer* writer, const GenerateOptions& options) {
183- RETURN_NOT_OK (OK (writer->StartObject ()));
184-
185- int num_fields = 0 ;
188+ writer->StartObject ();
186189 auto write_field = [&](const Field& f) {
187- ++num_fields;
188- writer->Key (f.name ().c_str ());
190+ writer->Key (f.name ());
189191 return Generate (f.type (), e, writer, options);
190192 };
191193
@@ -210,7 +212,8 @@ inline static Status Generate(const std::vector<std::shared_ptr<Field>>& fields,
210212 }
211213 }
212214
213- return OK (writer->EndObject (num_fields));
215+ writer->EndObject ();
216+ return Status::OK ();
214217}
215218
216219inline static Status MakeStream (string_view src_str,
@@ -258,14 +261,26 @@ inline static Status ParseFromString(ParseOptions options, string_view src_str,
258261}
259262
260263static inline std::string PrettyPrint (string_view one_line) {
261- rj::Document document ;
264+ simdjson::ondemand::parser parser ;
262265
263266 // Must pass size to avoid ASAN issues.
264- document.Parse (one_line.data (), one_line.size ());
265- rj::StringBuffer sb;
266- rj::PrettyWriter<rj::StringBuffer> writer (sb);
267- document.Accept (writer);
268- return sb.GetString ();
267+ simdjson::padded_string json (one_line.data (), one_line.size ());
268+
269+ auto document_result =
270+ internal::ResolveSimdjsonResult (parser.iterate(json), " Failed to parse JSON" );
271+ ABORT_NOT_OK (document_result.status ());
272+ auto document = std::move (document_result).ValueOrDie ();
273+
274+ auto value_result =
275+ internal::ResolveSimdjsonResult (document.get_value (), " Failed to get JSON value" );
276+ ABORT_NOT_OK (value_result.status ());
277+ auto value = std::move (value_result).ValueOrDie ();
278+
279+ std::string result;
280+ result.reserve (one_line.size ());
281+
282+ ABORT_NOT_OK (internal::PrettyPrintJsonValue (value, &result));
283+ return result;
269284}
270285
271286template <typename T>
0 commit comments