Skip to main content

arrow_json/reader/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: See the NOTICE file distributed with this work for additional information regarding copyright ownership
3// SPDX-FileContributor: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements
4
5//! JSON reader
6//!
7//! This JSON reader allows JSON records to be read into the Arrow memory
8//! model. Records are loaded in batches and are then converted from the record-oriented
9//! representation to the columnar arrow data model.
10//!
11//! The reader ignores whitespace between JSON values, including `\n` and `\r`, allowing
12//! parsing of sequences of one or more arbitrarily formatted JSON values, including
13//! but not limited to newline-delimited JSON.
14//!
15//! # Timestamps
16//!
17//! Timestamps are parsed with [`arrow_cast::parse::string_to_datetime`]. A
18//! timestamp without an explicit offset that falls in a daylight savings gap or
19//! overlap of the target timezone is resolved as described there, rather than
20//! returning an error.
21//!
22//! # Basic Usage
23//!
24//! [`Reader`] can be used directly with synchronous data sources, such as [`std::fs::File`]
25//!
26//! ```
27//! # use arrow_schema::*;
28//! # use std::fs::File;
29//! # use std::io::BufReader;
30//! # use std::sync::Arc;
31//!
32//! let schema = Arc::new(Schema::new(vec![
33//!     Field::new("a", DataType::Float64, false),
34//!     Field::new("b", DataType::Float64, false),
35//!     Field::new("c", DataType::Boolean, true),
36//! ]));
37//!
38//! let file = File::open("test/data/basic.json").unwrap();
39//!
40//! let mut json = arrow_json::ReaderBuilder::new(schema).build(BufReader::new(file)).unwrap();
41//! let batch = json.next().unwrap().unwrap();
42//! ```
43//!
44//! # Async Usage
45//!
46//! The lower-level [`Decoder`] can be integrated with various forms of async
47//! data streams, and can be used with any of the async IO primitives found
48//! within the Rust ecosystem.
49//!
50//! For example, it can be used with an arbitrary `Stream` of `Bytes` as shown below
51//!
52//! ```
53//! # use std::task::{Poll, ready};
54//! # use bytes::{Buf, Bytes};
55//! # use arrow_schema::ArrowError;
56//! # use futures::stream::{Stream, StreamExt};
57//! # use arrow_array::RecordBatch;
58//! # use arrow_json::reader::Decoder;
59//! #
60//! fn decode_stream<S: Stream<Item = Bytes> + Unpin>(
61//!     mut decoder: Decoder,
62//!     mut input: S,
63//! ) -> impl Stream<Item = Result<RecordBatch, ArrowError>> {
64//!     let mut buffered = Bytes::new();
65//!     futures::stream::poll_fn(move |cx| {
66//!         loop {
67//!             if buffered.is_empty() {
68//!                 buffered = match ready!(input.poll_next_unpin(cx)) {
69//!                     Some(b) => b,
70//!                     None => break,
71//!                 };
72//!             }
73//!             let decoded = match decoder.decode(buffered.as_ref()) {
74//!                 Ok(decoded) => decoded,
75//!                 Err(e) => return Poll::Ready(Some(Err(e))),
76//!             };
77//!             let read = buffered.len();
78//!             buffered.advance(decoded);
79//!             if decoded != read {
80//!                 break
81//!             }
82//!         }
83//!
84//!         Poll::Ready(decoder.flush().transpose())
85//!     })
86//! }
87//!
88//! ```
89//!
90//! In a similar vein, it can also be used with tokio-based IO primitives
91//!
92//! ```
93//! # use std::sync::Arc;
94//! # use arrow_schema::{DataType, Field, Schema};
95//! # use std::pin::Pin;
96//! # use std::task::{Poll, ready};
97//! # use futures::{Stream, TryStreamExt};
98//! # use tokio::io::AsyncBufRead;
99//! # use arrow_array::RecordBatch;
100//! # use arrow_json::reader::Decoder;
101//! # use arrow_schema::ArrowError;
102//! fn decode_stream<R: AsyncBufRead + Unpin>(
103//!     mut decoder: Decoder,
104//!     mut reader: R,
105//! ) -> impl Stream<Item = Result<RecordBatch, ArrowError>> {
106//!     futures::stream::poll_fn(move |cx| {
107//!         loop {
108//!             let b = match ready!(Pin::new(&mut reader).poll_fill_buf(cx)) {
109//!                 Ok(b) if b.is_empty() => break,
110//!                 Ok(b) => b,
111//!                 Err(e) => return Poll::Ready(Some(Err(e.into()))),
112//!             };
113//!             let read = b.len();
114//!             let decoded = match decoder.decode(b) {
115//!                 Ok(decoded) => decoded,
116//!                 Err(e) => return Poll::Ready(Some(Err(e))),
117//!             };
118//!             Pin::new(&mut reader).consume(decoded);
119//!             if decoded != read {
120//!                 break;
121//!             }
122//!         }
123//!
124//!         Poll::Ready(decoder.flush().transpose())
125//!     })
126//! }
127//! ```
128//!
129//! # Customizing the decoder
130//!
131//! The decoding of each data type can be customized using
132//! [`ReaderBuilder::with_decoder_factory`]. For example, you can override the
133//! default decoding of binary data from hex strings to decode from an array of
134//! integers instead, or provide decoders for types with no built-in decoding.
135//! See the example on [`DecoderFactory`].
136//!
137
138use std::io::BufRead;
139use std::sync::Arc;
140
141use arrow_array::cast::AsArray;
142use arrow_array::timezone::Tz;
143use arrow_array::types::*;
144use arrow_array::{ArrayRef, RecordBatch, RecordBatchReader, downcast_integer};
145use arrow_schema::{ArrowError, DataType, Field, FieldRef, Schema, SchemaRef, TimeUnit};
146use chrono::Utc;
147use serde_core::Serialize;
148
149use crate::StructMode;
150use crate::reader::binary_array::{
151    BinaryArrayDecoder, BinaryViewDecoder, FixedSizeBinaryArrayDecoder,
152};
153use crate::reader::boolean_array::BooleanArrayDecoder;
154use crate::reader::decimal_array::DecimalArrayDecoder;
155use crate::reader::list_array::{
156    FixedSizeListArrayDecoder, ListArrayDecoder, ListViewArrayDecoder,
157};
158use crate::reader::map_array::MapArrayDecoder;
159use crate::reader::null_array::NullArrayDecoder;
160use crate::reader::primitive_array::PrimitiveArrayDecoder;
161use crate::reader::run_end_array::RunEndEncodedArrayDecoder;
162use crate::reader::string_array::StringArrayDecoder;
163use crate::reader::string_view_array::StringViewArrayDecoder;
164use crate::reader::struct_array::StructArrayDecoder;
165use crate::reader::tape::{TapeDecoder, TapeDecoderOptions};
166use crate::reader::timestamp_array::TimestampArrayDecoder;
167
168pub use schema::*;
169// `mod tape` is private by design: exposing only these two types means downstream can read a
170// `Tape` but not construct one, keeping `TapeDecoder` an implementation detail.
171pub use tape::{Tape, TapeElement};
172pub use value_iter::ValueIter;
173
174mod binary_array;
175mod boolean_array;
176mod decimal_array;
177mod list_array;
178mod map_array;
179mod null_array;
180mod primitive_array;
181mod run_end_array;
182mod schema;
183mod serializer;
184mod string_array;
185mod string_view_array;
186mod struct_array;
187mod tape;
188mod timestamp_array;
189mod value_iter;
190
191/// A builder for [`Reader`] and [`Decoder`]
192#[derive(Clone)]
193pub struct ReaderBuilder {
194    batch_size: usize,
195    coerce_primitive: bool,
196    strict_mode: bool,
197    ignore_type_conflicts: bool,
198    allow_non_finite_floats: bool,
199    is_field: bool,
200    struct_mode: StructMode,
201    flatten_top_level_arrays: bool,
202    decoder_factory: Option<Arc<dyn DecoderFactory>>,
203    schema: SchemaRef,
204}
205
206impl ReaderBuilder {
207    /// Create a new [`ReaderBuilder`] with the provided [`SchemaRef`]
208    ///
209    /// This could be obtained using [`infer_json_schema`] if not known
210    ///
211    /// Any columns not present in `schema` will be ignored, unless `strict_mode` is set to true.
212    /// In this case, an error is returned when a column is missing from `schema`.
213    ///
214    /// [`infer_json_schema`]: crate::reader::infer_json_schema
215    pub fn new(schema: SchemaRef) -> Self {
216        Self {
217            batch_size: 1024,
218            coerce_primitive: false,
219            strict_mode: false,
220            ignore_type_conflicts: false,
221            allow_non_finite_floats: false,
222            is_field: false,
223            struct_mode: Default::default(),
224            flatten_top_level_arrays: false,
225            decoder_factory: None,
226            schema,
227        }
228    }
229
230    /// Create a new [`ReaderBuilder`] that will parse JSON values of `field.data_type()`
231    ///
232    /// Unlike [`ReaderBuilder::new`] this does not require the root of the JSON data
233    /// to be an object, i.e. `{..}`, allowing for parsing of any valid JSON value(s)
234    ///
235    /// ```
236    /// # use std::sync::Arc;
237    /// # use arrow_array::cast::AsArray;
238    /// # use arrow_array::types::Int32Type;
239    /// # use arrow_json::ReaderBuilder;
240    /// # use arrow_schema::{DataType, Field};
241    /// // Root of JSON schema is a numeric type
242    /// let data = "1\n2\n3\n";
243    /// let field = Arc::new(Field::new("int", DataType::Int32, true));
244    /// let mut reader = ReaderBuilder::new_with_field(field.clone()).build(data.as_bytes()).unwrap();
245    /// let b = reader.next().unwrap().unwrap();
246    /// let values = b.column(0).as_primitive::<Int32Type>().values();
247    /// assert_eq!(values, &[1, 2, 3]);
248    ///
249    /// // Root of JSON schema is a list type
250    /// let data = "[1, 2, 3, 4, 5, 6, 7]\n[1, 2, 3]";
251    /// let field = Field::new_list("int", field.clone(), true);
252    /// let mut reader = ReaderBuilder::new_with_field(field).build(data.as_bytes()).unwrap();
253    /// let b = reader.next().unwrap().unwrap();
254    /// let list = b.column(0).as_list::<i32>();
255    ///
256    /// assert_eq!(list.offsets().as_ref(), &[0, 7, 10]);
257    /// let list_values = list.values().as_primitive::<Int32Type>();
258    /// assert_eq!(list_values.values(), &[1, 2, 3, 4, 5, 6, 7, 1, 2, 3]);
259    /// ```
260    pub fn new_with_field(field: impl Into<FieldRef>) -> Self {
261        Self {
262            batch_size: 1024,
263            coerce_primitive: false,
264            strict_mode: false,
265            ignore_type_conflicts: false,
266            allow_non_finite_floats: false,
267            is_field: true,
268            struct_mode: Default::default(),
269            flatten_top_level_arrays: false,
270            decoder_factory: None,
271            schema: Arc::new(Schema::new([field.into()])),
272        }
273    }
274
275    /// Sets the batch size in rows to read
276    pub fn with_batch_size(self, batch_size: usize) -> Self {
277        Self { batch_size, ..self }
278    }
279
280    /// Sets if the decoder should coerce primitive values (bool and number) into string
281    /// when the Schema's column is Utf8 or LargeUtf8.
282    pub fn with_coerce_primitive(self, coerce_primitive: bool) -> Self {
283        Self {
284            coerce_primitive,
285            ..self
286        }
287    }
288
289    /// Accepts the nonstandard number literals `NaN`, `Infinity`, and `-Infinity`.
290    ///
291    /// Disabled by default. Floating-point columns preserve their IEEE values;
292    /// other types follow the existing coercion and type-conflict options.
293    /// Applies to known-schema readers only, not schema inference.
294    pub fn with_allow_non_finite_floats(self, allow_non_finite_floats: bool) -> Self {
295        Self {
296            allow_non_finite_floats,
297            ..self
298        }
299    }
300
301    /// Sets if the decoder should return an error if it encounters a column not
302    /// present in `schema`. If `struct_mode` is `ListOnly` the value of
303    /// `strict_mode` is effectively `true`. It is required for all fields of
304    /// the struct to be in the list: without field names, there is no way to
305    /// determine which field is missing.
306    pub fn with_strict_mode(self, strict_mode: bool) -> Self {
307        Self {
308            strict_mode,
309            ..self
310        }
311    }
312
313    /// Set the [`StructMode`] for the reader, which determines whether structs
314    /// can be decoded from JSON as objects or lists. For more details refer to
315    /// the enum documentation. Default is to use `ObjectOnly`.
316    pub fn with_struct_mode(self, struct_mode: StructMode) -> Self {
317        Self {
318            struct_mode,
319            ..self
320        }
321    }
322
323    /// Sets whether the decoder should produce NULL instead of returning an error if it encounters
324    /// value that can not be parsed into the specified column type.
325    ///
326    /// For example, if the type is declared to be a nullable array of `DataType::Int32` but the
327    /// reader encounters a string value `"foo"` and the value `ignore_type_conflicts` is:
328    ///
329    /// * `false` (the default): The reader will return an error.
330    ///
331    /// * `true`: The reader will fill in NULL value for that array element.
332    ///
333    /// NOTE: An inferred NULL due to a type conflict will still produce parsing errors for
334    /// non-nullable fields, the same as any other NULL or missing value.
335    pub fn with_ignore_type_conflicts(self, ignore_type_conflicts: bool) -> Self {
336        Self {
337            ignore_type_conflicts,
338            ..self
339        }
340    }
341    /// Sets whether to flatten top-level arrays.
342    ///
343    /// * When `true`, each element of a top-level array will be treated as its own row.
344    /// * When `false` (the default), the entire top-level array will be treated as one row.
345    ///
346    /// For example, consider this input file:
347    /// ```text
348    /// [{ "a": 1 }, { "a": 2 }, { "b": 3 }]
349    /// [{ "a": 4 }, { "a": 5 }, { "b": 6 }]
350    /// ```
351    ///
352    /// By default, this would be parsed as two rows, each an array containing three elements.
353    /// With this option set to `true`, however, this would be parsed as six rows.
354    ///
355    /// Note that even with this option set to `true`, top-level objects are still permitted
356    /// and will be parsed as individual rows in the exact same manner as when this option is
357    /// set to `false`. It is even possible to mix top-level arrays with top-level objects.
358    pub fn with_flatten(self, flatten_top_level_arrays: bool) -> Self {
359        Self {
360            flatten_top_level_arrays,
361            ..self
362        }
363    }
364
365    /// Set a hook for customizing decoding behavior. See [`DecoderFactory`].
366    pub fn with_decoder_factory(self, decoder_factory: Arc<dyn DecoderFactory>) -> Self {
367        Self {
368            decoder_factory: Some(decoder_factory),
369            ..self
370        }
371    }
372
373    /// Create a [`Reader`] with the provided [`BufRead`]
374    pub fn build<R: BufRead>(self, reader: R) -> Result<Reader<R>, ArrowError> {
375        Ok(Reader {
376            reader,
377            decoder: self.build_decoder()?,
378        })
379    }
380
381    /// Create a [`Decoder`]
382    pub fn build_decoder(self) -> Result<Decoder, ArrowError> {
383        let (field, nullable) = if self.is_field {
384            let field = self.schema.fields[0].clone();
385            let nullable = field.is_nullable();
386            (field, nullable)
387        } else {
388            // The root has no field of its own; synthesize a nameless one
389            let data_type = DataType::Struct(self.schema.fields.clone());
390            (Arc::new(Field::new("", data_type, false)), false)
391        };
392
393        let ctx = DecoderContext {
394            coerce_primitive: self.coerce_primitive,
395            strict_mode: self.strict_mode,
396            struct_mode: self.struct_mode,
397            ignore_type_conflicts: self.ignore_type_conflicts,
398            decoder_factory: self.decoder_factory,
399        };
400        let decoder = ctx.make_decoder(&field, nullable)?;
401
402        let num_fields = self.schema.flattened_fields().len();
403
404        Ok(Decoder {
405            decoder,
406            is_field: self.is_field,
407            tape_decoder: TapeDecoder::new(TapeDecoderOptions {
408                batch_size: self.batch_size,
409                num_fields,
410                flatten_top_level_arrays: self.flatten_top_level_arrays,
411                allow_non_finite_floats: self.allow_non_finite_floats,
412            }),
413            batch_size: self.batch_size,
414            schema: self.schema,
415        })
416    }
417}
418
419/// Reads JSON data with a known schema directly into arrow [`RecordBatch`]
420///
421/// Lines consisting solely of ASCII whitespace are ignored
422pub struct Reader<R> {
423    reader: R,
424    decoder: Decoder,
425}
426
427impl<R> std::fmt::Debug for Reader<R> {
428    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
429        f.debug_struct("Reader")
430            .field("decoder", &self.decoder)
431            .finish()
432    }
433}
434
435impl<R: BufRead> Reader<R> {
436    /// Reads the next [`RecordBatch`] returning `Ok(None)` if EOF
437    fn read(&mut self) -> Result<Option<RecordBatch>, ArrowError> {
438        loop {
439            let buf = self.reader.fill_buf()?;
440            if buf.is_empty() {
441                break;
442            }
443            let read = buf.len();
444
445            let decoded = self.decoder.decode(buf)?;
446            self.reader.consume(decoded);
447            if decoded != read {
448                break;
449            }
450        }
451        self.decoder.flush()
452    }
453}
454
455impl<R: BufRead> Iterator for Reader<R> {
456    type Item = Result<RecordBatch, ArrowError>;
457
458    fn next(&mut self) -> Option<Self::Item> {
459        self.read().transpose()
460    }
461}
462
463impl<R: BufRead> RecordBatchReader for Reader<R> {
464    fn schema(&self) -> SchemaRef {
465        self.decoder.schema.clone()
466    }
467}
468
469/// A low-level interface for reading JSON data from a byte stream
470///
471/// See [`Reader`] for a higher-level interface for interface with [`BufRead`]
472///
473/// The push-based interface facilitates integration with sources that yield arbitrarily
474/// delimited bytes ranges, such as [`BufRead`], or a chunked byte stream received from
475/// object storage
476///
477/// ```
478/// # use std::io::BufRead;
479/// # use arrow_array::RecordBatch;
480/// # use arrow_json::reader::{Decoder, ReaderBuilder};
481/// # use arrow_schema::{ArrowError, SchemaRef};
482/// #
483/// fn read_from_json<R: BufRead>(
484///     mut reader: R,
485///     schema: SchemaRef,
486/// ) -> Result<impl Iterator<Item = Result<RecordBatch, ArrowError>>, ArrowError> {
487///     let mut decoder = ReaderBuilder::new(schema).build_decoder()?;
488///     let mut next = move || {
489///         loop {
490///             // Decoder is agnostic that buf doesn't contain whole records
491///             let buf = reader.fill_buf()?;
492///             if buf.is_empty() {
493///                 break; // Input exhausted
494///             }
495///             let read = buf.len();
496///             let decoded = decoder.decode(buf)?;
497///
498///             // Consume the number of bytes read
499///             reader.consume(decoded);
500///             if decoded != read {
501///                 break; // Read batch size
502///             }
503///         }
504///         decoder.flush()
505///     };
506///     Ok(std::iter::from_fn(move || next().transpose()))
507/// }
508/// ```
509pub struct Decoder {
510    tape_decoder: TapeDecoder,
511    decoder: Box<dyn ArrayDecoder>,
512    batch_size: usize,
513    is_field: bool,
514    schema: SchemaRef,
515}
516
517impl std::fmt::Debug for Decoder {
518    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
519        f.debug_struct("Decoder")
520            .field("schema", &self.schema)
521            .field("batch_size", &self.batch_size)
522            .finish()
523    }
524}
525
526impl Decoder {
527    /// Read JSON objects from `buf`, returning the number of bytes read
528    ///
529    /// This method returns once `batch_size` objects have been parsed since the
530    /// last call to [`Self::flush`], or `buf` is exhausted. Any remaining bytes
531    /// should be included in the next call to [`Self::decode`]
532    ///
533    /// There is no requirement that `buf` contains a whole number of records, facilitating
534    /// integration with arbitrary byte streams, such as those yielded by [`BufRead`]
535    pub fn decode(&mut self, buf: &[u8]) -> Result<usize, ArrowError> {
536        self.tape_decoder.decode(buf)
537    }
538
539    /// Serialize `rows` to this [`Decoder`]
540    ///
541    /// This provides a simple way to convert [serde]-compatible datastructures into arrow
542    /// [`RecordBatch`].
543    ///
544    /// Custom conversion logic as described in [arrow_array::builder] will likely outperform this,
545    /// especially where the schema is known at compile-time, however, this provides a mechanism
546    /// to get something up and running quickly
547    ///
548    /// It can be used with [`serde_json::Value`]
549    ///
550    /// ```
551    /// # use std::sync::Arc;
552    /// # use serde_json::{Value, json};
553    /// # use arrow_array::cast::AsArray;
554    /// # use arrow_array::types::Float32Type;
555    /// # use arrow_json::ReaderBuilder;
556    /// # use arrow_schema::{DataType, Field, Schema};
557    /// let json = vec![json!({"float": 2.3}), json!({"float": 5.7})];
558    ///
559    /// let schema = Schema::new(vec![Field::new("float", DataType::Float32, true)]);
560    /// let mut decoder = ReaderBuilder::new(Arc::new(schema)).build_decoder().unwrap();
561    ///
562    /// decoder.serialize(&json).unwrap();
563    /// let batch = decoder.flush().unwrap().unwrap();
564    /// assert_eq!(batch.num_rows(), 2);
565    /// assert_eq!(batch.num_columns(), 1);
566    /// let values = batch.column(0).as_primitive::<Float32Type>().values();
567    /// assert_eq!(values, &[2.3, 5.7])
568    /// ```
569    ///
570    /// Or with arbitrary [`Serialize`] types
571    ///
572    /// ```
573    /// # use std::sync::Arc;
574    /// # use arrow_json::ReaderBuilder;
575    /// # use arrow_schema::{DataType, Field, Schema};
576    /// # use serde::Serialize;
577    /// # use arrow_array::cast::AsArray;
578    /// # use arrow_array::types::{Float32Type, Int32Type};
579    /// #
580    /// #[derive(Serialize)]
581    /// struct MyStruct {
582    ///     int32: i32,
583    ///     float: f32,
584    /// }
585    ///
586    /// let schema = Schema::new(vec![
587    ///     Field::new("int32", DataType::Int32, false),
588    ///     Field::new("float", DataType::Float32, false),
589    /// ]);
590    ///
591    /// let rows = vec![
592    ///     MyStruct{ int32: 0, float: 3. },
593    ///     MyStruct{ int32: 4, float: 67.53 },
594    /// ];
595    ///
596    /// let mut decoder = ReaderBuilder::new(Arc::new(schema)).build_decoder().unwrap();
597    /// decoder.serialize(&rows).unwrap();
598    ///
599    /// let batch = decoder.flush().unwrap().unwrap();
600    ///
601    /// // Expect batch containing two columns
602    /// let int32 = batch.column(0).as_primitive::<Int32Type>();
603    /// assert_eq!(int32.values(), &[0, 4]);
604    ///
605    /// let float = batch.column(1).as_primitive::<Float32Type>();
606    /// assert_eq!(float.values(), &[3., 67.53]);
607    /// ```
608    ///
609    /// Or even complex nested types
610    ///
611    /// ```
612    /// # use std::collections::BTreeMap;
613    /// # use std::sync::Arc;
614    /// # use arrow_array::StructArray;
615    /// # use arrow_cast::display::{ArrayFormatter, FormatOptions};
616    /// # use arrow_json::ReaderBuilder;
617    /// # use arrow_schema::{DataType, Field, Fields, Schema};
618    /// # use serde::Serialize;
619    /// #
620    /// #[derive(Serialize)]
621    /// struct MyStruct {
622    ///     int32: i32,
623    ///     list: Vec<f64>,
624    ///     nested: Vec<Option<Nested>>,
625    /// }
626    ///
627    /// impl MyStruct {
628    ///     /// Returns the [`Fields`] for [`MyStruct`]
629    ///     fn fields() -> Fields {
630    ///         let nested = DataType::Struct(Nested::fields());
631    ///         Fields::from([
632    ///             Arc::new(Field::new("int32", DataType::Int32, false)),
633    ///             Arc::new(Field::new_list(
634    ///                 "list",
635    ///                 Field::new("element", DataType::Float64, false),
636    ///                 false,
637    ///             )),
638    ///             Arc::new(Field::new_list(
639    ///                 "nested",
640    ///                 Field::new("element", nested, true),
641    ///                 true,
642    ///             )),
643    ///         ])
644    ///     }
645    /// }
646    ///
647    /// #[derive(Serialize)]
648    /// struct Nested {
649    ///     map: BTreeMap<String, Vec<String>>
650    /// }
651    ///
652    /// impl Nested {
653    ///     /// Returns the [`Fields`] for [`Nested`]
654    ///     fn fields() -> Fields {
655    ///         let element = Field::new("element", DataType::Utf8, false);
656    ///         Fields::from([
657    ///             Arc::new(Field::new_map(
658    ///                 "map",
659    ///                 "entries",
660    ///                 Field::new("key", DataType::Utf8, false),
661    ///                 Field::new_list("value", element, false),
662    ///                 false, // sorted
663    ///                 false, // nullable
664    ///             ))
665    ///         ])
666    ///     }
667    /// }
668    ///
669    /// let data = vec![
670    ///     MyStruct {
671    ///         int32: 34,
672    ///         list: vec![1., 2., 34.],
673    ///         nested: vec![
674    ///             None,
675    ///             Some(Nested {
676    ///                 map: vec![
677    ///                     ("key1".to_string(), vec!["foo".to_string(), "bar".to_string()]),
678    ///                     ("key2".to_string(), vec!["baz".to_string()])
679    ///                 ].into_iter().collect()
680    ///             })
681    ///         ]
682    ///     },
683    ///     MyStruct {
684    ///         int32: 56,
685    ///         list: vec![],
686    ///         nested: vec![]
687    ///     },
688    ///     MyStruct {
689    ///         int32: 24,
690    ///         list: vec![-1., 245.],
691    ///         nested: vec![None]
692    ///     }
693    /// ];
694    ///
695    /// let schema = Schema::new(MyStruct::fields());
696    /// let mut decoder = ReaderBuilder::new(Arc::new(schema)).build_decoder().unwrap();
697    /// decoder.serialize(&data).unwrap();
698    /// let batch = decoder.flush().unwrap().unwrap();
699    /// assert_eq!(batch.num_rows(), 3);
700    /// assert_eq!(batch.num_columns(), 3);
701    ///
702    /// // Convert to StructArray to format
703    /// let s = StructArray::from(batch);
704    /// let options = FormatOptions::default().with_null("null");
705    /// let formatter = ArrayFormatter::try_new(&s, &options).unwrap();
706    ///
707    /// assert_eq!(&formatter.value(0).to_string(), "{int32: 34, list: [1.0, 2.0, 34.0], nested: [null, {map: {key1: [foo, bar], key2: [baz]}}]}");
708    /// assert_eq!(&formatter.value(1).to_string(), "{int32: 56, list: [], nested: []}");
709    /// assert_eq!(&formatter.value(2).to_string(), "{int32: 24, list: [-1.0, 245.0], nested: [null]}");
710    /// ```
711    ///
712    /// Note: this ignores any batch size setting, and always decodes all rows
713    ///
714    /// [serde]: https://docs.rs/serde/latest/serde/
715    pub fn serialize<S: Serialize>(&mut self, rows: &[S]) -> Result<(), ArrowError> {
716        self.tape_decoder.serialize(rows)
717    }
718
719    /// True if the decoder is currently part way through decoding a record.
720    pub fn has_partial_record(&self) -> bool {
721        self.tape_decoder.has_partial_row()
722    }
723
724    /// The number of unflushed records, including the partially decoded record (if any).
725    pub fn len(&self) -> usize {
726        self.tape_decoder.num_buffered_rows()
727    }
728
729    /// True if there are no records to flush, i.e. [`Self::len`] is zero.
730    pub fn is_empty(&self) -> bool {
731        self.len() == 0
732    }
733
734    /// Flushes the currently buffered data to a [`RecordBatch`]
735    ///
736    /// Returns `Ok(None)` if no buffered data, i.e. [`Self::is_empty`] is true.
737    ///
738    /// Note: This will return an error if called part way through decoding a record,
739    /// i.e. [`Self::has_partial_record`] is true.
740    pub fn flush(&mut self) -> Result<Option<RecordBatch>, ArrowError> {
741        let tape = self.tape_decoder.finish()?;
742
743        if tape.num_rows() == 0 {
744            return Ok(None);
745        }
746
747        // First offset is null sentinel
748        let mut next_object = 1;
749        let pos = (0..tape.num_rows())
750            .map(|_| {
751                let next = tape.next(next_object, "row")?;
752                Ok(std::mem::replace(&mut next_object, next))
753            })
754            .collect::<Result<Vec<_>, ArrowError>>()?;
755
756        let decoded = self.decoder.decode(&tape, &pos)?;
757        self.tape_decoder.clear();
758
759        let batch = match self.is_field {
760            true => RecordBatch::try_new(self.schema.clone(), vec![decoded])?,
761            false => {
762                RecordBatch::from(decoded.as_struct().clone()).with_schema(self.schema.clone())?
763            }
764        };
765
766        Ok(Some(batch))
767    }
768}
769
770/// Decodes a column of JSON values from a [`Tape`] into an [`ArrayRef`]
771///
772/// Implement alongside [`DecoderFactory`] to override or add support for a type.
773pub trait ArrayDecoder: Send {
774    /// Decode elements from `tape` starting at the indexes contained in `pos`
775    ///
776    /// `pos` contains one tape index per output row, so the returned array must have
777    /// exactly `pos.len()` elements and the field's data type. A row's value may be
778    /// [`TapeElement::Null`].
779    fn decode(&mut self, tape: &Tape<'_>, pos: &[u32]) -> Result<ArrayRef, ArrowError>;
780}
781
782/// A trait to create custom decoders for specific data types.
783///
784/// Overrides the reader's decoder for a data type, or adds support for one it does not
785/// handle. The reader-side counterpart of [`EncoderFactory`]; register an
786/// implementation with [`ReaderBuilder::with_decoder_factory`].
787///
788/// # Example: Decode `Binary` from a JSON array of integers
789///
790/// This example shows how to decode a `Binary` column from a JSON array of
791/// integers, e.g. `[104, 105]` for the bytes `b"hi"`, as created by the
792/// example in [`EncoderFactory`].
793///
794/// ```
795/// # use std::sync::Arc;
796/// # use arrow_array::{Array, ArrayRef, BinaryArray};
797/// # use arrow_array::types::Float64Type;
798/// # use arrow_array::cast::AsArray;
799/// # use arrow_json::reader::{ArrayDecoder, DecoderContext, DecoderFactory, Tape, TapeElement};
800/// # use arrow_json::ReaderBuilder;
801/// # use arrow_schema::{ArrowError, DataType, Field, FieldRef, Fields, Schema};
802///
803/// /// Decodes `[104, 105]` into the bytes `b"hi"`
804/// struct IntArrayBinaryDecoder;
805///
806/// impl ArrayDecoder for IntArrayBinaryDecoder {
807///     fn decode(&mut self, tape: &Tape<'_>, pos: &[u32]) -> Result<ArrayRef, ArrowError> {
808///         let mut values: Vec<Option<Vec<u8>>> = Vec::with_capacity(pos.len());
809///         for p in pos {
810///             match tape.get(*p) {
811///                 TapeElement::Null => values.push(None),
812///                 TapeElement::StartList(end) => {
813///                     let mut bytes = Vec::new();
814///                     let mut cur = p + 1;
815///                     while cur < end {
816///                         match tape.get(cur) {
817///                             // JSON text yields `Number`; serde yields `I32`
818///                             TapeElement::Number(idx) => {
819///                                 let s = tape.get_string(idx);
820///                                 bytes.push(s.parse::<u8>().map_err(|e| {
821///                                     ArrowError::JsonError(format!("invalid byte {s}: {e}"))
822///                                 })?);
823///                             }
824///                             TapeElement::I32(v) => bytes.push(v as u8),
825///                             _ => return Err(tape.error(cur, "byte")),
826///                         }
827///                         cur = tape.next(cur, "byte")?;
828///                     }
829///                     values.push(Some(bytes));
830///                 }
831///                 _ => return Err(tape.error(*p, "list of bytes")),
832///             }
833///         }
834///         Ok(Arc::new(BinaryArray::from_iter(values.iter().map(|v| v.as_deref()))))
835///     }
836/// }
837///
838/// /// A factory that overrides the reader's default decoder for `Binary` to decode from an array of integers
839/// #[derive(Debug)]
840/// struct IntArrayBinaryDecoderFactory;
841///
842/// impl DecoderFactory for IntArrayBinaryDecoderFactory {
843///     fn make_default_decoder(
844///         &self,
845///         ctx: &DecoderContext,
846///         field: &FieldRef,
847///         is_nullable: bool,
848///     ) -> Result<Option<Box<dyn ArrayDecoder>>, ArrowError> {
849///         match field.data_type() {
850///             DataType::Binary => Ok(Some(Box::new(IntArrayBinaryDecoder))),
851///             // Returning `None` uses the reader's default decoder
852///             _ => Ok(None),
853///         }
854///     }
855/// }
856///
857/// let nested = Fields::from(vec![Field::new("inner", DataType::Binary, true)]);
858/// let schema = Arc::new(Schema::new(vec![
859///     Field::new("bytes", DataType::Binary, true),
860///     Field::new("float", DataType::Float64, true),
861///     Field::new("nested", DataType::Struct(nested), true),
862/// ]));
863///
864/// let json = r#"{"bytes": [104, 105], "float": 1.0, "nested": {"inner": [104, 105]}}
865/// {"float": 2.3}
866/// {"bytes": [98], "nested": {"inner": [98]}}
867/// "#;
868///
869/// let batch = ReaderBuilder::new(schema)
870///     .with_decoder_factory(Arc::new(IntArrayBinaryDecoderFactory))
871///     .build(json.as_bytes())
872///     .unwrap()
873///     .next()
874///     .unwrap()
875///     .unwrap();
876///
877/// let bytes = batch.column(0).as_binary::<i32>();
878/// assert_eq!(bytes.value(0), b"hi");
879/// assert!(bytes.is_null(1));
880/// assert_eq!(bytes.value(2), b"b");
881///
882/// // The override applies wherever `Binary` appears, including nested, while types
883/// // the factory declines are decoded as usual
884/// let inner = batch.column(2).as_struct().column(0).as_binary::<i32>();
885/// assert_eq!(inner.value(0), b"hi");
886/// assert_eq!(batch.column(1).as_primitive::<Float64Type>().value(0), 1.0);
887/// ```
888///
889/// # Example: Decode an [extension type] from a JSON string
890///
891/// The choice of decoder can also depend on field metadata rather than just
892/// the data type, for example to recognize an [extension type]. The reader's
893/// own decoder for the field can be invoked with
894/// [`DecoderContext::make_builtin_decoder`].
895///
896/// This example upper-cases the strings produced by the builtin `Utf8` decoder
897/// for a fictional extension type `apache.shout`.
898///
899/// ```
900/// # use std::sync::Arc;
901/// # use arrow_array::{ArrayRef, StringArray};
902/// # use arrow_array::cast::AsArray;
903/// # use arrow_json::reader::{ArrayDecoder, DecoderContext, DecoderFactory, Tape};
904/// # use arrow_json::ReaderBuilder;
905/// # use arrow_schema::{ArrowError, DataType, Field, FieldRef, Schema};
906/// # use arrow_schema::extension::EXTENSION_TYPE_NAME_KEY;
907///
908/// /// Upper-cases whatever the reader's own decoder produced
909/// struct ShoutDecoder(Box<dyn ArrayDecoder>);
910///
911/// impl ArrayDecoder for ShoutDecoder {
912///     fn decode(&mut self, tape: &Tape<'_>, pos: &[u32]) -> Result<ArrayRef, ArrowError> {
913///         let inner = self.0.decode(tape, pos)?;
914///         let values = inner.as_string::<i32>();
915///         Ok(Arc::new(StringArray::from_iter(
916///             values.iter().map(|v| v.map(str::to_uppercase)),
917///         )))
918///     }
919/// }
920///
921/// /// A factory that recognizes the `apache.shout` extension type and upper-cases its strings
922/// #[derive(Debug)]
923/// struct ShoutDecoderFactory;
924///
925/// impl DecoderFactory for ShoutDecoderFactory {
926///     fn make_default_decoder(
927///         &self,
928///         ctx: &DecoderContext,
929///         field: &FieldRef,
930///         is_nullable: bool,
931///     ) -> Result<Option<Box<dyn ArrayDecoder>>, ArrowError> {
932///         if field.metadata().get(EXTENSION_TYPE_NAME_KEY).map(String::as_str)
933///             == Some("apache.shout")
934///         {
935///             let inner = ctx.make_builtin_decoder(field, is_nullable)?;
936///             return Ok(Some(Box::new(ShoutDecoder(inner))));
937///         }
938///         Ok(None)
939///     }
940/// }
941///
942/// let schema = Arc::new(Schema::new(vec![
943///     Field::new("shout", DataType::Utf8, true)
944///         .with_metadata([(EXTENSION_TYPE_NAME_KEY, "apache.shout")]),
945///     Field::new("plain", DataType::Utf8, true),
946/// ]));
947///
948/// let json = r#"{"shout": "hi", "plain": "hi"}"#;
949///
950/// let batch = ReaderBuilder::new(schema)
951///     .with_decoder_factory(Arc::new(ShoutDecoderFactory))
952///     .build(json.as_bytes())
953///     .unwrap()
954///     .next()
955///     .unwrap()
956///     .unwrap();
957///
958/// // Dispatched on metadata, and decoded by the reader's own `Utf8` decoder
959/// assert_eq!(batch.column(0).as_string::<i32>().value(0), "HI");
960/// // The factory declines fields without the extension type, so they are decoded as usual
961/// assert_eq!(batch.column(1).as_string::<i32>().value(0), "hi");
962/// ```
963///
964/// [`EncoderFactory`]: crate::EncoderFactory
965/// [extension type]: https://arrow.apache.org/docs/format/Columnar.html#extension-types
966pub trait DecoderFactory: std::fmt::Debug + Send + Sync {
967    /// Make a decoder for `field`, or `Ok(None)` to use the reader's default.
968    ///
969    /// Receives the [`FieldRef`] rather than just its [`DataType`] so decoder
970    /// selection can consider the field's metadata, e.g. to identify [extension
971    /// types]. The root of a [`ReaderBuilder::new`] schema is presented as a
972    /// synthesized nameless `Struct` field.
973    ///
974    /// Use [`DecoderContext::make_decoder`] on `ctx` to build child decoders, and
975    /// [`DecoderContext::make_builtin_decoder`] to build on the reader's own decoder
976    /// for this field. Calling `make_decoder` with the field this was invoked with
977    /// recurses back here and loops.
978    ///
979    /// `is_nullable` folds in ancestor nullability, so it may differ from
980    /// `field.is_nullable()` in either direction: a nullable struct widens its
981    /// children, while a run-end encoded array narrows its values.
982    ///
983    /// [extension types]: https://arrow.apache.org/docs/format/Columnar.html#extension-types
984    fn make_default_decoder(
985        &self,
986        _ctx: &DecoderContext,
987        _field: &FieldRef,
988        _is_nullable: bool,
989    ) -> Result<Option<Box<dyn ArrayDecoder>>, ArrowError> {
990        Ok(None)
991    }
992}
993
994/// Validates the output of a [`DecoderFactory`] decoder before it reaches the arrays
995/// built from it, some of which are constructed without further checks.
996struct CheckedDecoder {
997    inner: Box<dyn ArrayDecoder>,
998    data_type: DataType,
999}
1000
1001impl ArrayDecoder for CheckedDecoder {
1002    fn decode(&mut self, tape: &Tape<'_>, pos: &[u32]) -> Result<ArrayRef, ArrowError> {
1003        let array = self.inner.decode(tape, pos)?;
1004        if array.data_type() != &self.data_type {
1005            return Err(ArrowError::JsonError(format!(
1006                "custom decoder returned {} for a field of type {}",
1007                array.data_type(),
1008                self.data_type
1009            )));
1010        }
1011        if array.len() != pos.len() {
1012            return Err(ArrowError::JsonError(format!(
1013                "custom decoder returned {} values for {} rows",
1014                array.len(),
1015                pos.len()
1016            )));
1017        }
1018        Ok(array)
1019    }
1020}
1021
1022/// Context for decoder creation, containing configuration.
1023///
1024/// This context is passed through the decoder creation process and contains
1025/// all the configuration needed to create decoders recursively.
1026pub struct DecoderContext {
1027    /// Whether to coerce primitives to strings
1028    coerce_primitive: bool,
1029    /// Whether to validate struct fields strictly
1030    strict_mode: bool,
1031    /// How to decode struct fields
1032    struct_mode: StructMode,
1033    /// Whether to treat columns with incompatible types as missing (i.e. NULL)
1034    ignore_type_conflicts: bool,
1035    /// An optional hook for customizing decoding behavior
1036    decoder_factory: Option<Arc<dyn DecoderFactory>>,
1037}
1038
1039impl DecoderContext {
1040    /// Returns whether to coerce primitive types (e.g., number to string)
1041    pub fn coerce_primitive(&self) -> bool {
1042        self.coerce_primitive
1043    }
1044
1045    /// Returns whether to validate struct fields strictly
1046    pub fn strict_mode(&self) -> bool {
1047        self.strict_mode
1048    }
1049
1050    /// Returns how to decode struct fields
1051    pub fn struct_mode(&self) -> StructMode {
1052        self.struct_mode
1053    }
1054
1055    /// Returns whether to treat columns with incompatible types as missing (i.e. NULL)
1056    pub fn ignore_type_conflicts(&self) -> bool {
1057        self.ignore_type_conflicts
1058    }
1059
1060    /// Returns the optional hook for customizing decoding behavior
1061    pub fn decoder_factory(&self) -> Option<&Arc<dyn DecoderFactory>> {
1062        self.decoder_factory.as_ref()
1063    }
1064
1065    /// Create a decoder for a type.
1066    ///
1067    /// This is the standard way to create child decoders from within a decoder
1068    /// implementation.
1069    pub fn make_decoder(
1070        &self,
1071        field: &FieldRef,
1072        is_nullable: bool,
1073    ) -> Result<Box<dyn ArrayDecoder>, ArrowError> {
1074        make_decoder(self, field, is_nullable)
1075    }
1076
1077    /// Create the decoder the reader would use for `field`, ignoring any
1078    /// [`DecoderFactory`].
1079    ///
1080    /// Lets a factory build on the reader's own decoder, including for the field it was
1081    /// asked about — which [`Self::make_decoder`] cannot do without looping.
1082    pub fn make_builtin_decoder(
1083        &self,
1084        field: &FieldRef,
1085        is_nullable: bool,
1086    ) -> Result<Box<dyn ArrayDecoder>, ArrowError> {
1087        make_builtin_decoder(self, field, is_nullable)
1088    }
1089}
1090
1091fn make_decoder(
1092    ctx: &DecoderContext,
1093    field: &FieldRef,
1094    is_nullable: bool,
1095) -> Result<Box<dyn ArrayDecoder>, ArrowError> {
1096    if let Some(factory) = ctx.decoder_factory()
1097        && let Some(decoder) = factory.make_default_decoder(ctx, field, is_nullable)?
1098    {
1099        return Ok(Box::new(CheckedDecoder {
1100            inner: decoder,
1101            data_type: field.data_type().clone(),
1102        }));
1103    }
1104
1105    make_builtin_decoder(ctx, field, is_nullable)
1106}
1107
1108fn make_builtin_decoder(
1109    ctx: &DecoderContext,
1110    field: &FieldRef,
1111    is_nullable: bool,
1112) -> Result<Box<dyn ArrayDecoder>, ArrowError> {
1113    let data_type = field.data_type();
1114
1115    macro_rules! primitive_decoder {
1116        ($t:ty, $data_type:expr) => {
1117            Ok(Box::new(PrimitiveArrayDecoder::<$t>::new(ctx, $data_type)))
1118        };
1119    }
1120    macro_rules! timestamp_decoder {
1121        ($t:ty, $data_type:expr, $tz:expr) => {{
1122            Ok(Box::new(TimestampArrayDecoder::<$t, _>::new(
1123                ctx, $data_type, $tz,
1124            )))
1125        }};
1126    }
1127    macro_rules! decimal_decoder {
1128        ($t:ty, $p:expr, $s:expr) => {
1129            Ok(Box::new(DecimalArrayDecoder::<$t>::new(ctx, $p, $s)))
1130        };
1131    }
1132
1133    downcast_integer! {
1134        *data_type => (primitive_decoder, data_type),
1135        DataType::Null => Ok(Box::new(NullArrayDecoder::new(ctx))),
1136        DataType::Float16 => primitive_decoder!(Float16Type, data_type),
1137        DataType::Float32 => primitive_decoder!(Float32Type, data_type),
1138        DataType::Float64 => primitive_decoder!(Float64Type, data_type),
1139        DataType::Timestamp(TimeUnit::Second, None) => {
1140            timestamp_decoder!(TimestampSecondType, data_type, Utc)
1141        },
1142        DataType::Timestamp(TimeUnit::Millisecond, None) => {
1143            timestamp_decoder!(TimestampMillisecondType, data_type, Utc)
1144        },
1145        DataType::Timestamp(TimeUnit::Microsecond, None) => {
1146            timestamp_decoder!(TimestampMicrosecondType, data_type, Utc)
1147        },
1148        DataType::Timestamp(TimeUnit::Nanosecond, None) => {
1149            timestamp_decoder!(TimestampNanosecondType, data_type, Utc)
1150        },
1151        DataType::Timestamp(TimeUnit::Second, Some(ref tz)) => {
1152            let tz: Tz = tz.parse()?;
1153            timestamp_decoder!(TimestampSecondType, data_type, tz)
1154        },
1155        DataType::Timestamp(TimeUnit::Millisecond, Some(ref tz)) => {
1156            let tz: Tz = tz.parse()?;
1157            timestamp_decoder!(TimestampMillisecondType, data_type, tz)
1158        },
1159        DataType::Timestamp(TimeUnit::Microsecond, Some(ref tz)) => {
1160            let tz: Tz = tz.parse()?;
1161            timestamp_decoder!(TimestampMicrosecondType, data_type, tz)
1162        },
1163        DataType::Timestamp(TimeUnit::Nanosecond, Some(ref tz)) => {
1164            let tz: Tz = tz.parse()?;
1165            timestamp_decoder!(TimestampNanosecondType, data_type, tz)
1166        },
1167        DataType::Date32 => primitive_decoder!(Date32Type, data_type),
1168        DataType::Date64 => primitive_decoder!(Date64Type, data_type),
1169        DataType::Time32(TimeUnit::Second) => primitive_decoder!(Time32SecondType, data_type),
1170        DataType::Time32(TimeUnit::Millisecond) => primitive_decoder!(Time32MillisecondType, data_type),
1171        DataType::Time64(TimeUnit::Microsecond) => primitive_decoder!(Time64MicrosecondType, data_type),
1172        DataType::Time64(TimeUnit::Nanosecond) => primitive_decoder!(Time64NanosecondType, data_type),
1173        DataType::Duration(TimeUnit::Nanosecond) => primitive_decoder!(DurationNanosecondType, data_type),
1174        DataType::Duration(TimeUnit::Microsecond) => primitive_decoder!(DurationMicrosecondType, data_type),
1175        DataType::Duration(TimeUnit::Millisecond) => primitive_decoder!(DurationMillisecondType, data_type),
1176        DataType::Duration(TimeUnit::Second) => primitive_decoder!(DurationSecondType, data_type),
1177        DataType::Decimal32(p, s) => decimal_decoder!(Decimal32Type, p, s),
1178        DataType::Decimal64(p, s) => decimal_decoder!(Decimal64Type, p, s),
1179        DataType::Decimal128(p, s) => decimal_decoder!(Decimal128Type, p, s),
1180        DataType::Decimal256(p, s) => decimal_decoder!(Decimal256Type, p, s),
1181        DataType::Boolean => Ok(Box::new(BooleanArrayDecoder::new(ctx))),
1182        DataType::Utf8 => Ok(Box::new(StringArrayDecoder::<i32>::new(ctx))),
1183        DataType::Utf8View => Ok(Box::new(StringViewArrayDecoder::new(ctx))),
1184        DataType::LargeUtf8 => Ok(Box::new(StringArrayDecoder::<i64>::new(ctx))),
1185        DataType::List(_) => Ok(Box::new(ListArrayDecoder::<i32>::new(ctx, data_type, is_nullable)?)),
1186        DataType::LargeList(_) => Ok(Box::new(ListArrayDecoder::<i64>::new(ctx, data_type, is_nullable)?)),
1187        DataType::ListView(_) => Ok(Box::new(ListViewArrayDecoder::<i32>::new(ctx, data_type, is_nullable)?)),
1188        DataType::LargeListView(_) => Ok(Box::new(ListViewArrayDecoder::<i64>::new(ctx, data_type, is_nullable)?)),
1189        DataType::FixedSizeList(_, _) => Ok(Box::new(FixedSizeListArrayDecoder::new(ctx, data_type, is_nullable)?)),
1190        DataType::Struct(_) => Ok(Box::new(StructArrayDecoder::new(ctx, data_type, is_nullable)?)),
1191        DataType::Binary => Ok(Box::new(BinaryArrayDecoder::<i32>::default())),
1192        DataType::LargeBinary => Ok(Box::new(BinaryArrayDecoder::<i64>::default())),
1193        DataType::FixedSizeBinary(len) => Ok(Box::new(FixedSizeBinaryArrayDecoder::new(len))),
1194        DataType::BinaryView => Ok(Box::new(BinaryViewDecoder::default())),
1195        DataType::Map(_, _) => Ok(Box::new(MapArrayDecoder::new(ctx, data_type, is_nullable)?)),
1196        DataType::RunEndEncoded(ref r, _) => match r.data_type() {
1197            DataType::Int16 => Ok(Box::new(RunEndEncodedArrayDecoder::<Int16Type>::new(ctx, data_type, is_nullable)?)),
1198            DataType::Int32 => Ok(Box::new(RunEndEncodedArrayDecoder::<Int32Type>::new(ctx, data_type, is_nullable)?)),
1199            DataType::Int64 => Ok(Box::new(RunEndEncodedArrayDecoder::<Int64Type>::new(ctx, data_type, is_nullable)?)),
1200            d => unreachable!("unsupported run end index type: {d}"),
1201        },
1202        _ => Err(ArrowError::NotYetImplemented(format!("Support for {data_type} in JSON reader")))
1203    }
1204}
1205
1206#[cfg(test)]
1207mod tests {
1208    use arrow_array::cast::AsArray;
1209    use arrow_array::{
1210        Array, BooleanArray, Float64Array, GenericListViewArray, Int32Array, ListArray, MapArray,
1211        NullArray, OffsetSizeTrait, StringArray, StringViewArray, StructArray,
1212    };
1213    use arrow_buffer::{ArrowNativeType, NullBuffer, OffsetBuffer, ScalarBuffer};
1214    use arrow_cast::display::{ArrayFormatter, FormatOptions};
1215    use arrow_schema::{Field, Fields};
1216    use serde_json::json;
1217    use std::fs::File;
1218    use std::io::{BufReader, Cursor, Seek};
1219    use std::sync::Mutex;
1220
1221    use super::*;
1222
1223    fn do_read(
1224        buf: &str,
1225        batch_size: usize,
1226        coerce_primitive: bool,
1227        strict_mode: bool,
1228        schema: SchemaRef,
1229    ) -> Vec<RecordBatch> {
1230        let config = ReaderBuilder::new(schema)
1231            .with_batch_size(batch_size)
1232            .with_strict_mode(strict_mode)
1233            .with_coerce_primitive(coerce_primitive);
1234        do_read_config(buf, config)
1235    }
1236
1237    fn do_read_config(buf: &str, builder: ReaderBuilder) -> Vec<RecordBatch> {
1238        let mut unbuffered = vec![];
1239
1240        // Test with different batch sizes to test for boundary conditions
1241        for batch_size in [1, 3, 100, builder.batch_size] {
1242            unbuffered = builder
1243                .clone()
1244                .with_batch_size(batch_size)
1245                .build(Cursor::new(buf.as_bytes()))
1246                .unwrap()
1247                .collect::<Result<Vec<_>, _>>()
1248                .unwrap();
1249
1250            for b in unbuffered.iter().take(unbuffered.len() - 1) {
1251                assert_eq!(b.num_rows(), batch_size)
1252            }
1253
1254            // Test with different buffer sizes to test for boundary conditions
1255            for b in [1, 3, 5] {
1256                let buffered = builder
1257                    .clone()
1258                    .with_batch_size(batch_size)
1259                    .build(BufReader::with_capacity(b, Cursor::new(buf.as_bytes())))
1260                    .unwrap()
1261                    .collect::<Result<Vec<_>, _>>()
1262                    .unwrap();
1263                assert_eq!(unbuffered, buffered);
1264            }
1265        }
1266
1267        unbuffered
1268    }
1269
1270    #[test]
1271    fn test_basic() {
1272        let buf = r#"
1273        {"a": 1, "b": 2, "c": true, "d": 1}
1274        {"a": 2E0, "b": 4, "c": false, "d": 2, "e": 254}
1275
1276        {"b": 6, "a": 2.0, "d": 45}
1277        {"b": "5", "a": 2}
1278        {"b": 4e0}
1279        {"b": 7, "a": null}
1280        "#;
1281
1282        let schema = Arc::new(Schema::new(vec![
1283            Field::new("a", DataType::Int64, true),
1284            Field::new("b", DataType::Int32, true),
1285            Field::new("c", DataType::Boolean, true),
1286            Field::new("d", DataType::Date32, true),
1287            Field::new("e", DataType::Date64, true),
1288        ]));
1289
1290        let mut decoder = ReaderBuilder::new(schema.clone()).build_decoder().unwrap();
1291        assert!(decoder.is_empty());
1292        assert_eq!(decoder.len(), 0);
1293        assert!(!decoder.has_partial_record());
1294        assert_eq!(decoder.decode(buf.as_bytes()).unwrap(), 221);
1295        assert!(!decoder.is_empty());
1296        assert_eq!(decoder.len(), 6);
1297        assert!(!decoder.has_partial_record());
1298        let batch = decoder.flush().unwrap().unwrap();
1299        assert_eq!(batch.num_rows(), 6);
1300        assert!(decoder.is_empty());
1301        assert_eq!(decoder.len(), 0);
1302        assert!(!decoder.has_partial_record());
1303
1304        let batches = do_read(buf, 1024, false, false, schema);
1305        assert_eq!(batches.len(), 1);
1306
1307        let col1 = batches[0].column(0).as_primitive::<Int64Type>();
1308        assert_eq!(col1.null_count(), 2);
1309        assert_eq!(col1.values(), &[1, 2, 2, 2, 0, 0]);
1310        assert!(col1.is_null(4));
1311        assert!(col1.is_null(5));
1312
1313        let col2 = batches[0].column(1).as_primitive::<Int32Type>();
1314        assert_eq!(col2.null_count(), 0);
1315        assert_eq!(col2.values(), &[2, 4, 6, 5, 4, 7]);
1316
1317        let col3 = batches[0].column(2).as_boolean();
1318        assert_eq!(col3.null_count(), 4);
1319        assert!(col3.value(0));
1320        assert!(!col3.is_null(0));
1321        assert!(!col3.value(1));
1322        assert!(!col3.is_null(1));
1323
1324        let col4 = batches[0].column(3).as_primitive::<Date32Type>();
1325        assert_eq!(col4.null_count(), 3);
1326        assert!(col4.is_null(3));
1327        assert_eq!(col4.values(), &[1, 2, 45, 0, 0, 0]);
1328
1329        let col5 = batches[0].column(4).as_primitive::<Date64Type>();
1330        assert_eq!(col5.null_count(), 5);
1331        assert!(col5.is_null(0));
1332        assert!(col5.is_null(2));
1333        assert!(col5.is_null(3));
1334        assert_eq!(col5.values(), &[0, 254, 0, 0, 0, 0]);
1335    }
1336
1337    #[test]
1338    fn test_string() {
1339        let buf = r#"
1340        {"a": "1", "b": "2"}
1341        {"a": "hello", "b": "shoo"}
1342        {"b": "\t😁foo", "a": "\nfoobar\ud83d\ude00\u0061\u0073\u0066\u0067\u00FF"}
1343
1344        {"b": null}
1345        {"b": "", "a": null}
1346
1347        "#;
1348        let schema = Arc::new(Schema::new(vec![
1349            Field::new("a", DataType::Utf8, true),
1350            Field::new("b", DataType::LargeUtf8, true),
1351        ]));
1352
1353        let batches = do_read(buf, 1024, false, false, schema);
1354        assert_eq!(batches.len(), 1);
1355
1356        let col1 = batches[0].column(0).as_string::<i32>();
1357        assert_eq!(col1.null_count(), 2);
1358        assert_eq!(col1.value(0), "1");
1359        assert_eq!(col1.value(1), "hello");
1360        assert_eq!(col1.value(2), "\nfoobar😀asfgÿ");
1361        assert!(col1.is_null(3));
1362        assert!(col1.is_null(4));
1363
1364        let col2 = batches[0].column(1).as_string::<i64>();
1365        assert_eq!(col2.null_count(), 1);
1366        assert_eq!(col2.value(0), "2");
1367        assert_eq!(col2.value(1), "shoo");
1368        assert_eq!(col2.value(2), "\t😁foo");
1369        assert!(col2.is_null(3));
1370        assert_eq!(col2.value(4), "");
1371    }
1372
1373    #[test]
1374    fn test_long_string_view_allocation() {
1375        // The JSON input contains field "a" with different string lengths.
1376        // According to the implementation in the decoder:
1377        // - For a string, capacity is only increased if its length > 12 bytes.
1378        // Therefore, for:
1379        // Row 1: "short" (5 bytes) -> capacity += 0
1380        // Row 2: "this is definitely long" (24 bytes) -> capacity += 24
1381        // Row 3: "hello" (5 bytes) -> capacity += 0
1382        // Row 4: "\nfoobar😀asfgÿ" (17 bytes) -> capacity += 17
1383        // Expected total capacity = 24 + 17 = 41
1384        let expected_capacity: usize = 41;
1385
1386        let buf = r#"
1387        {"a": "short", "b": "dummy"}
1388        {"a": "this is definitely long", "b": "dummy"}
1389        {"a": "hello", "b": "dummy"}
1390        {"a": "\nfoobar😀asfgÿ", "b": "dummy"}
1391        "#;
1392
1393        let schema = Arc::new(Schema::new(vec![
1394            Field::new("a", DataType::Utf8View, true),
1395            Field::new("b", DataType::LargeUtf8, true),
1396        ]));
1397
1398        let batches = do_read(buf, 1024, false, false, schema);
1399        assert_eq!(batches.len(), 1, "Expected one record batch");
1400
1401        // Get the first column ("a") as a StringViewArray.
1402        let col_a = batches[0].column(0);
1403        let string_view_array = col_a
1404            .as_any()
1405            .downcast_ref::<StringViewArray>()
1406            .expect("Column should be a StringViewArray");
1407
1408        // Retrieve the underlying data buffer from the array.
1409        // The builder pre-allocates capacity based on the sum of lengths for long strings.
1410        let data_buffer = string_view_array.to_data().buffers()[0].len();
1411
1412        // Check that the allocated capacity is at least what we expected.
1413        // (The actual buffer may be larger than expected due to rounding or internal allocation strategies.)
1414        assert!(
1415            data_buffer >= expected_capacity,
1416            "Data buffer length ({data_buffer}) should be at least {expected_capacity}",
1417        );
1418
1419        // Additionally, verify that the decoded values are correct.
1420        assert_eq!(string_view_array.value(0), "short");
1421        assert_eq!(string_view_array.value(1), "this is definitely long");
1422        assert_eq!(string_view_array.value(2), "hello");
1423        assert_eq!(string_view_array.value(3), "\nfoobar😀asfgÿ");
1424    }
1425
1426    /// Test the memory capacity allocation logic when converting numeric types to strings.
1427    #[test]
1428    fn test_numeric_view_allocation() {
1429        // For numeric types, the expected capacity calculation is as follows:
1430        // Row 1: 123456789  -> Number converts to the string "123456789" (length 9), 9 <= 12, so no capacity is added.
1431        // Row 2: 1000000000000 -> Treated as an I64 number; its string is "1000000000000" (length 13),
1432        //                        which is >12 and its absolute value is > 999_999_999_999, so 13 bytes are added.
1433        // Row 3: 3.1415 -> F32 number, a fixed estimate of 10 bytes is added.
1434        // Row 4: 2.718281828459045 -> F64 number, a fixed estimate of 10 bytes is added.
1435        // Total expected capacity = 13 + 10 + 10 = 33 bytes.
1436        let expected_capacity: usize = 33;
1437
1438        let buf = r#"
1439    {"n": 123456789}
1440    {"n": 1000000000000}
1441    {"n": 3.1415}
1442    {"n": 2.718281828459045}
1443    "#;
1444
1445        let schema = Arc::new(Schema::new(vec![Field::new("n", DataType::Utf8View, true)]));
1446
1447        let batches = do_read(buf, 1024, true, false, schema);
1448        assert_eq!(batches.len(), 1, "Expected one record batch");
1449
1450        let col_n = batches[0].column(0);
1451        let string_view_array = col_n
1452            .as_any()
1453            .downcast_ref::<StringViewArray>()
1454            .expect("Column should be a StringViewArray");
1455
1456        // Check that the underlying data buffer capacity is at least the expected value.
1457        let data_buffer = string_view_array.to_data().buffers()[0].len();
1458        assert!(
1459            data_buffer >= expected_capacity,
1460            "Data buffer length ({data_buffer}) should be at least {expected_capacity}",
1461        );
1462
1463        // Verify that the converted string values are correct.
1464        // Note: The format of the number converted to a string should match the actual implementation.
1465        assert_eq!(string_view_array.value(0), "123456789");
1466        assert_eq!(string_view_array.value(1), "1000000000000");
1467        assert_eq!(string_view_array.value(2), "3.1415");
1468        assert_eq!(string_view_array.value(3), "2.718281828459045");
1469    }
1470
1471    #[test]
1472    fn test_string_with_uft8view() {
1473        let buf = r#"
1474        {"a": "1", "b": "2"}
1475        {"a": "hello", "b": "shoo"}
1476        {"b": "\t😁foo", "a": "\nfoobar\ud83d\ude00\u0061\u0073\u0066\u0067\u00FF"}
1477
1478        {"b": null}
1479        {"b": "", "a": null}
1480
1481        "#;
1482        let schema = Arc::new(Schema::new(vec![
1483            Field::new("a", DataType::Utf8View, true),
1484            Field::new("b", DataType::LargeUtf8, true),
1485        ]));
1486
1487        let batches = do_read(buf, 1024, false, false, schema);
1488        assert_eq!(batches.len(), 1);
1489
1490        let col1 = batches[0].column(0).as_string_view();
1491        assert_eq!(col1.null_count(), 2);
1492        assert_eq!(col1.value(0), "1");
1493        assert_eq!(col1.value(1), "hello");
1494        assert_eq!(col1.value(2), "\nfoobar😀asfgÿ");
1495        assert!(col1.is_null(3));
1496        assert!(col1.is_null(4));
1497        assert_eq!(col1.data_type(), &DataType::Utf8View);
1498
1499        let col2 = batches[0].column(1).as_string::<i64>();
1500        assert_eq!(col2.null_count(), 1);
1501        assert_eq!(col2.value(0), "2");
1502        assert_eq!(col2.value(1), "shoo");
1503        assert_eq!(col2.value(2), "\t😁foo");
1504        assert!(col2.is_null(3));
1505        assert_eq!(col2.value(4), "");
1506    }
1507
1508    #[test]
1509    fn test_complex() {
1510        let buf = r#"
1511           {"list": [], "nested": {"a": 1, "b": 2}, "nested_list": {"list2": [{"c": 3}, {"c": 4}]}}
1512           {"list": [5, 6], "nested": {"a": 7}, "nested_list": {"list2": []}}
1513           {"list": null, "nested": {"a": null}}
1514        "#;
1515
1516        let schema = Arc::new(Schema::new(vec![
1517            Field::new_list("list", Field::new("element", DataType::Int32, false), true),
1518            Field::new_struct(
1519                "nested",
1520                vec![
1521                    Field::new("a", DataType::Int32, true),
1522                    Field::new("b", DataType::Int32, true),
1523                ],
1524                true,
1525            ),
1526            Field::new_struct(
1527                "nested_list",
1528                vec![Field::new_list(
1529                    "list2",
1530                    Field::new_struct(
1531                        "element",
1532                        vec![Field::new("c", DataType::Int32, false)],
1533                        false,
1534                    ),
1535                    true,
1536                )],
1537                true,
1538            ),
1539        ]));
1540
1541        let batches = do_read(buf, 1024, false, false, schema);
1542        assert_eq!(batches.len(), 1);
1543
1544        let list = batches[0].column(0).as_list::<i32>();
1545        assert_eq!(list.len(), 3);
1546        assert_eq!(list.value_offsets(), &[0, 0, 2, 2]);
1547        assert_eq!(list.null_count(), 1);
1548        assert!(list.is_null(2));
1549        let list_values = list.values().as_primitive::<Int32Type>();
1550        assert_eq!(list_values.values(), &[5, 6]);
1551
1552        let nested = batches[0].column(1).as_struct();
1553        let a = nested.column(0).as_primitive::<Int32Type>();
1554        assert_eq!(list.null_count(), 1);
1555        assert_eq!(a.values(), &[1, 7, 0]);
1556        assert!(list.is_null(2));
1557
1558        let b = nested.column(1).as_primitive::<Int32Type>();
1559        assert_eq!(b.null_count(), 2);
1560        assert_eq!(b.len(), 3);
1561        assert_eq!(b.value(0), 2);
1562        assert!(b.is_null(1));
1563        assert!(b.is_null(2));
1564
1565        let nested_list = batches[0].column(2).as_struct();
1566        assert_eq!(nested_list.len(), 3);
1567        assert_eq!(nested_list.null_count(), 1);
1568        assert!(nested_list.is_null(2));
1569
1570        let list2 = nested_list.column(0).as_list::<i32>();
1571        assert_eq!(list2.len(), 3);
1572        assert_eq!(list2.null_count(), 1);
1573        assert_eq!(list2.value_offsets(), &[0, 2, 2, 2]);
1574        assert!(list2.is_null(2));
1575
1576        let list2_values = list2.values().as_struct();
1577
1578        let c = list2_values.column(0).as_primitive::<Int32Type>();
1579        assert_eq!(c.values(), &[3, 4]);
1580    }
1581
1582    #[test]
1583    fn test_projection() {
1584        let buf = r#"
1585           {"list": [], "nested": {"a": 1, "b": 2}, "nested_list": {"list2": [{"c": 3, "d": 5}, {"c": 4}]}}
1586           {"list": [5, 6], "nested": {"a": 7}, "nested_list": {"list2": []}}
1587        "#;
1588
1589        let schema = Arc::new(Schema::new(vec![
1590            Field::new_struct(
1591                "nested",
1592                vec![Field::new("a", DataType::Int32, false)],
1593                true,
1594            ),
1595            Field::new_struct(
1596                "nested_list",
1597                vec![Field::new_list(
1598                    "list2",
1599                    Field::new_struct(
1600                        "element",
1601                        vec![Field::new("d", DataType::Int32, true)],
1602                        false,
1603                    ),
1604                    true,
1605                )],
1606                true,
1607            ),
1608        ]));
1609
1610        let batches = do_read(buf, 1024, false, false, schema);
1611        assert_eq!(batches.len(), 1);
1612
1613        let nested = batches[0].column(0).as_struct();
1614        assert_eq!(nested.num_columns(), 1);
1615        let a = nested.column(0).as_primitive::<Int32Type>();
1616        assert_eq!(a.null_count(), 0);
1617        assert_eq!(a.values(), &[1, 7]);
1618
1619        let nested_list = batches[0].column(1).as_struct();
1620        assert_eq!(nested_list.num_columns(), 1);
1621        assert_eq!(nested_list.null_count(), 0);
1622
1623        let list2 = nested_list.column(0).as_list::<i32>();
1624        assert_eq!(list2.value_offsets(), &[0, 2, 2]);
1625        assert_eq!(list2.null_count(), 0);
1626
1627        let child = list2.values().as_struct();
1628        assert_eq!(child.num_columns(), 1);
1629        assert_eq!(child.len(), 2);
1630        assert_eq!(child.null_count(), 0);
1631
1632        let c = child.column(0).as_primitive::<Int32Type>();
1633        assert_eq!(c.values(), &[5, 0]);
1634        assert_eq!(c.null_count(), 1);
1635        assert!(c.is_null(1));
1636    }
1637
1638    #[test]
1639    fn test_map() {
1640        let buf = r#"
1641           {"map": {"a": ["foo", null]}}
1642           {"map": {"a": [null], "b": []}}
1643           {"map": {"c": null, "a": ["baz"]}}
1644        "#;
1645        let map = Field::new_map(
1646            "map",
1647            Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
1648            Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Utf8, false),
1649            Field::new_list(
1650                Field::MAP_VALUE_FIELD_DEFAULT_NAME,
1651                Field::new("element", DataType::Utf8, true),
1652                true,
1653            ),
1654            false,
1655            true,
1656        );
1657
1658        let schema = Arc::new(Schema::new(vec![map]));
1659
1660        let batches = do_read(buf, 1024, false, false, schema);
1661        assert_eq!(batches.len(), 1);
1662
1663        let map = batches[0].column(0).as_map();
1664        let map_keys = map.keys().as_string::<i32>();
1665        let map_values = map.values().as_list::<i32>();
1666        assert_eq!(map.value_offsets(), &[0, 1, 3, 5]);
1667
1668        let k: Vec<_> = map_keys.iter().flatten().collect();
1669        assert_eq!(&k, &["a", "a", "b", "c", "a"]);
1670
1671        let list_values = map_values.values().as_string::<i32>();
1672        let lv: Vec<_> = list_values.iter().collect();
1673        assert_eq!(&lv, &[Some("foo"), None, None, Some("baz")]);
1674        assert_eq!(map_values.value_offsets(), &[0, 2, 3, 3, 3, 4]);
1675        assert_eq!(map_values.null_count(), 1);
1676        assert!(map_values.is_null(3));
1677
1678        let options = FormatOptions::default().with_null("null");
1679        let formatter = ArrayFormatter::try_new(map, &options).unwrap();
1680        assert_eq!(formatter.value(0).to_string(), "{a: [foo, null]}");
1681        assert_eq!(formatter.value(1).to_string(), "{a: [null], b: []}");
1682        assert_eq!(formatter.value(2).to_string(), "{c: null, a: [baz]}");
1683    }
1684
1685    #[test]
1686    fn test_map_non_nullable_value() {
1687        let map = Field::new_map(
1688            "map",
1689            Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
1690            Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Utf8, false),
1691            Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::Utf8, false),
1692            false,
1693            false,
1694        );
1695        let schema = Arc::new(Schema::new(vec![map]));
1696        let buf = r#"{"map": {"key": null}}"#;
1697
1698        let err = ReaderBuilder::new(schema)
1699            .build(Cursor::new(buf.as_bytes()))
1700            .unwrap()
1701            .read()
1702            .unwrap_err();
1703
1704        assert_eq!(
1705            err.to_string(),
1706            "Invalid argument error: Found unmasked nulls for non-nullable StructArray field \"value\""
1707        );
1708    }
1709
1710    #[test]
1711    fn test_not_coercing_primitive_into_string_without_flag() {
1712        let schema = Arc::new(Schema::new(vec![Field::new("a", DataType::Utf8, true)]));
1713
1714        let buf = r#"{"a": 1}"#;
1715        let err = ReaderBuilder::new(schema.clone())
1716            .with_batch_size(1024)
1717            .build(Cursor::new(buf.as_bytes()))
1718            .unwrap()
1719            .read()
1720            .unwrap_err();
1721
1722        assert_eq!(
1723            err.to_string(),
1724            "Json error: whilst decoding field 'a': expected string got 1"
1725        );
1726
1727        let buf = r#"{"a": true}"#;
1728        let err = ReaderBuilder::new(schema)
1729            .with_batch_size(1024)
1730            .build(Cursor::new(buf.as_bytes()))
1731            .unwrap()
1732            .read()
1733            .unwrap_err();
1734
1735        assert_eq!(
1736            err.to_string(),
1737            "Json error: whilst decoding field 'a': expected string got true"
1738        );
1739    }
1740
1741    #[test]
1742    fn test_coercing_primitive_into_string() {
1743        let buf = r#"
1744        {"a": 1, "b": 2, "c": true}
1745        {"a": 2E0, "b": 4, "c": false}
1746
1747        {"b": 6, "a": 2.0}
1748        {"b": "5", "a": 2}
1749        {"b": 4e0}
1750        {"b": 7, "a": null}
1751        "#;
1752
1753        let schema = Arc::new(Schema::new(vec![
1754            Field::new("a", DataType::Utf8, true),
1755            Field::new("b", DataType::Utf8, true),
1756            Field::new("c", DataType::Utf8, true),
1757        ]));
1758
1759        let batches = do_read(buf, 1024, true, false, schema);
1760        assert_eq!(batches.len(), 1);
1761
1762        let col1 = batches[0].column(0).as_string::<i32>();
1763        assert_eq!(col1.null_count(), 2);
1764        assert_eq!(col1.value(0), "1");
1765        assert_eq!(col1.value(1), "2E0");
1766        assert_eq!(col1.value(2), "2.0");
1767        assert_eq!(col1.value(3), "2");
1768        assert!(col1.is_null(4));
1769        assert!(col1.is_null(5));
1770
1771        let col2 = batches[0].column(1).as_string::<i32>();
1772        assert_eq!(col2.null_count(), 0);
1773        assert_eq!(col2.value(0), "2");
1774        assert_eq!(col2.value(1), "4");
1775        assert_eq!(col2.value(2), "6");
1776        assert_eq!(col2.value(3), "5");
1777        assert_eq!(col2.value(4), "4e0");
1778        assert_eq!(col2.value(5), "7");
1779
1780        let col3 = batches[0].column(2).as_string::<i32>();
1781        assert_eq!(col3.null_count(), 4);
1782        assert_eq!(col3.value(0), "true");
1783        assert_eq!(col3.value(1), "false");
1784        assert!(col3.is_null(2));
1785        assert!(col3.is_null(3));
1786        assert!(col3.is_null(4));
1787        assert!(col3.is_null(5));
1788    }
1789
1790    fn test_decimal<T: DecimalType>(data_type: DataType) {
1791        let buf = r#"
1792        {"a": 1, "b": 2, "c": 38.30}
1793        {"a": 2, "b": 4, "c": 123.456}
1794
1795        {"b": 1337, "a": "2.0452"}
1796        {"b": "5", "a": "11034.2"}
1797        {"b": 40}
1798        {"b": 1234, "a": null}
1799        "#;
1800
1801        let schema = Arc::new(Schema::new(vec![
1802            Field::new("a", data_type.clone(), true),
1803            Field::new("b", data_type.clone(), true),
1804            Field::new("c", data_type, true),
1805        ]));
1806
1807        let batches = do_read(buf, 1024, true, false, schema);
1808        assert_eq!(batches.len(), 1);
1809
1810        let col1 = batches[0].column(0).as_primitive::<T>();
1811        assert_eq!(col1.null_count(), 2);
1812        assert!(col1.is_null(4));
1813        assert!(col1.is_null(5));
1814        assert_eq!(
1815            col1.values(),
1816            &[100, 200, 205, 1103420, 0, 0].map(T::Native::usize_as)
1817        );
1818
1819        let col2 = batches[0].column(1).as_primitive::<T>();
1820        assert_eq!(col2.null_count(), 0);
1821        assert_eq!(
1822            col2.values(),
1823            &[200, 400, 133700, 500, 4000, 123400].map(T::Native::usize_as)
1824        );
1825
1826        let col3 = batches[0].column(2).as_primitive::<T>();
1827        assert_eq!(col3.null_count(), 4);
1828        assert!(!col3.is_null(0));
1829        assert!(!col3.is_null(1));
1830        assert!(col3.is_null(2));
1831        assert!(col3.is_null(3));
1832        assert!(col3.is_null(4));
1833        assert!(col3.is_null(5));
1834        assert_eq!(
1835            col3.values(),
1836            &[3830, 12346, 0, 0, 0, 0].map(T::Native::usize_as)
1837        );
1838    }
1839
1840    #[test]
1841    fn test_decimal_number_formats() {
1842        // Rounding half away from zero, exponent notation (a valid JSON
1843        // number syntax), surrounding whitespace in strings and negative
1844        // scales are all accepted
1845        let buf = r#"
1846        {"a": 0e0, "b": " 1.5 ", "c": 1234.5}
1847        {"a": 1.5E2, "b": "-0.005", "c": -150}
1848        {"a": 1e-3, "b": "1e2", "c": 1E2}
1849        {"a": -0E+0, "b": "+.5", "c": 5}
1850        "#;
1851        let schema = Arc::new(Schema::new(vec![
1852            Field::new("a", DataType::Decimal128(10, 2), true),
1853            Field::new("b", DataType::Decimal64(18, 2), true),
1854            Field::new("c", DataType::Decimal128(10, -2), true),
1855        ]));
1856        let batches = do_read(buf, 1024, true, false, schema);
1857        assert_eq!(batches.len(), 1);
1858        assert_eq!(
1859            batches[0]
1860                .column(0)
1861                .as_primitive::<Decimal128Type>()
1862                .values(),
1863            &[0, 15000, 0, 0]
1864        );
1865        assert_eq!(
1866            batches[0]
1867                .column(1)
1868                .as_primitive::<Decimal64Type>()
1869                .values(),
1870            &[150, -1, 10000, 50]
1871        );
1872        assert_eq!(
1873            batches[0]
1874                .column(2)
1875                .as_primitive::<Decimal128Type>()
1876                .values(),
1877            &[12, -2, 1, 0]
1878        );
1879
1880        // Invalid and out-of-range values are errors (or nulls when type
1881        // conflicts are ignored), never panics
1882        let schema = Arc::new(Schema::new(vec![Field::new(
1883            "a",
1884            DataType::Decimal128(5, 2),
1885            true,
1886        )]));
1887        let long = "1".repeat(300);
1888        for (buf, expected) in [
1889            (
1890                r#"{"a": "abc"}"#.to_string(),
1891                "Invalid decimal format: \"abc\"",
1892            ),
1893            (
1894                r#"{"a": 123456789}"#.to_string(),
1895                "does not fit in Decimal128(5, 2)",
1896            ),
1897            (
1898                r#"{"a": 1e99999}"#.to_string(),
1899                "does not fit in Decimal128(5, 2)",
1900            ),
1901            (
1902                format!(r#"{{"a": {long}}}"#),
1903                "does not fit in Decimal128(5, 2)",
1904            ),
1905            (
1906                r#"{"a": 4825037936439135476.2609835314269495255615E-14}"#.to_string(),
1907                "does not fit in Decimal128(5, 2)",
1908            ),
1909        ] {
1910            let err = ReaderBuilder::new(schema.clone())
1911                .build(Cursor::new(buf.as_bytes()))
1912                .unwrap()
1913                .next()
1914                .unwrap()
1915                .unwrap_err()
1916                .to_string();
1917            assert!(err.contains(expected), "{buf}: {err}");
1918
1919            let batch = ReaderBuilder::new(schema.clone())
1920                .with_ignore_type_conflicts(true)
1921                .build(Cursor::new(buf.as_bytes()))
1922                .unwrap()
1923                .next()
1924                .unwrap()
1925                .unwrap();
1926            assert!(batch.column(0).is_null(0), "{buf}");
1927        }
1928    }
1929
1930    #[test]
1931    fn test_decimals() {
1932        test_decimal::<Decimal32Type>(DataType::Decimal32(8, 2));
1933        test_decimal::<Decimal64Type>(DataType::Decimal64(10, 2));
1934        test_decimal::<Decimal128Type>(DataType::Decimal128(10, 2));
1935        test_decimal::<Decimal256Type>(DataType::Decimal256(10, 2));
1936    }
1937
1938    fn test_timestamp<T: ArrowTimestampType>() {
1939        let buf = r#"
1940        {"a": 1, "b": "2020-09-08T13:42:29.190855+00:00", "c": 38.30, "d": "1997-01-31T09:26:56.123"}
1941        {"a": 2, "b": "2020-09-08T13:42:29.190855Z", "c": 123.456, "d": 123.456}
1942
1943        {"b": 1337, "b": "2020-09-08T13:42:29Z", "c": "1997-01-31T09:26:56.123", "d": "1997-01-31T09:26:56.123Z"}
1944        {"b": 40, "c": "2020-09-08T13:42:29.190855+00:00", "d": "1997-01-31 09:26:56.123-05:00"}
1945        {"b": 1234, "a": null, "c": "1997-01-31 09:26:56.123Z", "d": "1997-01-31 092656"}
1946        {"c": "1997-01-31T14:26:56.123-05:00", "d": "1997-01-31"}
1947        "#;
1948
1949        let with_timezone = DataType::Timestamp(T::UNIT, Some("+08:00".into()));
1950        let schema = Arc::new(Schema::new(vec![
1951            Field::new("a", T::DATA_TYPE, true),
1952            Field::new("b", T::DATA_TYPE, true),
1953            Field::new("c", T::DATA_TYPE, true),
1954            Field::new("d", with_timezone, true),
1955        ]));
1956
1957        let batches = do_read(buf, 1024, true, false, schema);
1958        assert_eq!(batches.len(), 1);
1959
1960        let unit_in_nanos: i64 = match T::UNIT {
1961            TimeUnit::Second => 1_000_000_000,
1962            TimeUnit::Millisecond => 1_000_000,
1963            TimeUnit::Microsecond => 1_000,
1964            TimeUnit::Nanosecond => 1,
1965        };
1966
1967        let col1 = batches[0].column(0).as_primitive::<T>();
1968        assert_eq!(col1.null_count(), 4);
1969        assert!(col1.is_null(2));
1970        assert!(col1.is_null(3));
1971        assert!(col1.is_null(4));
1972        assert!(col1.is_null(5));
1973        assert_eq!(col1.values(), &[1, 2, 0, 0, 0, 0].map(T::Native::usize_as));
1974
1975        let col2 = batches[0].column(1).as_primitive::<T>();
1976        assert_eq!(col2.null_count(), 1);
1977        assert!(col2.is_null(5));
1978        assert_eq!(
1979            col2.values(),
1980            &[
1981                1599572549190855000 / unit_in_nanos,
1982                1599572549190855000 / unit_in_nanos,
1983                1599572549000000000 / unit_in_nanos,
1984                40,
1985                1234,
1986                0
1987            ]
1988        );
1989
1990        let col3 = batches[0].column(2).as_primitive::<T>();
1991        assert_eq!(col3.null_count(), 0);
1992        assert_eq!(
1993            col3.values(),
1994            &[
1995                38,
1996                123,
1997                854702816123000000 / unit_in_nanos,
1998                1599572549190855000 / unit_in_nanos,
1999                854702816123000000 / unit_in_nanos,
2000                854738816123000000 / unit_in_nanos
2001            ]
2002        );
2003
2004        let col4 = batches[0].column(3).as_primitive::<T>();
2005
2006        assert_eq!(col4.null_count(), 0);
2007        assert_eq!(
2008            col4.values(),
2009            &[
2010                854674016123000000 / unit_in_nanos,
2011                123,
2012                854702816123000000 / unit_in_nanos,
2013                854720816123000000 / unit_in_nanos,
2014                854674016000000000 / unit_in_nanos,
2015                854640000000000000 / unit_in_nanos
2016            ]
2017        );
2018    }
2019
2020    #[test]
2021    #[cfg_attr(miri, ignore)] // Takes too long
2022    fn test_timestamps() {
2023        test_timestamp::<TimestampSecondType>();
2024        test_timestamp::<TimestampMillisecondType>();
2025        test_timestamp::<TimestampMicrosecondType>();
2026        test_timestamp::<TimestampNanosecondType>();
2027    }
2028
2029    // A local time in a DST gap or overlap of the target timezone is resolved
2030    // as described in `arrow_cast::parse::string_to_datetime`: an ambiguous
2031    // reading takes the later instant, and a nonexistent reading is shifted
2032    // forward by the length of the gap.
2033    #[test]
2034    fn test_timestamp_dst_transitions() {
2035        let buf = r#"
2036        {"a": "2024-03-10 02:30:00"}
2037        {"a": "2024-11-03 01:30:00"}
2038        "#;
2039        let data_type = DataType::Timestamp(TimeUnit::Second, Some("America/New_York".into()));
2040        let schema = Arc::new(Schema::new(vec![Field::new("a", data_type, true)]));
2041
2042        let batches = do_read(buf, 1024, true, false, schema);
2043        assert_eq!(batches.len(), 1);
2044
2045        let col = batches[0].column(0).as_primitive::<TimestampSecondType>();
2046        assert_eq!(col.null_count(), 0);
2047        // Nonexistent 02:30 is read as 03:30 EDT (2024-03-10T07:30:00Z), and
2048        // ambiguous 01:30 takes the later EST instant (2024-11-03T06:30:00Z)
2049        assert_eq!(col.values(), &[1_710_055_800, 1_730_615_400]);
2050    }
2051
2052    fn test_time<T: ArrowTemporalType>() {
2053        let buf = r#"
2054        {"a": 1, "b": "09:26:56.123 AM", "c": 38.30}
2055        {"a": 2, "b": "23:59:59", "c": 123.456}
2056
2057        {"b": 1337, "b": "6:00 pm", "c": "09:26:56.123"}
2058        {"b": 40, "c": "13:42:29.190855"}
2059        {"b": 1234, "a": null, "c": "09:26:56.123"}
2060        {"c": "14:26:56.123"}
2061        "#;
2062
2063        let (DataType::Time32(unit) | DataType::Time64(unit)) = T::DATA_TYPE else {
2064            unreachable!()
2065        };
2066
2067        let unit_in_nanos = match unit {
2068            TimeUnit::Second => 1_000_000_000,
2069            TimeUnit::Millisecond => 1_000_000,
2070            TimeUnit::Microsecond => 1_000,
2071            TimeUnit::Nanosecond => 1,
2072        };
2073
2074        let schema = Arc::new(Schema::new(vec![
2075            Field::new("a", T::DATA_TYPE, true),
2076            Field::new("b", T::DATA_TYPE, true),
2077            Field::new("c", T::DATA_TYPE, true),
2078        ]));
2079
2080        let batches = do_read(buf, 1024, true, false, schema);
2081        assert_eq!(batches.len(), 1);
2082
2083        let col1 = batches[0].column(0).as_primitive::<T>();
2084        assert_eq!(col1.null_count(), 4);
2085        assert!(col1.is_null(2));
2086        assert!(col1.is_null(3));
2087        assert!(col1.is_null(4));
2088        assert!(col1.is_null(5));
2089        assert_eq!(col1.values(), &[1, 2, 0, 0, 0, 0].map(T::Native::usize_as));
2090
2091        let col2 = batches[0].column(1).as_primitive::<T>();
2092        assert_eq!(col2.null_count(), 1);
2093        assert!(col2.is_null(5));
2094        assert_eq!(
2095            col2.values(),
2096            &[
2097                34016123000000 / unit_in_nanos,
2098                86399000000000 / unit_in_nanos,
2099                64800000000000 / unit_in_nanos,
2100                40,
2101                1234,
2102                0
2103            ]
2104            .map(T::Native::usize_as)
2105        );
2106
2107        let col3 = batches[0].column(2).as_primitive::<T>();
2108        assert_eq!(col3.null_count(), 0);
2109        assert_eq!(
2110            col3.values(),
2111            &[
2112                38,
2113                123,
2114                34016123000000 / unit_in_nanos,
2115                49349190855000 / unit_in_nanos,
2116                34016123000000 / unit_in_nanos,
2117                52016123000000 / unit_in_nanos
2118            ]
2119            .map(T::Native::usize_as)
2120        );
2121    }
2122
2123    #[test]
2124    fn test_times() {
2125        test_time::<Time32MillisecondType>();
2126        test_time::<Time32SecondType>();
2127        test_time::<Time64MicrosecondType>();
2128        test_time::<Time64NanosecondType>();
2129    }
2130
2131    fn test_duration<T: ArrowTemporalType>() {
2132        let buf = r#"
2133        {"a": 1, "b": "2"}
2134        {"a": 3, "b": null}
2135        "#;
2136
2137        let schema = Arc::new(Schema::new(vec![
2138            Field::new("a", T::DATA_TYPE, true),
2139            Field::new("b", T::DATA_TYPE, true),
2140        ]));
2141
2142        let batches = do_read(buf, 1024, true, false, schema);
2143        assert_eq!(batches.len(), 1);
2144
2145        let col_a = batches[0].column_by_name("a").unwrap().as_primitive::<T>();
2146        assert_eq!(col_a.null_count(), 0);
2147        assert_eq!(col_a.values(), &[1, 3].map(T::Native::usize_as));
2148
2149        let col2 = batches[0].column_by_name("b").unwrap().as_primitive::<T>();
2150        assert_eq!(col2.null_count(), 1);
2151        assert_eq!(col2.values(), &[2, 0].map(T::Native::usize_as));
2152    }
2153
2154    #[test]
2155    fn test_durations() {
2156        test_duration::<DurationNanosecondType>();
2157        test_duration::<DurationMicrosecondType>();
2158        test_duration::<DurationMillisecondType>();
2159        test_duration::<DurationSecondType>();
2160    }
2161
2162    #[test]
2163    fn test_delta_checkpoint() {
2164        let json = "{\"protocol\":{\"minReaderVersion\":1,\"minWriterVersion\":2}}";
2165        let schema = Arc::new(Schema::new(vec![
2166            Field::new_struct(
2167                "protocol",
2168                vec![
2169                    Field::new("minReaderVersion", DataType::Int32, true),
2170                    Field::new("minWriterVersion", DataType::Int32, true),
2171                ],
2172                true,
2173            ),
2174            Field::new_struct(
2175                "add",
2176                vec![Field::new_map(
2177                    "partitionValues",
2178                    "key_value",
2179                    Field::new("key", DataType::Utf8, false),
2180                    Field::new("value", DataType::Utf8, true),
2181                    false,
2182                    false,
2183                )],
2184                true,
2185            ),
2186        ]));
2187
2188        let batches = do_read(json, 1024, true, false, schema);
2189        assert_eq!(batches.len(), 1);
2190
2191        let s: StructArray = batches.into_iter().next().unwrap().into();
2192        let opts = FormatOptions::default().with_null("null");
2193        let formatter = ArrayFormatter::try_new(&s, &opts).unwrap();
2194        assert_eq!(
2195            formatter.value(0).to_string(),
2196            "{protocol: {minReaderVersion: 1, minWriterVersion: 2}, add: null}"
2197        );
2198    }
2199
2200    #[test]
2201    fn struct_nullability() {
2202        let do_test = |child: DataType| {
2203            // Test correctly enforced nullability
2204            let non_null = r#"{"foo": {}}"#;
2205            let schema = Arc::new(Schema::new(vec![Field::new_struct(
2206                "foo",
2207                vec![Field::new("bar", child, false)],
2208                true,
2209            )]));
2210            let mut reader = ReaderBuilder::new(schema.clone())
2211                .build(Cursor::new(non_null.as_bytes()))
2212                .unwrap();
2213            assert!(reader.next().unwrap().is_err()); // Should error as not nullable
2214
2215            let null = r#"{"foo": {bar: null}}"#;
2216            let mut reader = ReaderBuilder::new(schema.clone())
2217                .build(Cursor::new(null.as_bytes()))
2218                .unwrap();
2219            assert!(reader.next().unwrap().is_err()); // Should error as not nullable
2220
2221            // Test nulls in nullable parent can mask nulls in non-nullable child
2222            let null = r#"{"foo": null}"#;
2223            let mut reader = ReaderBuilder::new(schema)
2224                .build(Cursor::new(null.as_bytes()))
2225                .unwrap();
2226            let batch = reader.next().unwrap().unwrap();
2227            assert_eq!(batch.num_columns(), 1);
2228            let foo = batch.column(0).as_struct();
2229            assert_eq!(foo.len(), 1);
2230            assert!(foo.is_null(0));
2231            assert_eq!(foo.num_columns(), 1);
2232
2233            let bar = foo.column(0);
2234            assert_eq!(bar.len(), 1);
2235            // Non-nullable child can still contain null as masked by parent
2236            assert!(bar.is_null(0));
2237        };
2238
2239        do_test(DataType::Boolean);
2240        do_test(DataType::Int32);
2241        do_test(DataType::Utf8);
2242        do_test(DataType::Decimal128(2, 1));
2243        do_test(DataType::Timestamp(
2244            TimeUnit::Microsecond,
2245            Some("+00:00".into()),
2246        ));
2247    }
2248
2249    #[test]
2250    fn test_truncation() {
2251        let buf = r#"
2252        {"i64": 9223372036854775807, "u64": 18446744073709551615 }
2253        {"i64": "9223372036854775807", "u64": "18446744073709551615" }
2254        {"i64": -9223372036854775808, "u64": 0 }
2255        {"i64": "-9223372036854775808", "u64": 0 }
2256        "#;
2257
2258        let schema = Arc::new(Schema::new(vec![
2259            Field::new("i64", DataType::Int64, true),
2260            Field::new("u64", DataType::UInt64, true),
2261        ]));
2262
2263        let batches = do_read(buf, 1024, true, false, schema);
2264        assert_eq!(batches.len(), 1);
2265
2266        let i64 = batches[0].column(0).as_primitive::<Int64Type>();
2267        assert_eq!(i64.values(), &[i64::MAX, i64::MAX, i64::MIN, i64::MIN]);
2268
2269        let u64 = batches[0].column(1).as_primitive::<UInt64Type>();
2270        assert_eq!(u64.values(), &[u64::MAX, u64::MAX, u64::MIN, u64::MIN]);
2271    }
2272
2273    #[test]
2274    fn test_timestamp_truncation() {
2275        let buf = r#"
2276        {"time": 9223372036854775807 }
2277        {"time": -9223372036854775808 }
2278        {"time": 9e5 }
2279        "#;
2280
2281        let schema = Arc::new(Schema::new(vec![Field::new(
2282            "time",
2283            DataType::Timestamp(TimeUnit::Nanosecond, None),
2284            true,
2285        )]));
2286
2287        let batches = do_read(buf, 1024, true, false, schema);
2288        assert_eq!(batches.len(), 1);
2289
2290        let i64 = batches[0]
2291            .column(0)
2292            .as_primitive::<TimestampNanosecondType>();
2293        assert_eq!(i64.values(), &[i64::MAX, i64::MIN, 900000]);
2294    }
2295
2296    #[test]
2297    fn test_timestamp_float_out_of_range() {
2298        let schema = Arc::new(Schema::new(vec![Field::new(
2299            "time",
2300            DataType::Timestamp(TimeUnit::Second, None),
2301            true,
2302        )]));
2303
2304        // -2^63 is the smallest representable value
2305        let batch = ReaderBuilder::new(schema.clone())
2306            .build(Cursor::new(
2307                r#"{"time": -9.223372036854775808e18}"#.as_bytes(),
2308            ))
2309            .unwrap()
2310            .next()
2311            .unwrap()
2312            .unwrap();
2313        let col = batch.column(0).as_primitive::<TimestampSecondType>();
2314        assert_eq!(col.value(0), i64::MIN);
2315
2316        for buf in [
2317            r#"{"time": 1e30}"#,
2318            r#"{"time": -1e30}"#,
2319            r#"{"time": 9.223372036854775808e18}"#,
2320            r#"{"time": 1e999}"#,
2321        ] {
2322            let err = ReaderBuilder::new(schema.clone())
2323                .build(Cursor::new(buf.as_bytes()))
2324                .unwrap()
2325                .next()
2326                .unwrap()
2327                .unwrap_err()
2328                .to_string();
2329            assert!(err.contains("failed to parse"), "{buf}: {err}");
2330
2331            let batch = ReaderBuilder::new(schema.clone())
2332                .with_ignore_type_conflicts(true)
2333                .build(Cursor::new(buf.as_bytes()))
2334                .unwrap()
2335                .next()
2336                .unwrap()
2337                .unwrap();
2338            assert!(batch.column(0).is_null(0), "{buf}");
2339        }
2340    }
2341
2342    #[test]
2343    fn test_strict_mode_no_missing_columns_in_schema() {
2344        let buf = r#"
2345        {"a": 1, "b": "2", "c": true}
2346        {"a": 2E0, "b": "4", "c": false}
2347        "#;
2348
2349        let schema = Arc::new(Schema::new(vec![
2350            Field::new("a", DataType::Int16, false),
2351            Field::new("b", DataType::Utf8, false),
2352            Field::new("c", DataType::Boolean, false),
2353        ]));
2354
2355        let batches = do_read(buf, 1024, true, true, schema);
2356        assert_eq!(batches.len(), 1);
2357
2358        let buf = r#"
2359        {"a": 1, "b": "2", "c": {"a": true, "b": 1}}
2360        {"a": 2E0, "b": "4", "c": {"a": false, "b": 2}}
2361        "#;
2362
2363        let schema = Arc::new(Schema::new(vec![
2364            Field::new("a", DataType::Int16, false),
2365            Field::new("b", DataType::Utf8, false),
2366            Field::new_struct(
2367                "c",
2368                vec![
2369                    Field::new("a", DataType::Boolean, false),
2370                    Field::new("b", DataType::Int16, false),
2371                ],
2372                false,
2373            ),
2374        ]));
2375
2376        let batches = do_read(buf, 1024, true, true, schema);
2377        assert_eq!(batches.len(), 1);
2378    }
2379
2380    #[test]
2381    fn test_strict_mode_missing_columns_in_schema() {
2382        let buf = r#"
2383        {"a": 1, "b": "2", "c": true}
2384        {"a": 2E0, "b": "4", "c": false}
2385        "#;
2386
2387        let schema = Arc::new(Schema::new(vec![
2388            Field::new("a", DataType::Int16, true),
2389            Field::new("c", DataType::Boolean, true),
2390        ]));
2391
2392        let err = ReaderBuilder::new(schema)
2393            .with_batch_size(1024)
2394            .with_strict_mode(true)
2395            .build(Cursor::new(buf.as_bytes()))
2396            .unwrap()
2397            .read()
2398            .unwrap_err();
2399
2400        assert_eq!(
2401            err.to_string(),
2402            "Json error: column 'b' missing from schema"
2403        );
2404
2405        let buf = r#"
2406        {"a": 1, "b": "2", "c": {"a": true, "b": 1}}
2407        {"a": 2E0, "b": "4", "c": {"a": false, "b": 2}}
2408        "#;
2409
2410        let schema = Arc::new(Schema::new(vec![
2411            Field::new("a", DataType::Int16, false),
2412            Field::new("b", DataType::Utf8, false),
2413            Field::new_struct("c", vec![Field::new("a", DataType::Boolean, false)], false),
2414        ]));
2415
2416        let err = ReaderBuilder::new(schema)
2417            .with_batch_size(1024)
2418            .with_strict_mode(true)
2419            .build(Cursor::new(buf.as_bytes()))
2420            .unwrap()
2421            .read()
2422            .unwrap_err();
2423
2424        assert_eq!(
2425            err.to_string(),
2426            "Json error: whilst decoding field 'c': column 'b' missing from schema"
2427        );
2428    }
2429
2430    fn read_file(path: &str, schema: Option<Schema>) -> Reader<BufReader<File>> {
2431        let file = File::open(path).unwrap();
2432        let mut reader = BufReader::new(file);
2433        let schema = schema.unwrap_or_else(|| {
2434            let (schema, _) = infer_json_schema(&mut reader, None).unwrap();
2435            reader.rewind().unwrap();
2436            schema
2437        });
2438        let builder = ReaderBuilder::new(Arc::new(schema)).with_batch_size(64);
2439        builder.build(reader).unwrap()
2440    }
2441
2442    #[test]
2443    fn test_json_basic() {
2444        let mut reader = read_file("test/data/basic.json", None);
2445        let batch = reader.next().unwrap().unwrap();
2446
2447        assert_eq!(8, batch.num_columns());
2448        assert_eq!(12, batch.num_rows());
2449
2450        let schema = reader.schema();
2451        let batch_schema = batch.schema();
2452        assert_eq!(schema, batch_schema);
2453
2454        let a = schema.column_with_name("a").unwrap();
2455        assert_eq!(0, a.0);
2456        assert_eq!(&DataType::Int64, a.1.data_type());
2457        let b = schema.column_with_name("b").unwrap();
2458        assert_eq!(1, b.0);
2459        assert_eq!(&DataType::Float64, b.1.data_type());
2460        let c = schema.column_with_name("c").unwrap();
2461        assert_eq!(2, c.0);
2462        assert_eq!(&DataType::Boolean, c.1.data_type());
2463        let d = schema.column_with_name("d").unwrap();
2464        assert_eq!(3, d.0);
2465        assert_eq!(&DataType::Utf8, d.1.data_type());
2466
2467        let aa = batch.column(a.0).as_primitive::<Int64Type>();
2468        assert_eq!(1, aa.value(0));
2469        assert_eq!(-10, aa.value(1));
2470        let bb = batch.column(b.0).as_primitive::<Float64Type>();
2471        assert_eq!(2.0, bb.value(0));
2472        assert_eq!(-3.5, bb.value(1));
2473        let cc = batch.column(c.0).as_boolean();
2474        assert!(!cc.value(0));
2475        assert!(cc.value(10));
2476        let dd = batch.column(d.0).as_string::<i32>();
2477        assert_eq!("4", dd.value(0));
2478        assert_eq!("text", dd.value(8));
2479    }
2480
2481    #[test]
2482    fn test_json_empty_projection() {
2483        let mut reader = read_file("test/data/basic.json", Some(Schema::empty()));
2484        let batch = reader.next().unwrap().unwrap();
2485
2486        assert_eq!(0, batch.num_columns());
2487        assert_eq!(12, batch.num_rows());
2488    }
2489
2490    #[test]
2491    fn test_json_basic_with_nulls() {
2492        let mut reader = read_file("test/data/basic_nulls.json", None);
2493        let batch = reader.next().unwrap().unwrap();
2494
2495        assert_eq!(4, batch.num_columns());
2496        assert_eq!(12, batch.num_rows());
2497
2498        let schema = reader.schema();
2499        let batch_schema = batch.schema();
2500        assert_eq!(schema, batch_schema);
2501
2502        let a = schema.column_with_name("a").unwrap();
2503        assert_eq!(&DataType::Int64, a.1.data_type());
2504        let b = schema.column_with_name("b").unwrap();
2505        assert_eq!(&DataType::Float64, b.1.data_type());
2506        let c = schema.column_with_name("c").unwrap();
2507        assert_eq!(&DataType::Boolean, c.1.data_type());
2508        let d = schema.column_with_name("d").unwrap();
2509        assert_eq!(&DataType::Utf8, d.1.data_type());
2510
2511        let aa = batch.column(a.0).as_primitive::<Int64Type>();
2512        assert!(aa.is_valid(0));
2513        assert!(!aa.is_valid(1));
2514        assert!(!aa.is_valid(11));
2515        let bb = batch.column(b.0).as_primitive::<Float64Type>();
2516        assert!(bb.is_valid(0));
2517        assert!(!bb.is_valid(2));
2518        assert!(!bb.is_valid(11));
2519        let cc = batch.column(c.0).as_boolean();
2520        assert!(cc.is_valid(0));
2521        assert!(!cc.is_valid(4));
2522        assert!(!cc.is_valid(11));
2523        let dd = batch.column(d.0).as_string::<i32>();
2524        assert!(!dd.is_valid(0));
2525        assert!(dd.is_valid(1));
2526        assert!(!dd.is_valid(4));
2527        assert!(!dd.is_valid(11));
2528    }
2529
2530    #[test]
2531    fn test_json_basic_schema() {
2532        let schema = Schema::new(vec![
2533            Field::new("a", DataType::Int64, true),
2534            Field::new("b", DataType::Float32, false),
2535            Field::new("c", DataType::Boolean, false),
2536            Field::new("d", DataType::Utf8, false),
2537        ]);
2538
2539        let mut reader = read_file("test/data/basic.json", Some(schema.clone()));
2540        let reader_schema = reader.schema();
2541        assert_eq!(reader_schema.as_ref(), &schema);
2542        let batch = reader.next().unwrap().unwrap();
2543
2544        assert_eq!(4, batch.num_columns());
2545        assert_eq!(12, batch.num_rows());
2546
2547        let schema = batch.schema();
2548
2549        let a = schema.column_with_name("a").unwrap();
2550        assert_eq!(&DataType::Int64, a.1.data_type());
2551        let b = schema.column_with_name("b").unwrap();
2552        assert_eq!(&DataType::Float32, b.1.data_type());
2553        let c = schema.column_with_name("c").unwrap();
2554        assert_eq!(&DataType::Boolean, c.1.data_type());
2555        let d = schema.column_with_name("d").unwrap();
2556        assert_eq!(&DataType::Utf8, d.1.data_type());
2557
2558        let aa = batch.column(a.0).as_primitive::<Int64Type>();
2559        assert_eq!(1, aa.value(0));
2560        assert_eq!(100000000000000, aa.value(11));
2561        let bb = batch.column(b.0).as_primitive::<Float32Type>();
2562        assert_eq!(2.0, bb.value(0));
2563        assert_eq!(-3.5, bb.value(1));
2564    }
2565
2566    #[test]
2567    fn test_json_basic_schema_projection() {
2568        let schema = Schema::new(vec![
2569            Field::new("a", DataType::Int64, true),
2570            Field::new("c", DataType::Boolean, false),
2571        ]);
2572
2573        let mut reader = read_file("test/data/basic.json", Some(schema.clone()));
2574        let batch = reader.next().unwrap().unwrap();
2575
2576        assert_eq!(2, batch.num_columns());
2577        assert_eq!(2, batch.schema().fields().len());
2578        assert_eq!(12, batch.num_rows());
2579
2580        assert_eq!(batch.schema().as_ref(), &schema);
2581
2582        let a = schema.column_with_name("a").unwrap();
2583        assert_eq!(0, a.0);
2584        assert_eq!(&DataType::Int64, a.1.data_type());
2585        let c = schema.column_with_name("c").unwrap();
2586        assert_eq!(1, c.0);
2587        assert_eq!(&DataType::Boolean, c.1.data_type());
2588    }
2589
2590    #[test]
2591    fn test_json_arrays() {
2592        let mut reader = read_file("test/data/arrays.json", None);
2593        let batch = reader.next().unwrap().unwrap();
2594
2595        assert_eq!(4, batch.num_columns());
2596        assert_eq!(3, batch.num_rows());
2597
2598        let schema = batch.schema();
2599
2600        let a = schema.column_with_name("a").unwrap();
2601        assert_eq!(&DataType::Int64, a.1.data_type());
2602        let b = schema.column_with_name("b").unwrap();
2603        assert_eq!(
2604            &DataType::List(Arc::new(Field::new_list_field(DataType::Float64, true))),
2605            b.1.data_type()
2606        );
2607        let c = schema.column_with_name("c").unwrap();
2608        assert_eq!(
2609            &DataType::List(Arc::new(Field::new_list_field(DataType::Boolean, true))),
2610            c.1.data_type()
2611        );
2612        let d = schema.column_with_name("d").unwrap();
2613        assert_eq!(&DataType::Utf8, d.1.data_type());
2614
2615        let aa = batch.column(a.0).as_primitive::<Int64Type>();
2616        assert_eq!(1, aa.value(0));
2617        assert_eq!(-10, aa.value(1));
2618        assert_eq!(1627668684594000000, aa.value(2));
2619        let bb = batch.column(b.0).as_list::<i32>();
2620        let bb = bb.values().as_primitive::<Float64Type>();
2621        assert_eq!(9, bb.len());
2622        assert_eq!(2.0, bb.value(0));
2623        assert_eq!(-6.1, bb.value(5));
2624        assert!(!bb.is_valid(7));
2625
2626        let cc = batch
2627            .column(c.0)
2628            .as_any()
2629            .downcast_ref::<ListArray>()
2630            .unwrap();
2631        let cc = cc.values().as_boolean();
2632        assert_eq!(6, cc.len());
2633        assert!(!cc.value(0));
2634        assert!(!cc.value(4));
2635        assert!(!cc.is_valid(5));
2636    }
2637
2638    #[test]
2639    fn test_empty_json_arrays() {
2640        let json_content = r#"
2641            {"items": []}
2642            {"items": null}
2643            {}
2644            "#;
2645
2646        let schema = Arc::new(Schema::new(vec![Field::new(
2647            "items",
2648            DataType::List(FieldRef::new(Field::new_list_field(DataType::Null, true))),
2649            true,
2650        )]));
2651
2652        let batches = do_read(json_content, 1024, false, false, schema);
2653        assert_eq!(batches.len(), 1);
2654
2655        let col1 = batches[0].column(0).as_list::<i32>();
2656        assert_eq!(col1.null_count(), 2);
2657        assert!(col1.value(0).is_empty());
2658        assert_eq!(col1.value(0).data_type(), &DataType::Null);
2659        assert!(col1.is_null(1));
2660        assert!(col1.is_null(2));
2661    }
2662
2663    #[test]
2664    fn test_nested_empty_json_arrays() {
2665        let json_content = r#"
2666            {"items": [[],[]]}
2667            {"items": [[null, null],[null]]}
2668            "#;
2669
2670        let schema = Arc::new(Schema::new(vec![Field::new(
2671            "items",
2672            DataType::List(FieldRef::new(Field::new_list_field(
2673                DataType::List(FieldRef::new(Field::new_list_field(DataType::Null, true))),
2674                true,
2675            ))),
2676            true,
2677        )]));
2678
2679        let batches = do_read(json_content, 1024, false, false, schema);
2680        assert_eq!(batches.len(), 1);
2681
2682        let col1 = batches[0].column(0).as_list::<i32>();
2683        assert_eq!(col1.null_count(), 0);
2684        assert_eq!(col1.value(0).len(), 2);
2685        assert!(col1.value(0).as_list::<i32>().value(0).is_empty());
2686        assert!(col1.value(0).as_list::<i32>().value(1).is_empty());
2687
2688        assert_eq!(col1.value(1).len(), 2);
2689        assert_eq!(col1.value(1).as_list::<i32>().value(0).len(), 2);
2690        assert_eq!(col1.value(1).as_list::<i32>().value(1).len(), 1);
2691    }
2692
2693    #[test]
2694    fn test_nested_list_json_arrays() {
2695        let c_field = Field::new_struct("c", vec![Field::new("d", DataType::Utf8, true)], true);
2696        let a_struct_field = Field::new_struct(
2697            "a",
2698            vec![Field::new("b", DataType::Boolean, true), c_field.clone()],
2699            true,
2700        );
2701        let a_field = Field::new("a", DataType::List(Arc::new(a_struct_field.clone())), true);
2702        let schema = Arc::new(Schema::new(vec![a_field.clone()]));
2703        let builder = ReaderBuilder::new(schema).with_batch_size(64);
2704        let json_content = r#"
2705        {"a": [{"b": true, "c": {"d": "a_text"}}, {"b": false, "c": {"d": "b_text"}}]}
2706        {"a": [{"b": false, "c": null}]}
2707        {"a": [{"b": true, "c": {"d": "c_text"}}, {"b": null, "c": {"d": "d_text"}}, {"b": true, "c": {"d": null}}]}
2708        {"a": null}
2709        {"a": []}
2710        {"a": [null]}
2711        "#;
2712        let mut reader = builder.build(Cursor::new(json_content)).unwrap();
2713
2714        // build expected output
2715        let d = StringArray::from(vec![
2716            Some("a_text"),
2717            Some("b_text"),
2718            None,
2719            Some("c_text"),
2720            Some("d_text"),
2721            None,
2722            None,
2723        ]);
2724        let c = StructArray::new(
2725            vec![Field::new("d", DataType::Utf8, true)].into(),
2726            vec![Arc::new(d.clone()) as ArrayRef],
2727            Some(NullBuffer::from(vec![
2728                true, true, false, true, true, true, false,
2729            ])),
2730        );
2731        let b = BooleanArray::from(vec![
2732            Some(true),
2733            Some(false),
2734            Some(false),
2735            Some(true),
2736            None,
2737            Some(true),
2738            None,
2739        ]);
2740        let a = StructArray::new(
2741            vec![Field::new("b", DataType::Boolean, true), c_field.clone()].into(),
2742            vec![
2743                Arc::new(b.clone()) as ArrayRef,
2744                Arc::new(c.clone()) as ArrayRef,
2745            ],
2746            Some(NullBuffer::from(vec![
2747                true, true, true, true, true, true, false,
2748            ])),
2749        );
2750        let a_list = ListArray::new(
2751            Arc::new(a_struct_field.clone()),
2752            OffsetBuffer::new(ScalarBuffer::from(vec![0i32, 2, 3, 6, 6, 6, 7])),
2753            Arc::new(a),
2754            Some(NullBuffer::from(vec![true, true, true, false, true, true])),
2755        );
2756
2757        // compare `a` with result from json reader
2758        let batch = reader.next().unwrap().unwrap();
2759        let read = batch.column(0);
2760        assert_eq!(read.len(), 6);
2761        // compare the arrays the long way around, to better detect differences
2762        let read: &ListArray = read.as_list::<i32>();
2763        let expected = &a_list;
2764        assert_eq!(read.value_offsets(), &[0, 2, 3, 6, 6, 6, 7]);
2765        // compare list null buffers
2766        assert_eq!(read.nulls(), expected.nulls());
2767        // build struct from list
2768        let struct_array = read.values().as_struct();
2769        let expected_struct_array = expected.values().as_struct();
2770
2771        assert_eq!(7, struct_array.len());
2772        assert_eq!(1, struct_array.null_count());
2773        assert_eq!(7, expected_struct_array.len());
2774        assert_eq!(1, expected_struct_array.null_count());
2775        // test struct's nulls
2776        assert_eq!(struct_array.nulls(), expected_struct_array.nulls());
2777        // test struct's fields
2778        let read_b = struct_array.column(0);
2779        assert_eq!(read_b.as_ref(), &b);
2780        let read_c = struct_array.column(1);
2781        assert_eq!(read_c.as_struct(), &c);
2782        let read_c = read_c.as_struct();
2783        let read_d = read_c.column(0);
2784        assert_eq!(read_d.as_ref(), &d);
2785
2786        assert_eq!(read, expected);
2787    }
2788
2789    fn assert_read_list_view<O: OffsetSizeTrait>() {
2790        let field = Arc::new(Field::new("item", DataType::Int32, true));
2791        let data_type = GenericListViewArray::<O>::DATA_TYPE_CONSTRUCTOR(field.clone());
2792        let schema = Arc::new(Schema::new(vec![Field::new("lv", data_type, true)]));
2793
2794        let buf = r#"
2795        {"lv": [1, 2, 3]}
2796        {"lv": [4, null]}
2797        {"lv": null}
2798        {"lv": [6]}
2799        {"lv": []}
2800        "#;
2801
2802        let batches = do_read(buf, 1024, false, false, schema);
2803        assert_eq!(batches.len(), 1);
2804        let batch = &batches[0];
2805        let col = batch.column(0);
2806        let list_view = col
2807            .as_any()
2808            .downcast_ref::<GenericListViewArray<O>>()
2809            .unwrap();
2810
2811        assert_eq!(list_view.len(), 5);
2812
2813        // Check offsets and sizes
2814        let expected_offsets: Vec<O> = vec![0, 3, 5, 5, 6]
2815            .into_iter()
2816            .map(|v| O::usize_as(v))
2817            .collect();
2818        let expected_sizes: Vec<O> = vec![3, 2, 0, 1, 0]
2819            .into_iter()
2820            .map(|v| O::usize_as(v))
2821            .collect();
2822        assert_eq!(list_view.value_offsets(), &expected_offsets);
2823        assert_eq!(list_view.value_sizes(), &expected_sizes);
2824
2825        // Row 0: [1, 2, 3]
2826        assert!(list_view.is_valid(0));
2827        let vals = list_view.value(0);
2828        let ints = vals.as_primitive::<Int32Type>();
2829        assert_eq!(ints.values(), &[1, 2, 3]);
2830
2831        // Row 1: [4, null]
2832        assert!(list_view.is_valid(1));
2833        let vals = list_view.value(1);
2834        let ints = vals.as_primitive::<Int32Type>();
2835        assert_eq!(ints.len(), 2);
2836        assert_eq!(ints.value(0), 4);
2837        assert!(ints.is_null(1));
2838
2839        // Row 2: null
2840        assert!(list_view.is_null(2));
2841
2842        // Row 3: [6]
2843        assert!(list_view.is_valid(3));
2844        let vals = list_view.value(3);
2845        let ints = vals.as_primitive::<Int32Type>();
2846        assert_eq!(ints.values(), &[6]);
2847
2848        // Row 4: []
2849        assert!(list_view.is_valid(4));
2850        let vals = list_view.value(4);
2851        assert_eq!(vals.len(), 0);
2852    }
2853
2854    #[test]
2855    fn test_read_list_view() {
2856        assert_read_list_view::<i32>();
2857        assert_read_list_view::<i64>();
2858    }
2859
2860    #[test]
2861    fn test_read_list_view_rejects_null_non_nullable_child() {
2862        let field = Arc::new(Field::new("item", DataType::Int32, false));
2863        for (data_type, array_type) in [
2864            (DataType::ListView(field.clone()), "ListViewArray"),
2865            (DataType::LargeListView(field.clone()), "LargeListViewArray"),
2866        ] {
2867            let schema = Arc::new(Schema::new(vec![Field::new("lv", data_type, true)]));
2868            let buf = r#"
2869            {"lv": [1, 2, 3]}
2870            {"lv": [4, null]}
2871            "#;
2872
2873            let error = ReaderBuilder::new(schema)
2874                .build(Cursor::new(buf.as_bytes()))
2875                .unwrap()
2876                .collect::<Result<Vec<_>, _>>()
2877                .unwrap_err();
2878
2879            assert_eq!(
2880                error.to_string(),
2881                format!(
2882                    "Invalid argument error: Non-nullable field of {array_type} \"item\" cannot contain nulls"
2883                )
2884            );
2885        }
2886    }
2887
2888    #[test]
2889    fn test_fixed_size_list() {
2890        let buf = r#"
2891        {"a": [1, 2, 3]}
2892        {"a": [4, 5, 6]}
2893        {"a": [7, 8, 9]}
2894        "#;
2895
2896        let field = Field::new_list_field(DataType::Int32, true);
2897        let schema = Arc::new(Schema::new(vec![Field::new(
2898            "a",
2899            DataType::FixedSizeList(Arc::new(field), 3),
2900            false,
2901        )]));
2902
2903        let batches = do_read(buf, 1024, false, false, schema);
2904        assert_eq!(batches.len(), 1);
2905
2906        let col = batches[0].column(0).as_fixed_size_list();
2907        assert_eq!(col.len(), 3);
2908        assert_eq!(col.value_length(), 3);
2909
2910        let values = col.values().as_primitive::<Int32Type>();
2911        assert_eq!(values.values(), &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2912    }
2913
2914    #[test]
2915    fn test_fixed_size_list_nullable() {
2916        let buf = r#"
2917        {"a": [1, 2]}
2918        {"a": null}
2919        {"a": [3, null]}
2920        "#;
2921
2922        let field = Field::new_list_field(DataType::Int32, true);
2923        let schema = Arc::new(Schema::new(vec![Field::new(
2924            "a",
2925            DataType::FixedSizeList(Arc::new(field), 2),
2926            true,
2927        )]));
2928
2929        let batches = do_read(buf, 1024, false, false, schema);
2930        assert_eq!(batches.len(), 1);
2931
2932        let col = batches[0].column(0).as_fixed_size_list();
2933        assert_eq!(col.len(), 3);
2934        assert!(col.is_valid(0));
2935        assert!(col.is_null(1));
2936        assert!(col.is_valid(2));
2937
2938        let values = col.values().as_primitive::<Int32Type>();
2939        assert_eq!(values.value(0), 1);
2940        assert_eq!(values.value(1), 2);
2941        assert_eq!(values.value(4), 3);
2942        assert!(values.is_null(5));
2943    }
2944
2945    #[test]
2946    fn test_fixed_size_list_zero_size_non_nullable() {
2947        let buf = r#"
2948        {"a": []}
2949        {"a": []}
2950        {"a": []}
2951        "#;
2952
2953        let field = Field::new_list_field(DataType::Int32, true);
2954        let schema = Arc::new(Schema::new(vec![Field::new(
2955            "a",
2956            DataType::FixedSizeList(Arc::new(field), 0),
2957            false,
2958        )]));
2959
2960        let batches = do_read(buf, 1024, false, false, schema);
2961        assert_eq!(batches.len(), 1);
2962
2963        let col = batches[0].column(0).as_fixed_size_list();
2964        assert_eq!(col.len(), 3);
2965        assert_eq!(col.value_length(), 0);
2966
2967        let values = col.values().as_primitive::<Int32Type>();
2968        assert!(values.values().is_empty());
2969    }
2970
2971    #[test]
2972    fn test_fixed_size_list_wrong_size() {
2973        let buf = r#"{"a": [1, 2, 3]}"#;
2974
2975        let field = Field::new_list_field(DataType::Int32, true);
2976        let schema = Arc::new(Schema::new(vec![Field::new(
2977            "a",
2978            DataType::FixedSizeList(Arc::new(field), 2),
2979            false,
2980        )]));
2981
2982        let err = ReaderBuilder::new(schema)
2983            .build(Cursor::new(buf.as_bytes()))
2984            .unwrap()
2985            .next()
2986            .unwrap()
2987            .unwrap_err();
2988
2989        assert!(err.to_string().contains("expected 2 but got 3"), "{}", err);
2990    }
2991
2992    #[test]
2993    fn test_fixed_size_list_nested() {
2994        let buf = r#"
2995        {"a": [[1, 2], [3, 4]]}
2996        {"a": [[5, 6], [7, 8]]}
2997        "#;
2998
2999        let inner_field = Field::new_list_field(DataType::Int32, true);
3000        let inner_type = DataType::FixedSizeList(Arc::new(inner_field), 2);
3001        let outer_field = Arc::new(Field::new_list_field(inner_type.clone(), true));
3002        let schema = Arc::new(Schema::new(vec![Field::new(
3003            "a",
3004            DataType::FixedSizeList(outer_field, 2),
3005            false,
3006        )]));
3007
3008        let batches = do_read(buf, 1024, false, false, schema);
3009        assert_eq!(batches.len(), 1);
3010
3011        let col = batches[0].column(0).as_fixed_size_list();
3012        assert_eq!(col.len(), 2);
3013        assert_eq!(col.value_length(), 2);
3014
3015        let inner = col.values().as_fixed_size_list();
3016        assert_eq!(inner.len(), 4);
3017        assert_eq!(inner.value_length(), 2);
3018
3019        let values = inner.values().as_primitive::<Int32Type>();
3020        assert_eq!(values.values(), &[1, 2, 3, 4, 5, 6, 7, 8]);
3021    }
3022
3023    #[test]
3024    fn test_fixed_size_list_ignore_type_conflicts() {
3025        let field = Field::new("item", DataType::Int32, true);
3026        let schema = Arc::new(Schema::new(vec![Field::new(
3027            "a",
3028            DataType::FixedSizeList(Arc::new(field), 2),
3029            true,
3030        )]));
3031
3032        let json = vec![
3033            json!({"a": [1, 2]}),
3034            json!({"a": "not a list"}),
3035            json!({"a": 42}),
3036            json!({"a": [6, 7]}),
3037        ];
3038
3039        let mut decoder = ReaderBuilder::new(schema)
3040            .with_ignore_type_conflicts(true)
3041            .build_decoder()
3042            .unwrap();
3043        decoder.serialize(&json).unwrap();
3044        let batch = decoder.flush().unwrap().unwrap();
3045
3046        let col = batch.column(0).as_fixed_size_list();
3047        assert_eq!(col.len(), 4);
3048        assert!(col.is_valid(0));
3049        assert!(col.is_null(1)); // string -> null
3050        assert!(col.is_null(2)); // number -> null
3051        assert!(col.is_valid(3));
3052
3053        let values = col.values().as_primitive::<Int32Type>();
3054        assert_eq!(values.value(0), 1);
3055        assert_eq!(values.value(1), 2);
3056        assert_eq!(values.value(6), 6);
3057        assert_eq!(values.value(7), 7);
3058    }
3059
3060    #[test]
3061    fn test_skip_empty_lines() {
3062        let schema = Schema::new(vec![Field::new("a", DataType::Int64, true)]);
3063        let builder = ReaderBuilder::new(Arc::new(schema)).with_batch_size(64);
3064        let json_content = "
3065        {\"a\": 1}
3066        {\"a\": 2}
3067        {\"a\": 3}";
3068        let mut reader = builder.build(Cursor::new(json_content)).unwrap();
3069        let batch = reader.next().unwrap().unwrap();
3070
3071        assert_eq!(1, batch.num_columns());
3072        assert_eq!(3, batch.num_rows());
3073
3074        let schema = reader.schema();
3075        let c = schema.column_with_name("a").unwrap();
3076        assert_eq!(&DataType::Int64, c.1.data_type());
3077    }
3078
3079    #[test]
3080    fn test_with_multiple_batches() {
3081        let file = File::open("test/data/basic_nulls.json").unwrap();
3082        let mut reader = BufReader::new(file);
3083        let (schema, _) = infer_json_schema(&mut reader, None).unwrap();
3084        reader.rewind().unwrap();
3085
3086        let builder = ReaderBuilder::new(Arc::new(schema)).with_batch_size(5);
3087        let mut reader = builder.build(reader).unwrap();
3088
3089        let mut num_records = Vec::new();
3090        while let Some(rb) = reader.next().transpose().unwrap() {
3091            num_records.push(rb.num_rows());
3092        }
3093
3094        assert_eq!(vec![5, 5, 2], num_records);
3095    }
3096
3097    #[test]
3098    fn test_timestamp_from_json_seconds() {
3099        let schema = Schema::new(vec![Field::new(
3100            "a",
3101            DataType::Timestamp(TimeUnit::Second, None),
3102            true,
3103        )]);
3104
3105        let mut reader = read_file("test/data/basic_nulls.json", Some(schema));
3106        let batch = reader.next().unwrap().unwrap();
3107
3108        assert_eq!(1, batch.num_columns());
3109        assert_eq!(12, batch.num_rows());
3110
3111        let schema = reader.schema();
3112        let batch_schema = batch.schema();
3113        assert_eq!(schema, batch_schema);
3114
3115        let a = schema.column_with_name("a").unwrap();
3116        assert_eq!(
3117            &DataType::Timestamp(TimeUnit::Second, None),
3118            a.1.data_type()
3119        );
3120
3121        let aa = batch.column(a.0).as_primitive::<TimestampSecondType>();
3122        assert!(aa.is_valid(0));
3123        assert!(!aa.is_valid(1));
3124        assert!(!aa.is_valid(2));
3125        assert_eq!(1, aa.value(0));
3126        assert_eq!(1, aa.value(3));
3127        assert_eq!(5, aa.value(7));
3128    }
3129
3130    #[test]
3131    fn test_timestamp_from_json_milliseconds() {
3132        let schema = Schema::new(vec![Field::new(
3133            "a",
3134            DataType::Timestamp(TimeUnit::Millisecond, None),
3135            true,
3136        )]);
3137
3138        let mut reader = read_file("test/data/basic_nulls.json", Some(schema));
3139        let batch = reader.next().unwrap().unwrap();
3140
3141        assert_eq!(1, batch.num_columns());
3142        assert_eq!(12, batch.num_rows());
3143
3144        let schema = reader.schema();
3145        let batch_schema = batch.schema();
3146        assert_eq!(schema, batch_schema);
3147
3148        let a = schema.column_with_name("a").unwrap();
3149        assert_eq!(
3150            &DataType::Timestamp(TimeUnit::Millisecond, None),
3151            a.1.data_type()
3152        );
3153
3154        let aa = batch.column(a.0).as_primitive::<TimestampMillisecondType>();
3155        assert!(aa.is_valid(0));
3156        assert!(!aa.is_valid(1));
3157        assert!(!aa.is_valid(2));
3158        assert_eq!(1, aa.value(0));
3159        assert_eq!(1, aa.value(3));
3160        assert_eq!(5, aa.value(7));
3161    }
3162
3163    #[test]
3164    fn test_date_from_json_milliseconds() {
3165        let schema = Schema::new(vec![Field::new("a", DataType::Date64, true)]);
3166
3167        let mut reader = read_file("test/data/basic_nulls.json", Some(schema));
3168        let batch = reader.next().unwrap().unwrap();
3169
3170        assert_eq!(1, batch.num_columns());
3171        assert_eq!(12, batch.num_rows());
3172
3173        let schema = reader.schema();
3174        let batch_schema = batch.schema();
3175        assert_eq!(schema, batch_schema);
3176
3177        let a = schema.column_with_name("a").unwrap();
3178        assert_eq!(&DataType::Date64, a.1.data_type());
3179
3180        let aa = batch.column(a.0).as_primitive::<Date64Type>();
3181        assert!(aa.is_valid(0));
3182        assert!(!aa.is_valid(1));
3183        assert!(!aa.is_valid(2));
3184        assert_eq!(1, aa.value(0));
3185        assert_eq!(1, aa.value(3));
3186        assert_eq!(5, aa.value(7));
3187    }
3188
3189    #[test]
3190    fn test_time_from_json_nanoseconds() {
3191        let schema = Schema::new(vec![Field::new(
3192            "a",
3193            DataType::Time64(TimeUnit::Nanosecond),
3194            true,
3195        )]);
3196
3197        let mut reader = read_file("test/data/basic_nulls.json", Some(schema));
3198        let batch = reader.next().unwrap().unwrap();
3199
3200        assert_eq!(1, batch.num_columns());
3201        assert_eq!(12, batch.num_rows());
3202
3203        let schema = reader.schema();
3204        let batch_schema = batch.schema();
3205        assert_eq!(schema, batch_schema);
3206
3207        let a = schema.column_with_name("a").unwrap();
3208        assert_eq!(&DataType::Time64(TimeUnit::Nanosecond), a.1.data_type());
3209
3210        let aa = batch.column(a.0).as_primitive::<Time64NanosecondType>();
3211        assert!(aa.is_valid(0));
3212        assert!(!aa.is_valid(1));
3213        assert!(!aa.is_valid(2));
3214        assert_eq!(1, aa.value(0));
3215        assert_eq!(1, aa.value(3));
3216        assert_eq!(5, aa.value(7));
3217    }
3218
3219    #[test]
3220    fn test_json_iterator() {
3221        let file = File::open("test/data/basic.json").unwrap();
3222        let mut reader = BufReader::new(file);
3223        let (schema, _) = infer_json_schema(&mut reader, None).unwrap();
3224        reader.rewind().unwrap();
3225
3226        let builder = ReaderBuilder::new(Arc::new(schema)).with_batch_size(5);
3227        let reader = builder.build(reader).unwrap();
3228        let schema = reader.schema();
3229        let (col_a_index, _) = schema.column_with_name("a").unwrap();
3230
3231        let mut sum_num_rows = 0;
3232        let mut num_batches = 0;
3233        let mut sum_a = 0;
3234        for batch in reader {
3235            let batch = batch.unwrap();
3236            assert_eq!(8, batch.num_columns());
3237            sum_num_rows += batch.num_rows();
3238            num_batches += 1;
3239            let batch_schema = batch.schema();
3240            assert_eq!(schema, batch_schema);
3241            let a_array = batch.column(col_a_index).as_primitive::<Int64Type>();
3242            sum_a += (0..a_array.len()).map(|i| a_array.value(i)).sum::<i64>();
3243        }
3244        assert_eq!(12, sum_num_rows);
3245        assert_eq!(3, num_batches);
3246        assert_eq!(100000000000011, sum_a);
3247    }
3248
3249    #[test]
3250    fn test_decoder_error() {
3251        let schema = Arc::new(Schema::new(vec![Field::new_struct(
3252            "a",
3253            vec![Field::new("child", DataType::Int32, false)],
3254            true,
3255        )]));
3256
3257        let mut decoder = ReaderBuilder::new(schema.clone()).build_decoder().unwrap();
3258        let _ = decoder.decode(br#"{"a": { "child":"#).unwrap();
3259        assert!(decoder.tape_decoder.has_partial_row());
3260        assert_eq!(decoder.tape_decoder.num_buffered_rows(), 1);
3261        let _ = decoder.flush().unwrap_err();
3262        assert!(decoder.tape_decoder.has_partial_row());
3263        assert_eq!(decoder.tape_decoder.num_buffered_rows(), 1);
3264
3265        let parse_err = |s: &str| {
3266            ReaderBuilder::new(schema.clone())
3267                .build(Cursor::new(s.as_bytes()))
3268                .unwrap()
3269                .next()
3270                .unwrap()
3271                .unwrap_err()
3272                .to_string()
3273        };
3274
3275        let err = parse_err(r#"{"a": 123}"#);
3276        assert_eq!(
3277            err,
3278            "Json error: whilst decoding field 'a': expected { got 123"
3279        );
3280
3281        let err = parse_err(r#"{"a": ["bar"]}"#);
3282        assert_eq!(
3283            err,
3284            r#"Json error: whilst decoding field 'a': expected { got ["bar"]"#
3285        );
3286
3287        let err = parse_err(r#"{"a": []}"#);
3288        assert_eq!(
3289            err,
3290            "Json error: whilst decoding field 'a': expected { got []"
3291        );
3292
3293        let err = parse_err(r#"{"a": [{"child": 234}]}"#);
3294        assert_eq!(
3295            err,
3296            r#"Json error: whilst decoding field 'a': expected { got [{"child": 234}]"#
3297        );
3298
3299        let err = parse_err(r#"{"a": [{"child": {"foo": [{"foo": ["bar"]}]}}]}"#);
3300        assert_eq!(
3301            err,
3302            r#"Json error: whilst decoding field 'a': expected { got [{"child": {"foo": [{"foo": ["bar"]}]}}]"#
3303        );
3304
3305        let err = parse_err(r#"{"a": true}"#);
3306        assert_eq!(
3307            err,
3308            "Json error: whilst decoding field 'a': expected { got true"
3309        );
3310
3311        let err = parse_err(r#"{"a": false}"#);
3312        assert_eq!(
3313            err,
3314            "Json error: whilst decoding field 'a': expected { got false"
3315        );
3316
3317        let err = parse_err(r#"{"a": "foo"}"#);
3318        assert_eq!(
3319            err,
3320            "Json error: whilst decoding field 'a': expected { got \"foo\""
3321        );
3322
3323        let err = parse_err(r#"{"a": {"child": false}}"#);
3324        assert_eq!(
3325            err,
3326            "Json error: whilst decoding field 'a': whilst decoding field 'child': expected primitive got false"
3327        );
3328
3329        let err = parse_err(r#"{"a": {"child": []}}"#);
3330        assert_eq!(
3331            err,
3332            "Json error: whilst decoding field 'a': whilst decoding field 'child': expected primitive got []"
3333        );
3334
3335        let err = parse_err(r#"{"a": {"child": [123]}}"#);
3336        assert_eq!(
3337            err,
3338            "Json error: whilst decoding field 'a': whilst decoding field 'child': expected primitive got [123]"
3339        );
3340
3341        let err = parse_err(r#"{"a": {"child": [123, 3465346]}}"#);
3342        assert_eq!(
3343            err,
3344            "Json error: whilst decoding field 'a': whilst decoding field 'child': expected primitive got [123, 3465346]"
3345        );
3346    }
3347
3348    #[test]
3349    fn test_serialize_timestamp() {
3350        let json = vec![
3351            json!({"timestamp": 1681319393}),
3352            json!({"timestamp": "1970-01-01T00:00:00+02:00"}),
3353        ];
3354        let schema = Schema::new(vec![Field::new(
3355            "timestamp",
3356            DataType::Timestamp(TimeUnit::Second, None),
3357            true,
3358        )]);
3359        let mut decoder = ReaderBuilder::new(Arc::new(schema))
3360            .build_decoder()
3361            .unwrap();
3362        decoder.serialize(&json).unwrap();
3363        let batch = decoder.flush().unwrap().unwrap();
3364        assert_eq!(batch.num_rows(), 2);
3365        assert_eq!(batch.num_columns(), 1);
3366        let values = batch.column(0).as_primitive::<TimestampSecondType>();
3367        assert_eq!(values.values(), &[1681319393, -7200]);
3368    }
3369
3370    #[test]
3371    fn test_serialize_decimal() {
3372        let json = vec![
3373            json!({"decimal": 1.234}),
3374            json!({"decimal": "1.234"}),
3375            json!({"decimal": 1234}),
3376            json!({"decimal": "1234"}),
3377        ];
3378        let schema = Schema::new(vec![Field::new(
3379            "decimal",
3380            DataType::Decimal128(10, 3),
3381            true,
3382        )]);
3383        let mut decoder = ReaderBuilder::new(Arc::new(schema))
3384            .build_decoder()
3385            .unwrap();
3386        decoder.serialize(&json).unwrap();
3387        let batch = decoder.flush().unwrap().unwrap();
3388        assert_eq!(batch.num_rows(), 4);
3389        assert_eq!(batch.num_columns(), 1);
3390        let values = batch.column(0).as_primitive::<Decimal128Type>();
3391        assert_eq!(values.values(), &[1234, 1234, 1234000, 1234000]);
3392    }
3393
3394    #[test]
3395    fn test_serde_field() {
3396        let field = Field::new("int", DataType::Int32, true);
3397        let mut decoder = ReaderBuilder::new_with_field(field)
3398            .build_decoder()
3399            .unwrap();
3400        decoder.serialize(&[1_i32, 2, 3, 4]).unwrap();
3401        let b = decoder.flush().unwrap().unwrap();
3402        let values = b.column(0).as_primitive::<Int32Type>().values();
3403        assert_eq!(values, &[1, 2, 3, 4]);
3404    }
3405
3406    #[test]
3407    fn test_serde_large_numbers() {
3408        let field = Field::new("int", DataType::Int64, true);
3409        let mut decoder = ReaderBuilder::new_with_field(field)
3410            .build_decoder()
3411            .unwrap();
3412
3413        decoder.serialize(&[1699148028689_u64, 2, 3, 4]).unwrap();
3414        let b = decoder.flush().unwrap().unwrap();
3415        let values = b.column(0).as_primitive::<Int64Type>().values();
3416        assert_eq!(values, &[1699148028689, 2, 3, 4]);
3417
3418        let field = Field::new(
3419            "int",
3420            DataType::Timestamp(TimeUnit::Microsecond, None),
3421            true,
3422        );
3423        let mut decoder = ReaderBuilder::new_with_field(field)
3424            .build_decoder()
3425            .unwrap();
3426
3427        decoder.serialize(&[1699148028689_u64, 2, 3, 4]).unwrap();
3428        let b = decoder.flush().unwrap().unwrap();
3429        let values = b
3430            .column(0)
3431            .as_primitive::<TimestampMicrosecondType>()
3432            .values();
3433        assert_eq!(values, &[1699148028689, 2, 3, 4]);
3434    }
3435
3436    #[test]
3437    fn test_coercing_primitive_into_string_decoder() {
3438        let buf = &format!(
3439            r#"[{{"a": 1, "b": "A", "c": "T"}}, {{"a": 2, "b": "BB", "c": "F"}}, {{"a": {}, "b": 123, "c": false}}, {{"a": {}, "b": 789, "c": true}}]"#,
3440            (i32::MAX as i64 + 10),
3441            i64::MAX - 10
3442        );
3443        let schema = Schema::new(vec![
3444            Field::new("a", DataType::Float64, true),
3445            Field::new("b", DataType::Utf8, true),
3446            Field::new("c", DataType::Utf8, true),
3447        ]);
3448        let json_array: Vec<serde_json::Value> = serde_json::from_str(buf).unwrap();
3449        let schema_ref = Arc::new(schema);
3450
3451        // read record batches
3452        let reader = ReaderBuilder::new(schema_ref.clone()).with_coerce_primitive(true);
3453        let mut decoder = reader.build_decoder().unwrap();
3454        decoder.serialize(json_array.as_slice()).unwrap();
3455        let batch = decoder.flush().unwrap().unwrap();
3456        assert_eq!(
3457            batch,
3458            RecordBatch::try_new(
3459                schema_ref,
3460                vec![
3461                    Arc::new(Float64Array::from(vec![
3462                        1.0,
3463                        2.0,
3464                        (i32::MAX as i64 + 10) as f64,
3465                        (i64::MAX - 10) as f64
3466                    ])),
3467                    Arc::new(StringArray::from(vec!["A", "BB", "123", "789"])),
3468                    Arc::new(StringArray::from(vec!["T", "F", "false", "true"])),
3469                ]
3470            )
3471            .unwrap()
3472        );
3473    }
3474
3475    #[test]
3476    fn test_serialize_f32_into_string() {
3477        // Coercing an f32 into a string column must render the value, not its raw bit pattern.
3478        let field = Field::new("f", DataType::Utf8, true);
3479        let mut decoder = ReaderBuilder::new_with_field(field)
3480            .with_coerce_primitive(true)
3481            .build_decoder()
3482            .unwrap();
3483        decoder.serialize(&[1.5_f32, -2.25_f32]).unwrap();
3484        let batch = decoder.flush().unwrap().unwrap();
3485        let values = batch.column(0).as_string::<i32>();
3486        assert_eq!(values.value(0), "1.5");
3487        assert_eq!(values.value(1), "-2.25");
3488    }
3489
3490    // Parse the given `row` in `struct_mode` as a type given by fields.
3491    //
3492    // If as_struct == true, wrap the fields in a Struct field with name "r".
3493    // If as_struct == false, wrap the fields in a Schema.
3494    fn _parse_structs(
3495        row: &str,
3496        struct_mode: StructMode,
3497        fields: Fields,
3498        as_struct: bool,
3499    ) -> Result<RecordBatch, ArrowError> {
3500        let builder = if as_struct {
3501            ReaderBuilder::new_with_field(Field::new("r", DataType::Struct(fields), true))
3502        } else {
3503            ReaderBuilder::new(Arc::new(Schema::new(fields)))
3504        };
3505        builder
3506            .with_struct_mode(struct_mode)
3507            .build(Cursor::new(row.as_bytes()))
3508            .unwrap()
3509            .next()
3510            .unwrap()
3511    }
3512
3513    #[test]
3514    fn test_struct_decoding_list_length() {
3515        use arrow_array::array;
3516
3517        let row = "[1, 2]";
3518
3519        let mut fields = vec![Field::new("a", DataType::Int32, true)];
3520        let too_few_fields = Fields::from(fields.clone());
3521        fields.push(Field::new("b", DataType::Int32, true));
3522        let correct_fields = Fields::from(fields.clone());
3523        fields.push(Field::new("c", DataType::Int32, true));
3524        let too_many_fields = Fields::from(fields.clone());
3525
3526        let parse = |fields: Fields, as_struct: bool| {
3527            _parse_structs(row, StructMode::ListOnly, fields, as_struct)
3528        };
3529
3530        let expected_row = StructArray::new(
3531            correct_fields.clone(),
3532            vec![
3533                Arc::new(array::Int32Array::from(vec![1])),
3534                Arc::new(array::Int32Array::from(vec![2])),
3535            ],
3536            None,
3537        );
3538        let row_field = Field::new("r", DataType::Struct(correct_fields.clone()), true);
3539
3540        assert_eq!(
3541            parse(too_few_fields.clone(), true).unwrap_err().to_string(),
3542            "Json error: found extra columns for 1 fields".to_string()
3543        );
3544        assert_eq!(
3545            parse(too_few_fields, false).unwrap_err().to_string(),
3546            "Json error: found extra columns for 1 fields".to_string()
3547        );
3548        assert_eq!(
3549            parse(correct_fields.clone(), true).unwrap(),
3550            RecordBatch::try_new(
3551                Arc::new(Schema::new(vec![row_field])),
3552                vec![Arc::new(expected_row.clone())]
3553            )
3554            .unwrap()
3555        );
3556        assert_eq!(
3557            parse(correct_fields, false).unwrap(),
3558            RecordBatch::from(expected_row)
3559        );
3560        assert_eq!(
3561            parse(too_many_fields.clone(), true)
3562                .unwrap_err()
3563                .to_string(),
3564            "Json error: found 2 columns for 3 fields".to_string()
3565        );
3566        assert_eq!(
3567            parse(too_many_fields, false).unwrap_err().to_string(),
3568            "Json error: found 2 columns for 3 fields".to_string()
3569        );
3570    }
3571
3572    #[test]
3573    fn test_struct_decoding() {
3574        use arrow_array::builder;
3575
3576        let nested_object_json = r#"{"a": {"b": [1, 2], "c": {"d": 3}}}"#;
3577        let nested_list_json = r#"[[[1, 2], {"d": 3}]]"#;
3578        let nested_mixed_json = r#"{"a": [[1, 2], {"d": 3}]}"#;
3579
3580        let struct_fields = Fields::from(vec![
3581            Field::new("b", DataType::new_list(DataType::Int32, true), true),
3582            Field::new_map(
3583                "c",
3584                Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
3585                Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Utf8, false),
3586                Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::Int32, true),
3587                false,
3588                false,
3589            ),
3590        ]);
3591
3592        let list_array =
3593            ListArray::from_iter_primitive::<Int32Type, _, _>(vec![Some(vec![Some(1), Some(2)])]);
3594
3595        let map_array = {
3596            let mut map_builder = builder::MapBuilder::new(
3597                None,
3598                builder::StringBuilder::new(),
3599                builder::Int32Builder::new(),
3600            );
3601            map_builder.keys().append_value("d");
3602            map_builder.values().append_value(3);
3603            map_builder.append(true).unwrap();
3604            map_builder.finish()
3605        };
3606
3607        let struct_array = StructArray::new(
3608            struct_fields.clone(),
3609            vec![Arc::new(list_array), Arc::new(map_array)],
3610            None,
3611        );
3612
3613        let fields = Fields::from(vec![Field::new("a", DataType::Struct(struct_fields), true)]);
3614        let schema = Arc::new(Schema::new(fields.clone()));
3615        let expected = RecordBatch::try_new(schema.clone(), vec![Arc::new(struct_array)]).unwrap();
3616
3617        let parse = |row: &str, struct_mode: StructMode| {
3618            _parse_structs(row, struct_mode, fields.clone(), false)
3619        };
3620
3621        assert_eq!(
3622            parse(nested_object_json, StructMode::ObjectOnly).unwrap(),
3623            expected
3624        );
3625        assert_eq!(
3626            parse(nested_list_json, StructMode::ObjectOnly)
3627                .unwrap_err()
3628                .to_string(),
3629            "Json error: expected { got [[[1, 2], {\"d\": 3}]]".to_owned()
3630        );
3631        assert_eq!(
3632            parse(nested_mixed_json, StructMode::ObjectOnly)
3633                .unwrap_err()
3634                .to_string(),
3635            "Json error: whilst decoding field 'a': expected { got [[1, 2], {\"d\": 3}]".to_owned()
3636        );
3637
3638        assert_eq!(
3639            parse(nested_list_json, StructMode::ListOnly).unwrap(),
3640            expected
3641        );
3642        assert_eq!(
3643            parse(nested_object_json, StructMode::ListOnly)
3644                .unwrap_err()
3645                .to_string(),
3646            "Json error: expected [ got {\"a\": {\"b\": [1, 2]\"c\": {\"d\": 3}}}".to_owned()
3647        );
3648        assert_eq!(
3649            parse(nested_mixed_json, StructMode::ListOnly)
3650                .unwrap_err()
3651                .to_string(),
3652            "Json error: expected [ got {\"a\": [[1, 2], {\"d\": 3}]}".to_owned()
3653        );
3654    }
3655
3656    // Test cases:
3657    // [] -> RecordBatch row with no entries.  Schema = [('a', Int32)] -> Error
3658    // [] -> RecordBatch row with no entries. Schema = [('r', [('a', Int32)])] -> Error
3659    // [] -> StructArray row with no entries. Fields [('a', Int32')] -> Error
3660    // [[]] -> RecordBatch row with empty struct entry. Schema = [('r', [('a', Int32)])] -> Error
3661    #[test]
3662    fn test_struct_decoding_empty_list() {
3663        let int_field = Field::new("a", DataType::Int32, true);
3664        let struct_field = Field::new(
3665            "r",
3666            DataType::Struct(Fields::from(vec![int_field.clone()])),
3667            true,
3668        );
3669
3670        let parse = |row: &str, as_struct: bool, field: Field| {
3671            _parse_structs(
3672                row,
3673                StructMode::ListOnly,
3674                Fields::from(vec![field]),
3675                as_struct,
3676            )
3677        };
3678
3679        // Missing fields
3680        assert_eq!(
3681            parse("[]", true, struct_field.clone())
3682                .unwrap_err()
3683                .to_string(),
3684            "Json error: found 0 columns for 1 fields".to_owned()
3685        );
3686        assert_eq!(
3687            parse("[]", false, int_field.clone())
3688                .unwrap_err()
3689                .to_string(),
3690            "Json error: found 0 columns for 1 fields".to_owned()
3691        );
3692        assert_eq!(
3693            parse("[]", false, struct_field.clone())
3694                .unwrap_err()
3695                .to_string(),
3696            "Json error: found 0 columns for 1 fields".to_owned()
3697        );
3698        assert_eq!(
3699            parse("[[]]", false, struct_field.clone())
3700                .unwrap_err()
3701                .to_string(),
3702            "Json error: whilst decoding field 'r': found 0 columns for 1 fields".to_owned()
3703        );
3704    }
3705
3706    #[test]
3707    fn test_decode_list_struct_with_wrong_types() {
3708        let int_field = Field::new("a", DataType::Int32, true);
3709        let struct_field = Field::new(
3710            "r",
3711            DataType::Struct(Fields::from(vec![int_field.clone()])),
3712            true,
3713        );
3714
3715        let parse = |row: &str, as_struct: bool, field: Field| {
3716            _parse_structs(
3717                row,
3718                StructMode::ListOnly,
3719                Fields::from(vec![field]),
3720                as_struct,
3721            )
3722        };
3723
3724        // Wrong values
3725        assert_eq!(
3726            parse(r#"[["a"]]"#, false, struct_field.clone())
3727                .unwrap_err()
3728                .to_string(),
3729            "Json error: whilst decoding field 'r': whilst decoding field 'a': failed to parse \"a\" as Int32".to_owned()
3730        );
3731        assert_eq!(
3732            parse(r#"[["a"]]"#, true, struct_field.clone())
3733                .unwrap_err()
3734                .to_string(),
3735            "Json error: whilst decoding field 'r': whilst decoding field 'a': failed to parse \"a\" as Int32".to_owned()
3736        );
3737        assert_eq!(
3738            parse(r#"["a"]"#, true, int_field.clone())
3739                .unwrap_err()
3740                .to_string(),
3741            "Json error: whilst decoding field 'a': failed to parse \"a\" as Int32".to_owned()
3742        );
3743        assert_eq!(
3744            parse(r#"["a"]"#, false, int_field.clone())
3745                .unwrap_err()
3746                .to_string(),
3747            "Json error: whilst decoding field 'a': failed to parse \"a\" as Int32".to_owned()
3748        );
3749    }
3750
3751    #[test]
3752    fn test_type_conflict_nulls() {
3753        let schema = Schema::new(vec![
3754            Field::new("null", DataType::Null, true),
3755            Field::new("bool", DataType::Boolean, true),
3756            Field::new("primitive", DataType::Int32, true),
3757            Field::new("numeric", DataType::Decimal128(10, 3), true),
3758            Field::new("string", DataType::Utf8, true),
3759            Field::new("string_view", DataType::Utf8View, true),
3760            Field::new(
3761                "timestamp",
3762                DataType::Timestamp(TimeUnit::Second, None),
3763                true,
3764            ),
3765            Field::new(
3766                "array",
3767                DataType::List(Arc::new(Field::new("item", DataType::Int32, true))),
3768                true,
3769            ),
3770            Field::new(
3771                "map",
3772                DataType::Map(
3773                    Arc::new(Field::new(
3774                        Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
3775                        DataType::Struct(Fields::from(vec![
3776                            Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Utf8, false),
3777                            Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::Utf8, true),
3778                        ])),
3779                        false, // not nullable
3780                    )),
3781                    false, // not sorted
3782                ),
3783                true, // nullable
3784            ),
3785            Field::new(
3786                "struct",
3787                DataType::Struct(Fields::from(vec![Field::new("a", DataType::Int32, true)])),
3788                true,
3789            ),
3790        ]);
3791
3792        // A compatible value for each schema field above, in schema order
3793        let json_values = vec![
3794            json!(null),
3795            json!(true),
3796            json!(42),
3797            json!(1.234),
3798            json!("hi"),
3799            json!("ho"),
3800            json!("1970-01-01T00:00:00+02:00"),
3801            json!([1, "ho", 3]),
3802            json!({"k": "value"}),
3803            json!({"a": 1}),
3804        ];
3805
3806        // Create a set of JSON rows that rotates each value past every field
3807        let json: Vec<_> = (0..json_values.len())
3808            .map(|i| {
3809                let pairs = json_values[i..]
3810                    .iter()
3811                    .chain(json_values[..i].iter())
3812                    .zip(&schema.fields)
3813                    .map(|(v, f)| (f.name().clone(), v.clone()))
3814                    .collect();
3815                serde_json::Value::Object(pairs)
3816            })
3817            .collect();
3818        let mut decoder = ReaderBuilder::new(Arc::new(schema))
3819            .with_ignore_type_conflicts(true)
3820            .with_coerce_primitive(true)
3821            .build_decoder()
3822            .unwrap();
3823        decoder.serialize(&json).unwrap();
3824        let batch = decoder.flush().unwrap().unwrap();
3825        assert_eq!(batch.num_rows(), 10);
3826        assert_eq!(batch.num_columns(), 10);
3827
3828        // NOTE: NullArray doesn't materialize any values (they're all NULL by definition)
3829        let _ = batch
3830            .column(0)
3831            .as_any()
3832            .downcast_ref::<NullArray>()
3833            .unwrap();
3834
3835        assert!(
3836            batch
3837                .column(1)
3838                .as_any()
3839                .downcast_ref::<BooleanArray>()
3840                .unwrap()
3841                .iter()
3842                .eq([
3843                    Some(true),
3844                    None,
3845                    None,
3846                    None,
3847                    None,
3848                    None,
3849                    None,
3850                    None,
3851                    None,
3852                    None
3853                ])
3854        );
3855
3856        assert!(batch.column(2).as_primitive::<Int32Type>().iter().eq([
3857            Some(42),
3858            Some(1),
3859            None,
3860            None,
3861            None,
3862            None,
3863            None,
3864            None,
3865            None,
3866            None
3867        ]));
3868
3869        assert!(batch.column(3).as_primitive::<Decimal128Type>().iter().eq([
3870            Some(1234),
3871            None,
3872            None,
3873            None,
3874            None,
3875            None,
3876            None,
3877            None,
3878            None,
3879            Some(42000)
3880        ]));
3881
3882        assert!(
3883            batch
3884                .column(4)
3885                .as_any()
3886                .downcast_ref::<StringArray>()
3887                .unwrap()
3888                .iter()
3889                .eq([
3890                    Some("hi"),
3891                    Some("ho"),
3892                    Some("1970-01-01T00:00:00+02:00"),
3893                    None,
3894                    None,
3895                    None,
3896                    None,
3897                    Some("true"),
3898                    Some("42"),
3899                    Some("1.234"),
3900                ])
3901        );
3902
3903        assert!(
3904            batch
3905                .column(5)
3906                .as_any()
3907                .downcast_ref::<StringViewArray>()
3908                .unwrap()
3909                .iter()
3910                .eq([
3911                    Some("ho"),
3912                    Some("1970-01-01T00:00:00+02:00"),
3913                    None,
3914                    None,
3915                    None,
3916                    None,
3917                    Some("true"),
3918                    Some("42"),
3919                    Some("1.234"),
3920                    Some("hi"),
3921                ])
3922        );
3923
3924        assert!(
3925            batch
3926                .column(6)
3927                .as_primitive::<TimestampSecondType>()
3928                .iter()
3929                .eq([
3930                    Some(-7200),
3931                    None,
3932                    None,
3933                    None,
3934                    None,
3935                    None,
3936                    Some(42),
3937                    None,
3938                    None,
3939                    None,
3940                ])
3941        );
3942
3943        let arrays = batch
3944            .column(7)
3945            .as_any()
3946            .downcast_ref::<ListArray>()
3947            .unwrap();
3948        assert_eq!(
3949            arrays.nulls(),
3950            Some(&NullBuffer::from(
3951                &[
3952                    true, false, false, false, false, false, false, false, false, false
3953                ][..]
3954            ))
3955        );
3956        assert_eq!(arrays.offsets()[1], 3);
3957        let array_values = arrays
3958            .values()
3959            .as_any()
3960            .downcast_ref::<Int32Array>()
3961            .unwrap();
3962        assert!(array_values.iter().eq([Some(1), None, Some(3)]));
3963
3964        let maps = batch.column(8).as_any().downcast_ref::<MapArray>().unwrap();
3965        assert_eq!(
3966            maps.nulls(),
3967            Some(&NullBuffer::from(
3968                // Both map and struct can parse
3969                &[
3970                    true, true, false, false, false, false, false, false, false, false
3971                ][..]
3972            ))
3973        );
3974        let map_keys = maps.keys().as_any().downcast_ref::<StringArray>().unwrap();
3975        assert!(map_keys.iter().eq([Some("k"), Some("a")]));
3976        let map_values = maps
3977            .values()
3978            .as_any()
3979            .downcast_ref::<StringArray>()
3980            .unwrap();
3981        assert!(map_values.iter().eq([Some("value"), Some("1")]));
3982
3983        let structs = batch
3984            .column(9)
3985            .as_any()
3986            .downcast_ref::<StructArray>()
3987            .unwrap();
3988        assert_eq!(
3989            structs.nulls(),
3990            Some(&NullBuffer::from(
3991                // Both map and struct can parse
3992                &[
3993                    true, false, false, false, false, false, false, false, false, true
3994                ][..]
3995            ))
3996        );
3997        let struct_fields = structs
3998            .column(0)
3999            .as_any()
4000            .downcast_ref::<Int32Array>()
4001            .unwrap();
4002        assert!(struct_fields.slice(0, 2).iter().eq([Some(1), None]));
4003    }
4004
4005    #[test]
4006    fn test_type_conflict_non_nullable() {
4007        let fields = [
4008            Field::new("bool", DataType::Boolean, false),
4009            Field::new("primitive", DataType::Int32, false),
4010            Field::new("numeric", DataType::Decimal128(10, 3), false),
4011            Field::new("string", DataType::Utf8, false),
4012            Field::new("string_view", DataType::Utf8View, false),
4013            Field::new(
4014                "timestamp",
4015                DataType::Timestamp(TimeUnit::Second, None),
4016                false,
4017            ),
4018            Field::new(
4019                "array",
4020                DataType::List(Arc::new(Field::new("item", DataType::Int32, true))),
4021                false,
4022            ),
4023            Field::new(
4024                "fixed_size_list",
4025                DataType::FixedSizeList(Arc::new(Field::new("item", DataType::Int32, true)), 2),
4026                false,
4027            ),
4028            Field::new(
4029                "map",
4030                DataType::Map(
4031                    Arc::new(Field::new(
4032                        Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
4033                        DataType::Struct(Fields::from(vec![
4034                            Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Utf8, false),
4035                            Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::Utf8, true),
4036                        ])),
4037                        false, // not nullable
4038                    )),
4039                    false, // not sorted
4040                ),
4041                false, // not nullable
4042            ),
4043            Field::new(
4044                "struct",
4045                DataType::Struct(Fields::from(vec![Field::new("a", DataType::Int32, true)])),
4046                false,
4047            ),
4048        ];
4049
4050        // Every field above will have a type conflict with at least one of these values
4051        let json_values = vec![json!(true), json!({"a": 1})];
4052
4053        for field in fields {
4054            let mut decoder = ReaderBuilder::new_with_field(field)
4055                .with_ignore_type_conflicts(true)
4056                .build_decoder()
4057                .unwrap();
4058            decoder.serialize(&json_values).unwrap();
4059            decoder
4060                .flush()
4061                .expect_err("type conflict on non-nullable type");
4062        }
4063    }
4064
4065    #[test]
4066    fn test_ignore_type_conflicts_disabled() {
4067        let fields = [
4068            Field::new("null", DataType::Null, true),
4069            Field::new("bool", DataType::Boolean, true),
4070            Field::new("primitive", DataType::Int32, true),
4071            Field::new("numeric", DataType::Decimal128(10, 3), true),
4072            Field::new("string", DataType::Utf8, true),
4073            Field::new("string_view", DataType::Utf8View, true),
4074            Field::new(
4075                "timestamp",
4076                DataType::Timestamp(TimeUnit::Second, None),
4077                true,
4078            ),
4079            Field::new(
4080                "array",
4081                DataType::List(Arc::new(Field::new("item", DataType::Int32, true))),
4082                true,
4083            ),
4084            Field::new(
4085                "fixed_size_list",
4086                DataType::FixedSizeList(Arc::new(Field::new("item", DataType::Int32, true)), 2),
4087                true,
4088            ),
4089            Field::new(
4090                "map",
4091                DataType::Map(
4092                    Arc::new(Field::new(
4093                        Field::MAP_ENTRIES_FIELD_DEFAULT_NAME,
4094                        DataType::Struct(Fields::from(vec![
4095                            Field::new(Field::MAP_KEY_FIELD_DEFAULT_NAME, DataType::Utf8, false),
4096                            Field::new(Field::MAP_VALUE_FIELD_DEFAULT_NAME, DataType::Utf8, true),
4097                        ])),
4098                        false, // not nullable
4099                    )),
4100                    false, // not sorted
4101                ),
4102                true, // not nullable
4103            ),
4104            Field::new(
4105                "struct",
4106                DataType::Struct(Fields::from(vec![Field::new("a", DataType::Int32, true)])),
4107                true,
4108            ),
4109        ];
4110
4111        // Every field above will have a type conflict with at least one of these values
4112        let json_values = vec![json!(true), json!({"a": 1})];
4113
4114        for field in fields {
4115            let mut decoder = ReaderBuilder::new_with_field(field)
4116                .build_decoder()
4117                .unwrap();
4118            decoder.serialize(&json_values).unwrap();
4119            decoder
4120                .flush()
4121                .expect_err("type conflict on non-nullable type");
4122        }
4123    }
4124
4125    #[test]
4126    fn test_read_run_end_encoded() {
4127        let buf = r#"
4128        {"a": "x"}
4129        {"a": "x"}
4130        {"a": "y"}
4131        {"a": "y"}
4132        {"a": "y"}
4133        "#;
4134
4135        let ree_type = DataType::RunEndEncoded(
4136            Arc::new(Field::new(
4137                Field::REE_RUN_ENDS_FIELD_DEFAULT_NAME,
4138                DataType::Int32,
4139                false,
4140            )),
4141            Arc::new(Field::new(
4142                Field::REE_VALUES_FIELD_DEFAULT_NAME,
4143                DataType::Utf8,
4144                true,
4145            )),
4146        );
4147        let schema = Arc::new(Schema::new(vec![Field::new("a", ree_type, true)]));
4148        let batches = do_read(buf, 1024, false, false, schema);
4149        assert_eq!(batches.len(), 1);
4150
4151        let col = batches[0].column(0);
4152        let run_array = col.as_run::<arrow_array::types::Int32Type>();
4153
4154        // 5 logical values compressed into 2 runs
4155        assert_eq!(run_array.len(), 5);
4156        assert_eq!(run_array.run_ends().values(), &[2, 5]);
4157
4158        let values = run_array.values().as_string::<i32>();
4159        assert_eq!(values.len(), 2);
4160        assert_eq!(values.value(0), "x");
4161        assert_eq!(values.value(1), "y");
4162    }
4163
4164    #[test]
4165    fn test_read_run_end_encoded_consecutive_nulls() {
4166        let buf = r#"
4167        {"a": "x"}
4168        {}
4169        {}
4170        {}
4171        {"a": "y"}
4172        "#;
4173
4174        let ree_type = DataType::RunEndEncoded(
4175            Arc::new(Field::new(
4176                Field::REE_RUN_ENDS_FIELD_DEFAULT_NAME,
4177                DataType::Int32,
4178                false,
4179            )),
4180            Arc::new(Field::new(
4181                Field::REE_VALUES_FIELD_DEFAULT_NAME,
4182                DataType::Utf8,
4183                true,
4184            )),
4185        );
4186        let schema = Arc::new(Schema::new(vec![Field::new("a", ree_type, true)]));
4187        let batches = do_read(buf, 1024, false, false, schema);
4188        assert_eq!(batches.len(), 1);
4189
4190        let col = batches[0].column(0);
4191        let run_array = col.as_run::<arrow_array::types::Int32Type>();
4192
4193        // 5 logical values: "x", null, null, null, "y" → 3 runs
4194        assert_eq!(run_array.len(), 5);
4195        assert_eq!(run_array.run_ends().values(), &[1, 4, 5]);
4196
4197        let values = run_array.values().as_string::<i32>();
4198        assert_eq!(values.len(), 3);
4199        assert_eq!(values.value(0), "x");
4200        assert!(values.is_null(1));
4201        assert_eq!(values.value(2), "y");
4202    }
4203
4204    #[test]
4205    fn test_read_run_end_encoded_nullability() {
4206        for field_nullable in [false, true] {
4207            for values_nullable in [false, true] {
4208                let ree_type = DataType::RunEndEncoded(
4209                    Arc::new(Field::new(
4210                        Field::REE_RUN_ENDS_FIELD_DEFAULT_NAME,
4211                        DataType::Int32,
4212                        false,
4213                    )),
4214                    Arc::new(Field::new(
4215                        Field::REE_VALUES_FIELD_DEFAULT_NAME,
4216                        DataType::Utf8,
4217                        values_nullable,
4218                    )),
4219                );
4220                let schema = Arc::new(Schema::new(vec![Field::new("a", ree_type, field_nullable)]));
4221
4222                for buf in [
4223                    r#"{"a": "x"}
4224                    {"a": null}
4225                    {"a": "y"}"#,
4226                    r#"{"a": "x"}
4227                    {}
4228                    {"a": "y"}"#,
4229                ] {
4230                    let mut decoder = ReaderBuilder::new(schema.clone()).build_decoder().unwrap();
4231                    let result = decoder.decode(buf.as_bytes()).and_then(|_| decoder.flush());
4232
4233                    if field_nullable && values_nullable {
4234                        result.expect("REE field and values are both nullable");
4235                    } else {
4236                        let err = result.expect_err(
4237                            "REE nulls require both the field and values to be nullable",
4238                        );
4239                        assert!(
4240                            err.to_string().contains(
4241                                "Encountered nulls in non-nullable values of RunEndEncoded"
4242                            ),
4243                            "unexpected error: {err}"
4244                        );
4245                    }
4246                }
4247            }
4248        }
4249    }
4250
4251    #[test]
4252    fn test_read_run_end_encoded_all_unique() {
4253        let buf = r#"
4254        {"a": 1}
4255        {"a": 2}
4256        {"a": 3}
4257        "#;
4258
4259        let ree_type = DataType::RunEndEncoded(
4260            Arc::new(Field::new(
4261                Field::REE_RUN_ENDS_FIELD_DEFAULT_NAME,
4262                DataType::Int32,
4263                false,
4264            )),
4265            Arc::new(Field::new(
4266                Field::REE_VALUES_FIELD_DEFAULT_NAME,
4267                DataType::Int32,
4268                true,
4269            )),
4270        );
4271        let schema = Arc::new(Schema::new(vec![Field::new("a", ree_type, true)]));
4272        let batches = do_read(buf, 1024, false, false, schema);
4273        assert_eq!(batches.len(), 1);
4274
4275        let col = batches[0].column(0);
4276        let run_array = col.as_run::<arrow_array::types::Int32Type>();
4277
4278        // No compression: 3 unique values → 3 runs
4279        assert_eq!(run_array.len(), 3);
4280        assert_eq!(run_array.run_ends().values(), &[1, 2, 3]);
4281    }
4282
4283    #[test]
4284    fn test_read_run_end_encoded_int16_run_ends() {
4285        let buf = r#"
4286        {"a": "x"}
4287        {"a": "x"}
4288        {"a": "y"}
4289        "#;
4290
4291        let ree_type = DataType::RunEndEncoded(
4292            Arc::new(Field::new(
4293                Field::REE_RUN_ENDS_FIELD_DEFAULT_NAME,
4294                DataType::Int16,
4295                false,
4296            )),
4297            Arc::new(Field::new(
4298                Field::REE_VALUES_FIELD_DEFAULT_NAME,
4299                DataType::Utf8,
4300                true,
4301            )),
4302        );
4303        let schema = Arc::new(Schema::new(vec![Field::new("a", ree_type, true)]));
4304        let batches = do_read(buf, 1024, false, false, schema);
4305        assert_eq!(batches.len(), 1);
4306
4307        let col = batches[0].column(0);
4308        let run_array = col.as_run::<arrow_array::types::Int16Type>();
4309
4310        assert_eq!(run_array.len(), 3);
4311        assert_eq!(run_array.run_ends().values(), &[2i16, 3]);
4312    }
4313
4314    #[test]
4315    fn test_read_nested_run_end_encoded() {
4316        let buf = r#"
4317        {"a": "x"}
4318        {"a": "x"}
4319        {"a": "y"}
4320        "#;
4321
4322        // The outer REE compresses whole rows, while the inner REE compresses the
4323        // repeated string values produced by decoding those rows.
4324        let inner_type = DataType::RunEndEncoded(
4325            Arc::new(Field::new(
4326                Field::REE_RUN_ENDS_FIELD_DEFAULT_NAME,
4327                DataType::Int64,
4328                false,
4329            )),
4330            Arc::new(Field::new(
4331                Field::REE_VALUES_FIELD_DEFAULT_NAME,
4332                DataType::Utf8,
4333                true,
4334            )),
4335        );
4336        let outer_type = DataType::RunEndEncoded(
4337            Arc::new(Field::new(
4338                Field::REE_RUN_ENDS_FIELD_DEFAULT_NAME,
4339                DataType::Int64,
4340                false,
4341            )),
4342            Arc::new(Field::new(
4343                Field::REE_VALUES_FIELD_DEFAULT_NAME,
4344                inner_type,
4345                true,
4346            )),
4347        );
4348        let schema = Arc::new(Schema::new(vec![Field::new("a", outer_type, true)]));
4349        let batches = do_read(buf, 1024, false, false, schema);
4350        assert_eq!(batches.len(), 1);
4351
4352        let col = batches[0].column(0);
4353        let outer = col.as_run::<arrow_array::types::Int64Type>();
4354        // Three logical rows compress to two outer runs: ["x", "x"] and ["y"].
4355        assert_eq!(outer.len(), 3);
4356        assert_eq!(outer.run_ends().values(), &[2, 3]);
4357
4358        let nested = outer.values().as_run::<arrow_array::types::Int64Type>();
4359        // The physical values of the outer REE are themselves a two-element REE.
4360        assert_eq!(nested.len(), 2);
4361        assert_eq!(nested.run_ends().values(), &[1, 2]);
4362
4363        let nested_values = nested.values().as_string::<i32>();
4364        assert_eq!(nested_values.len(), 2);
4365        assert_eq!(nested_values.value(0), "x");
4366        assert_eq!(nested_values.value(1), "y");
4367    }
4368
4369    #[test]
4370    fn test_flatten_top_level_arrays() {
4371        let buf = r#"
4372            [
4373                {"a": 1},
4374                {"a": 2}
4375            ]
4376            {"a": 3}
4377            [{"a": 4}, {"a": 5}, {"a": 6}]
4378            "#;
4379
4380        let schema = Arc::new(Schema::new(vec![Field::new("a", DataType::Int32, true)]));
4381        let batches = do_read_config(buf, ReaderBuilder::new(schema).with_flatten(true));
4382        assert_eq!(batches.len(), 1);
4383
4384        let col = batches[0].column(0);
4385        let col = col.as_any().downcast_ref::<Int32Array>().unwrap();
4386        assert_eq!(col.len(), 6);
4387        for i in 0..6 {
4388            assert_eq!(col.value(i), (i as i32) + 1);
4389        }
4390    }
4391
4392    /// Declining everything must be indistinguishable from no factory at all.
4393    #[test]
4394    fn test_decoder_factory_declining_everything_is_transparent() {
4395        #[derive(Debug, Default)]
4396        struct DeclineAll {
4397            seen: Mutex<Vec<FieldRef>>,
4398        }
4399
4400        impl DecoderFactory for DeclineAll {
4401            fn make_default_decoder(
4402                &self,
4403                _ctx: &DecoderContext,
4404                field: &FieldRef,
4405                _is_nullable: bool,
4406            ) -> Result<Option<Box<dyn ArrayDecoder>>, ArrowError> {
4407                self.seen.lock().unwrap().push(field.clone());
4408                Ok(None)
4409            }
4410        }
4411
4412        let schema = Arc::new(Schema::new(vec![
4413            Field::new("a", DataType::Int32, true),
4414            Field::new("b", DataType::Utf8, true),
4415            Field::new_list("c", Field::new("item", DataType::Float64, true), true),
4416        ]));
4417        let buf = r#"{"a": 1, "b": "x", "c": [1.5, 2.5]}
4418        {"a": null, "c": []}
4419        "#;
4420
4421        let read = |factory: Option<Arc<dyn DecoderFactory>>| {
4422            let mut builder = ReaderBuilder::new(schema.clone());
4423            if let Some(factory) = factory {
4424                builder = builder.with_decoder_factory(factory);
4425            }
4426            builder
4427                .build(Cursor::new(buf.as_bytes()))
4428                .unwrap()
4429                .next()
4430                .unwrap()
4431                .unwrap()
4432        };
4433
4434        let factory = Arc::new(DeclineAll::default());
4435        assert_eq!(read(None), read(Some(factory.clone())));
4436
4437        // Consulted for the root struct and every leaf, with names attached; the
4438        // root is the documented synthesized nameless struct
4439        let seen = factory.seen.lock().unwrap();
4440        assert!(
4441            matches!(seen[0].data_type(), DataType::Struct(_)),
4442            "{seen:?}"
4443        );
4444        assert_eq!(seen[0].name(), "", "root field should be nameless");
4445
4446        let by_name: Vec<(&str, &DataType)> = seen
4447            .iter()
4448            .map(|f| (f.name().as_str(), f.data_type()))
4449            .collect();
4450        for expected in [
4451            ("a", &DataType::Int32),
4452            ("b", &DataType::Utf8),
4453            ("item", &DataType::Float64),
4454        ] {
4455            assert!(
4456                by_name.contains(&expected),
4457                "{expected:?} missing from {by_name:?}"
4458            );
4459        }
4460    }
4461
4462    /// A custom decoder's output is not trusted: the arrays built from it are
4463    /// constructed without further validation, so a mismatch must be caught here.
4464    #[test]
4465    fn test_decoder_factory_output_is_validated() {
4466        /// Returns either the wrong data type or the wrong number of rows
4467        struct Bad {
4468            wrong_type: bool,
4469        }
4470
4471        impl ArrayDecoder for Bad {
4472            fn decode(&mut self, _tape: &Tape<'_>, pos: &[u32]) -> Result<ArrayRef, ArrowError> {
4473                Ok(match self.wrong_type {
4474                    true => Arc::new(StringViewArray::from(vec!["x"; pos.len()])) as ArrayRef,
4475                    false => Arc::new(StringArray::from(Vec::<&str>::new())),
4476                })
4477            }
4478        }
4479
4480        #[derive(Debug)]
4481        struct BadFactory {
4482            wrong_type: bool,
4483        }
4484
4485        impl DecoderFactory for BadFactory {
4486            fn make_default_decoder(
4487                &self,
4488                _ctx: &DecoderContext,
4489                field: &FieldRef,
4490                _is_nullable: bool,
4491            ) -> Result<Option<Box<dyn ArrayDecoder>>, ArrowError> {
4492                match field.data_type() {
4493                    DataType::Utf8 => Ok(Some(Box::new(Bad {
4494                        wrong_type: self.wrong_type,
4495                    }))),
4496                    _ => Ok(None),
4497                }
4498            }
4499        }
4500
4501        let read = |wrong_type: bool| {
4502            let schema = Arc::new(Schema::new(vec![Field::new("s", DataType::Utf8, true)]));
4503            ReaderBuilder::new(schema)
4504                .with_decoder_factory(Arc::new(BadFactory { wrong_type }))
4505                .build(Cursor::new(br#"{"s": "hello"}"#.as_slice()))
4506                .unwrap()
4507                .next()
4508                .unwrap()
4509                .unwrap_err()
4510                .to_string()
4511        };
4512
4513        let err = read(true);
4514        assert!(
4515            err.contains("returned Utf8View for a field of type Utf8"),
4516            "{err}"
4517        );
4518
4519        let err = read(false);
4520        assert!(err.contains("returned 0 values for 1 rows"), "{err}");
4521    }
4522
4523    #[test]
4524    fn test_non_finite_floats() {
4525        let schema = infer_json_schema_from_iterator(std::iter::once(Ok(json!({
4526            "metadata": {"year": 0.0}, "values": [0.0], "text": ""
4527        }))))
4528        .unwrap();
4529        let builder = ReaderBuilder::new(Arc::new(schema));
4530        let input = r#"{"metadata":{"year":NaN},"values":[Infinity,-Infinity,null],"text":"NaN \"Infinity\""}"#;
4531        let mut reader = builder.clone().build(input.as_bytes()).unwrap();
4532        assert!(reader.next().unwrap().is_err());
4533
4534        // Existing helper covers small I/O buffers and multiple batch sizes.
4535        let builder = builder.with_allow_non_finite_floats(true);
4536        let batches = do_read_config(&format!("{input}\n{input}"), builder.clone());
4537        let batch = &batches[0];
4538        let year = batch
4539            .column_by_name("metadata")
4540            .unwrap()
4541            .as_struct()
4542            .column_by_name("year")
4543            .unwrap()
4544            .as_primitive::<Float64Type>();
4545        assert_eq!(year.null_count(), 0);
4546        assert!(year.values().iter().all(|value| value.is_nan()));
4547        let lists = batch.column_by_name("values").unwrap().as_list::<i32>();
4548        let text = batch.column_by_name("text").unwrap().as_string::<i32>();
4549        for row in 0..batch.num_rows() {
4550            let values = lists.value(row);
4551            let values = values.as_primitive::<Float64Type>();
4552            assert_eq!(values.value(0), f64::INFINITY);
4553            assert_eq!(values.value(1), f64::NEG_INFINITY);
4554            assert!(values.is_null(2));
4555            assert_eq!(text.value(row), r#"NaN "Infinity""#);
4556        }
4557    }
4558}