1use 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::*;
169pub 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#[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 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 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 pub fn with_batch_size(self, batch_size: usize) -> Self {
277 Self { batch_size, ..self }
278 }
279
280 pub fn with_coerce_primitive(self, coerce_primitive: bool) -> Self {
283 Self {
284 coerce_primitive,
285 ..self
286 }
287 }
288
289 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 pub fn with_strict_mode(self, strict_mode: bool) -> Self {
307 Self {
308 strict_mode,
309 ..self
310 }
311 }
312
313 pub fn with_struct_mode(self, struct_mode: StructMode) -> Self {
317 Self {
318 struct_mode,
319 ..self
320 }
321 }
322
323 pub fn with_ignore_type_conflicts(self, ignore_type_conflicts: bool) -> Self {
336 Self {
337 ignore_type_conflicts,
338 ..self
339 }
340 }
341 pub fn with_flatten(self, flatten_top_level_arrays: bool) -> Self {
359 Self {
360 flatten_top_level_arrays,
361 ..self
362 }
363 }
364
365 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 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 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 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
419pub 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 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
469pub 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 pub fn decode(&mut self, buf: &[u8]) -> Result<usize, ArrowError> {
536 self.tape_decoder.decode(buf)
537 }
538
539 pub fn serialize<S: Serialize>(&mut self, rows: &[S]) -> Result<(), ArrowError> {
716 self.tape_decoder.serialize(rows)
717 }
718
719 pub fn has_partial_record(&self) -> bool {
721 self.tape_decoder.has_partial_row()
722 }
723
724 pub fn len(&self) -> usize {
726 self.tape_decoder.num_buffered_rows()
727 }
728
729 pub fn is_empty(&self) -> bool {
731 self.len() == 0
732 }
733
734 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 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
770pub trait ArrayDecoder: Send {
774 fn decode(&mut self, tape: &Tape<'_>, pos: &[u32]) -> Result<ArrayRef, ArrowError>;
780}
781
782pub trait DecoderFactory: std::fmt::Debug + Send + Sync {
967 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
994struct 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
1022pub struct DecoderContext {
1027 coerce_primitive: bool,
1029 strict_mode: bool,
1031 struct_mode: StructMode,
1033 ignore_type_conflicts: bool,
1035 decoder_factory: Option<Arc<dyn DecoderFactory>>,
1037}
1038
1039impl DecoderContext {
1040 pub fn coerce_primitive(&self) -> bool {
1042 self.coerce_primitive
1043 }
1044
1045 pub fn strict_mode(&self) -> bool {
1047 self.strict_mode
1048 }
1049
1050 pub fn struct_mode(&self) -> StructMode {
1052 self.struct_mode
1053 }
1054
1055 pub fn ignore_type_conflicts(&self) -> bool {
1057 self.ignore_type_conflicts
1058 }
1059
1060 pub fn decoder_factory(&self) -> Option<&Arc<dyn DecoderFactory>> {
1062 self.decoder_factory.as_ref()
1063 }
1064
1065 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 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 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 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 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 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 let data_buffer = string_view_array.to_data().buffers()[0].len();
1411
1412 assert!(
1415 data_buffer >= expected_capacity,
1416 "Data buffer length ({data_buffer}) should be at least {expected_capacity}",
1417 );
1418
1419 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]
1428 fn test_numeric_view_allocation() {
1429 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 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 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 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 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)] fn test_timestamps() {
2023 test_timestamp::<TimestampSecondType>();
2024 test_timestamp::<TimestampMillisecondType>();
2025 test_timestamp::<TimestampMicrosecondType>();
2026 test_timestamp::<TimestampNanosecondType>();
2027 }
2028
2029 #[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 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 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()); 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()); 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 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 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 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 let batch = reader.next().unwrap().unwrap();
2759 let read = batch.column(0);
2760 assert_eq!(read.len(), 6);
2761 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 assert_eq!(read.nulls(), expected.nulls());
2767 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 assert_eq!(struct_array.nulls(), expected_struct_array.nulls());
2777 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 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 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 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 assert!(list_view.is_null(2));
2841
2842 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 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)); assert!(col.is_null(2)); 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 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 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 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]
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 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 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, )),
3781 false, ),
3783 true, ),
3785 Field::new(
3786 "struct",
3787 DataType::Struct(Fields::from(vec![Field::new("a", DataType::Int32, true)])),
3788 true,
3789 ),
3790 ]);
3791
3792 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 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 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 &[
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 &[
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, )),
4039 false, ),
4041 false, ),
4043 Field::new(
4044 "struct",
4045 DataType::Struct(Fields::from(vec![Field::new("a", DataType::Int32, true)])),
4046 false,
4047 ),
4048 ];
4049
4050 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, )),
4100 false, ),
4102 true, ),
4104 Field::new(
4105 "struct",
4106 DataType::Struct(Fields::from(vec![Field::new("a", DataType::Int32, true)])),
4107 true,
4108 ),
4109 ];
4110
4111 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 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 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 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 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 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 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 #[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 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 #[test]
4465 fn test_decoder_factory_output_is_validated() {
4466 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 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}