Path: blob/main/crates/polars-parquet/src/arrow/write/nested/dremel/tests.rs
6940 views
use super::*;12mod def {3use super::*;4use crate::write::pages::{ListNested, PrimitiveNested, StructNested};56fn test(nested: Vec<Nested>, expected: Vec<u16>) {7let mut iter = BufferedDremelIter::new(&nested).map(|d| d.def);8// assert_eq!(iter.size_hint().0, expected.len());9let result = iter.by_ref().collect::<Vec<_>>();10assert_eq!(result, expected);11// assert_eq!(iter.size_hint().0, 0);12}1314#[test]15fn struct_dbl_optional() {16let a = [true, true, true, false, true, true];17let b = [true, false, true, false, false, true];18let nested = vec![19Nested::Struct(StructNested {20is_optional: true,21validity: Some(a.into()),22length: 6,23}),24Nested::Primitive(PrimitiveNested {25validity: Some(b.into()),26is_optional: true,27length: 6,28}),29];30let expected = vec![2, 1, 2, 0, 1, 2];3132test(nested, expected)33}3435#[test]36fn struct_optional() {37let b = [38true, false, true, true, false, true, false, false, true, true,39];40let nested = vec![41Nested::Struct(StructNested {42is_optional: true,43validity: None,44length: 10,45}),46Nested::Primitive(PrimitiveNested {47validity: Some(b.into()),48is_optional: true,49length: 10,50}),51];52let expected = vec![2, 1, 2, 2, 1, 2, 1, 1, 2, 2];5354test(nested, expected)55}5657#[test]58fn nested_edge_simple() {59let nested = vec![60Nested::List(ListNested {61is_optional: true,62offsets: vec![0, 2].try_into().unwrap(),63validity: None,64}),65Nested::Primitive(PrimitiveNested {66validity: None,67is_optional: true,68length: 2,69}),70];71let expected = vec![3, 3];7273test(nested, expected)74}7576#[test]77fn struct_optional_1() {78let b = [79true, false, true, true, false, true, false, false, true, true,80];81let nested = vec![82Nested::Struct(StructNested {83validity: None,84is_optional: true,85length: 10,86}),87Nested::Primitive(PrimitiveNested {88validity: Some(b.into()),89is_optional: true,90length: 10,91}),92];93let expected = vec![2, 1, 2, 2, 1, 2, 1, 1, 2, 2];9495test(nested, expected)96}9798#[test]99fn struct_optional_optional() {100let nested = vec![101Nested::Struct(StructNested {102is_optional: true,103validity: None,104length: 10,105}),106Nested::Primitive(PrimitiveNested {107validity: None,108is_optional: true,109length: 10,110}),111];112let expected = vec![2, 2, 2, 2, 2, 2, 2, 2, 2, 2];113114test(nested, expected)115}116117#[test]118fn l1_required_required() {119let nested = vec![120// [[0, 1], [], [2, 0, 3], [4, 5, 6], [], [7, 8, 9], [], [10]]121Nested::List(ListNested {122is_optional: false,123offsets: vec![0, 2, 2, 5, 8, 8, 11, 11, 12].try_into().unwrap(),124validity: None,125}),126Nested::Primitive(PrimitiveNested {127validity: None,128is_optional: false,129length: 12,130}),131];132let expected = vec![1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1];133134test(nested, expected)135}136137#[test]138fn l1_optional_optional() {139// [[0, 1], None, [2, None, 3], [4, 5, 6], [], [7, 8, 9], None, [10]]140141let v0 = [true, false, true, true, true, true, false, true];142let v1 = [143true, true, //[0, 1]144true, false, true, //[2, None, 3]145true, true, true, //[4, 5, 6]146true, true, true, //[7, 8, 9]147true, //[10]148];149let nested = vec![150Nested::List(ListNested {151is_optional: true,152offsets: vec![0, 2, 2, 5, 8, 8, 11, 11, 12].try_into().unwrap(),153validity: Some(v0.into()),154}),155Nested::Primitive(PrimitiveNested {156validity: Some(v1.into()),157is_optional: true,158length: 12,159}),160];161let expected = vec![3, 3, 0, 3, 2, 3, 3, 3, 3, 1, 3, 3, 3, 0, 3];162163test(nested, expected)164}165166#[test]167fn l2_required_required_required() {168/*169[170[171[1,2,3],172[4,5,6,7],173],174[175[8],176[9, 10]177]178]179*/180let nested = vec![181Nested::List(ListNested {182is_optional: false,183offsets: vec![0, 2, 4].try_into().unwrap(),184validity: None,185}),186Nested::List(ListNested {187is_optional: false,188offsets: vec![0, 3, 7, 8, 10].try_into().unwrap(),189validity: None,190}),191Nested::Primitive(PrimitiveNested {192validity: None,193is_optional: false,194length: 10,195}),196];197let expected = vec![2, 2, 2, 2, 2, 2, 2, 2, 2, 2];198199test(nested, expected)200}201202#[test]203fn l2_optional_required_required() {204let a = [true, false, true, true];205/*206[207[208[1,2,3],209[4,5,6,7],210],211None,212[213[8],214[],215[9, 10]216]217]218*/219let nested = vec![220Nested::List(ListNested {221is_optional: true,222offsets: vec![0, 2, 2, 2, 5].try_into().unwrap(),223validity: Some(a.into()),224}),225Nested::List(ListNested {226is_optional: false,227offsets: vec![0, 3, 7, 8, 8, 10].try_into().unwrap(),228validity: None,229}),230Nested::Primitive(PrimitiveNested {231validity: None,232is_optional: false,233length: 10,234}),235];236let expected = vec![3, 3, 3, 3, 3, 3, 3, 0, 1, 3, 2, 3, 3];237238test(nested, expected)239}240241mod fixedlist {242use super::*;243244#[test]245fn fsl() {246/* [ [ 1, 2 ], None, [ None, 3 ] ] */247let a = [true, false, true];248let b = [true, true, false, false, false, true];249let nested = vec![250Nested::fixed_size_list(Some(a.into()), true, 2, 3),251Nested::primitive(Some(b.into()), true, 6),252];253let expected = vec![3, 3, 0, 2, 3];254255test(nested, expected)256}257258#[test]259fn fsl_fsl() {260// [261// [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],262// None,263// [ None, [ 7, None, 9 ] ],264// ]265let a = [true, false, true];266let b = [true, true, true, true, false, true];267let c = [268true, true, true, true, true, true, false, false, false, false, false, false,269false, false, false, true, false, true,270];271let nested = vec![272Nested::fixed_size_list(Some(a.into()), true, 2, 3),273Nested::fixed_size_list(Some(b.into()), true, 3, 6),274Nested::primitive(Some(c.into()), true, 18),275];276let expected = vec![5, 5, 5, 5, 5, 5, 0, 2, 5, 4, 5];277278test(nested, expected)279}280281#[test]282fn fsl_fsl_1() {283// [284// [ [1, 5, 2], [42, 13, 37] ],285// None,286// [ None, [3, 1, 3] ]287// ]288let a = [true, false, true];289let b = [true, true, false, false, false, true];290let c = [291true, true, true, true, true, true, false, false, false, false, false, false,292false, false, false, true, true, true,293];294let nested = vec![295Nested::fixed_size_list(Some(a.into()), true, 2, 3),296Nested::fixed_size_list(Some(b.into()), true, 3, 6),297Nested::primitive(Some(c.into()), true, 18),298];299let expected = vec![5, 5, 5, 5, 5, 5, 0, 2, 5, 5, 5];300301test(nested, expected)302}303}304305mod simple {306use super::*;307308#[test]309fn none() {310/* [ None ] */311let a = [false];312let b = [];313let nested = vec![314Nested::List(ListNested {315is_optional: true,316offsets: vec![0, 0].try_into().unwrap(),317validity: Some(a.into()),318}),319Nested::List(ListNested {320is_optional: true,321offsets: vec![0].try_into().unwrap(),322validity: Some(b.into()),323}),324Nested::Primitive(PrimitiveNested {325validity: None,326is_optional: false,327length: 0,328}),329];330let expected = vec![0];331332test(nested, expected)333}334335#[test]336fn empty() {337/* [ [ ] ] */338let a = [true];339let b = [];340let nested = vec![341Nested::List(ListNested {342is_optional: true,343offsets: vec![0, 0].try_into().unwrap(),344validity: Some(a.into()),345}),346Nested::List(ListNested {347is_optional: true,348offsets: vec![0].try_into().unwrap(),349validity: Some(b.into()),350}),351Nested::Primitive(PrimitiveNested {352validity: None,353is_optional: false,354length: 0,355}),356];357let expected = vec![1];358359test(nested, expected)360}361362#[test]363fn list_none() {364/* [ [ None ] ] */365let a = [true];366let b = [false];367let nested = vec![368Nested::List(ListNested {369is_optional: true,370offsets: vec![0, 1].try_into().unwrap(),371validity: Some(a.into()),372}),373Nested::List(ListNested {374is_optional: true,375offsets: vec![0, 0].try_into().unwrap(),376validity: Some(b.into()),377}),378Nested::Primitive(PrimitiveNested {379validity: None,380is_optional: false,381length: 0,382}),383];384let expected = vec![2];385386test(nested, expected)387}388389#[test]390fn list_empty() {391/* [ [ [] ] ] */392let a = [true];393let b = [true];394let nested = vec![395Nested::List(ListNested {396is_optional: true,397offsets: vec![0, 1].try_into().unwrap(),398validity: Some(a.into()),399}),400Nested::List(ListNested {401is_optional: true,402offsets: vec![0, 0].try_into().unwrap(),403validity: Some(b.into()),404}),405Nested::Primitive(PrimitiveNested {406validity: None,407is_optional: false,408length: 0,409}),410];411let expected = vec![3];412413test(nested, expected)414}415416#[test]417fn list_list_one() {418/* [ [ [ 1 ] ] ] */419let a = [true];420let b = [true];421let nested = vec![422Nested::List(ListNested {423is_optional: true,424offsets: vec![0, 1].try_into().unwrap(),425validity: Some(a.into()),426}),427Nested::List(ListNested {428is_optional: true,429offsets: vec![0, 1].try_into().unwrap(),430validity: Some(b.into()),431}),432Nested::Primitive(PrimitiveNested {433validity: None,434is_optional: false,435length: 1,436}),437];438let expected = vec![4];439440test(nested, expected)441}442}443444#[test]445fn l2_optional_optional_required() {446let a = [true, false, true];447let b = [true, true, true, true, false];448/*449[450[451[1,2,3],452[4,5,6,7],453],454None,455[456[8],457[],458None,459],460]461*/462let nested = vec![463Nested::List(ListNested {464is_optional: true,465offsets: vec![0, 2, 2, 5].try_into().unwrap(),466validity: Some(a.into()),467}),468Nested::List(ListNested {469is_optional: true,470offsets: vec![0, 3, 7, 8, 8, 8].try_into().unwrap(),471validity: Some(b.into()),472}),473Nested::Primitive(PrimitiveNested {474validity: None,475is_optional: false,476length: 8,477}),478];479let expected = vec![4, 4, 4, 4, 4, 4, 4, 0, 4, 3, 2];480481test(nested, expected)482}483484#[test]485fn l2_optional_optional_optional() {486let a = [true, false, true];487let b = [true, true, true, false];488let c = [true, true, true, true, false, true, true, true];489/*490[491[492[1,2,3],493[4,None,6,7],494],495None,496[497[8],498None,499],500]501*/502let nested = vec![503Nested::List(ListNested {504is_optional: true,505offsets: vec![0, 2, 2, 4].try_into().unwrap(),506validity: Some(a.into()),507}),508Nested::List(ListNested {509is_optional: true,510offsets: vec![0, 3, 7, 8, 8].try_into().unwrap(),511validity: Some(b.into()),512}),513Nested::Primitive(PrimitiveNested {514validity: Some(c.into()),515is_optional: true,516length: 8,517}),518];519let expected = vec![5, 5, 5, 5, 4, 5, 5, 0, 5, 2];520521test(nested, expected)522}523524/*525[{"a": "a"}, {"a": "b"}],526None,527[{"a": "b"}, None, {"a": "b"}],528[{"a": None}, {"a": None}, {"a": None}],529[],530[{"a": "d"}, {"a": "d"}, {"a": "d"}],531None,532[{"a": "e"}],533*/534#[test]535fn nested_list_struct_nullable() {536let a = [537true, true, true, false, true, false, false, false, true, true, true, true,538];539let b = [540true, true, true, false, true, true, true, true, true, true, true, true,541];542let c = [true, false, true, true, true, true, false, true];543let nested = vec![544Nested::List(ListNested {545is_optional: true,546offsets: vec![0, 2, 2, 5, 8, 8, 11, 11, 12].try_into().unwrap(),547validity: Some(c.into()),548}),549Nested::Struct(StructNested {550validity: Some(b.into()),551is_optional: true,552length: 12,553}),554Nested::Primitive(PrimitiveNested {555validity: Some(a.into()),556is_optional: true,557length: 12,558}),559];560let expected = vec![4, 4, 0, 4, 2, 4, 3, 3, 3, 1, 4, 4, 4, 0, 4];561562test(nested, expected)563}564565#[test]566fn nested_list_struct_nullable1() {567let c = [true, false];568let nested = vec![569Nested::List(ListNested {570is_optional: true,571offsets: vec![0, 1, 1].try_into().unwrap(),572validity: Some(c.into()),573}),574Nested::Struct(StructNested {575validity: None,576is_optional: true,577length: 1,578}),579Nested::Primitive(PrimitiveNested {580validity: None,581is_optional: true,582length: 1,583}),584];585let expected = vec![4, 0];586587test(nested, expected)588}589590#[test]591fn nested_struct_list_nullable() {592// [593// { "a": [] },594// { "a", [] },595// ]596let a = [true, false, true, true, true, true, false, true];597let b = [598true, true, true, false, true, true, true, true, true, true, true, true,599];600let nested = vec![601Nested::Struct(StructNested {602validity: None,603is_optional: true,604length: 8,605}),606Nested::List(ListNested {607is_optional: true,608offsets: vec![0, 2, 2, 5, 8, 8, 11, 11, 12].try_into().unwrap(),609validity: Some(a.into()),610}),611Nested::Primitive(PrimitiveNested {612validity: Some(b.into()),613is_optional: true,614length: 12,615}),616];617let expected = vec![4, 4, 1, 4, 3, 4, 4, 4, 4, 2, 4, 4, 4, 1, 4];618619test(nested, expected)620}621622#[test]623fn nested_struct_list_nullable1() {624let a = [true, true, false];625let nested = vec![626Nested::Struct(StructNested {627validity: None,628is_optional: true,629length: 3,630}),631Nested::List(ListNested {632is_optional: true,633offsets: vec![0, 1, 1, 1].try_into().unwrap(),634validity: Some(a.into()),635}),636Nested::Primitive(PrimitiveNested {637validity: None,638is_optional: true,639length: 1,640}),641];642let expected = vec![4, 2, 1];643644test(nested, expected)645}646647#[test]648fn nested_list_struct_list_nullable1() {649/*650[651[{"a": ["b"]}, None],652]653*/654655let a = [true];656let b = [true, false];657let c = [true, false];658let d = [true];659let nested = vec![660Nested::List(ListNested {661is_optional: true,662offsets: vec![0, 2].try_into().unwrap(),663validity: Some(a.into()),664}),665Nested::Struct(StructNested {666validity: Some(b.into()),667is_optional: true,668length: 2,669}),670Nested::List(ListNested {671is_optional: true,672offsets: vec![0, 1, 1].try_into().unwrap(),673validity: Some(c.into()),674}),675Nested::Primitive(PrimitiveNested {676validity: Some(d.into()),677is_optional: true,678length: 1,679}),680];681/*6820 66831 66840 06850 66861 2687*/688let expected = vec![6, 2];689690test(nested, expected)691}692693#[test]694fn nested_list_struct_list_nullable() {695/*696[697[{"a": ["a"]}, {"a": ["b"]}],698None,699[{"a": ["b"]}, None, {"a": ["b"]}],700[{"a": None}, {"a": None}, {"a": None}],701[],702[{"a": ["d"]}, {"a": [None]}, {"a": ["c", "d"]}],703None,704[{"a": []}],705]706*/707let a = [true, false, true, true, true, true, false, true];708let b = [709true, true, true, false, true, true, true, true, true, true, true, true,710];711let c = [712true, true, true, false, true, false, false, false, true, true, true, true,713];714let d = [true, true, true, true, true, false, true, true];715let nested = vec![716Nested::List(ListNested {717is_optional: true,718offsets: vec![0, 2, 2, 5, 8, 8, 11, 11, 12].try_into().unwrap(),719validity: Some(a.into()),720}),721Nested::Struct(StructNested {722validity: Some(b.into()),723is_optional: true,724length: 12,725}),726Nested::List(ListNested {727is_optional: true,728offsets: vec![0, 1, 2, 3, 3, 4, 4, 4, 4, 5, 6, 8, 8]729.try_into()730.unwrap(),731validity: Some(c.into()),732}),733Nested::Primitive(PrimitiveNested {734validity: Some(d.into()),735is_optional: true,736length: 8,737}),738];739let expected = vec![6, 6, 0, 6, 2, 6, 3, 3, 3, 1, 6, 5, 6, 6, 0, 4];740741test(nested, expected)742}743}744745mod rep {746use super::super::super::super::pages::ListNested;747use super::*;748749fn test(nested: Vec<Nested>, expected: Vec<u16>) {750let mut iter = BufferedDremelIter::new(&nested).map(|d| d.rep);751// assert_eq!(iter.size_hint().0, expected.len());752assert_eq!(iter.by_ref().collect::<Vec<_>>(), expected);753// assert_eq!(iter.size_hint().0, 0);754}755756#[test]757fn struct_required() {758let nested = vec![759Nested::structure(None, false, 10),760Nested::primitive(None, true, 10),761];762let expected = vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0];763764test(nested, expected)765}766767#[test]768fn struct_optional() {769let nested = vec![770Nested::structure(None, true, 10),771Nested::primitive(None, true, 10),772];773let expected = vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0];774775test(nested, expected)776}777778#[test]779fn l1() {780// [781// [ 1, 2 ],782// [],783// [ 3, 4, 5 ],784// [ 6, 7, 8 ],785// [],786// [ 9, 10, 11 ],787// [],788// [ 12 ],789// ]790let nested = vec![791Nested::list(792None,793false,794vec![0, 2, 2, 5, 8, 8, 11, 11, 12].try_into().unwrap(),795),796Nested::primitive(None, false, 12),797];798let expected = vec![0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0];799800test(nested, expected)801}802803#[test]804fn l2() {805let nested = vec![806Nested::List(ListNested {807is_optional: false,808offsets: vec![0, 2, 2, 4].try_into().unwrap(),809validity: None,810}),811Nested::List(ListNested {812is_optional: false,813offsets: vec![0, 3, 7, 8, 10].try_into().unwrap(),814validity: None,815}),816Nested::primitive(None, false, 10),817];818let expected = vec![0, 2, 2, 1, 2, 2, 2, 0, 0, 1, 2];819820test(nested, expected)821}822823#[test]824fn list_of_struct() {825/*826[827[{"a": "b"}],[{"a": "c"}]828]829*/830let nested = vec![831Nested::List(ListNested {832is_optional: true,833offsets: vec![0, 1, 2].try_into().unwrap(),834validity: None,835}),836Nested::structure(None, true, 2),837Nested::primitive(None, true, 2),838];839let expected = vec![0, 0];840841test(nested, expected)842}843844#[test]845fn list_struct_list() {846let nested = vec![847Nested::List(ListNested {848is_optional: true,849offsets: vec![0, 2, 3].try_into().unwrap(),850validity: None,851}),852Nested::structure(None, true, 3),853Nested::List(ListNested {854is_optional: true,855offsets: vec![0, 3, 6, 7].try_into().unwrap(),856validity: None,857}),858Nested::primitive(None, true, 7),859];860let expected = vec![0, 2, 2, 1, 2, 2, 0];861862test(nested, expected)863}864865#[test]866fn struct_list_optional() {867/*868{"f1": ["a", "b", None, "c"]}869*/870let nested = vec![871Nested::structure(None, true, 1),872Nested::List(ListNested {873is_optional: true,874offsets: vec![0, 4].try_into().unwrap(),875validity: None,876}),877Nested::primitive(None, true, 4),878];879let expected = vec![0, 1, 1, 1];880881test(nested, expected)882}883884#[test]885fn l2_other() {886let nested = vec![887Nested::List(ListNested {888is_optional: false,889offsets: vec![0, 1, 1, 3, 5, 5, 8, 8, 9].try_into().unwrap(),890validity: None,891}),892Nested::List(ListNested {893is_optional: false,894offsets: vec![0, 2, 4, 5, 7, 8, 9, 10, 11, 12].try_into().unwrap(),895validity: None,896}),897Nested::primitive(None, false, 12),898];899let expected = vec![0, 2, 0, 0, 2, 1, 0, 2, 1, 0, 0, 1, 1, 0, 0];900901test(nested, expected)902}903904#[test]905fn list_struct_list_1() {906/*907[908[{"a": ["a"]}, {"a": ["b"]}],909[],910[{"a": ["b"]}, None, {"a": ["b"]}],911[{"a": []}, {"a": []}, {"a": []}],912[],913[{"a": ["d"]}, {"a": ["a"]}, {"a": ["c", "d"]}],914[],915[{"a": []}],916]917// reps: [0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 2, 0, 0]918*/919let a = [920true, true, true, false, true, true, true, true, true, true, true, true,921];922let nested = vec![923Nested::List(ListNested {924is_optional: true,925offsets: vec![0, 2, 2, 5, 8, 8, 11, 11, 12].try_into().unwrap(),926validity: None,927}),928Nested::structure(Some(a.into()), true, 12),929Nested::List(ListNested {930is_optional: true,931offsets: vec![0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 7, 8]932.try_into()933.unwrap(),934validity: None,935}),936Nested::primitive(None, true, 8),937];938let expected = vec![0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 2, 0, 0];939940test(nested, expected)941}942943#[test]944fn list_struct_list_2() {945/*946[947[{"a": []}],948]949// reps: [0]950*/951let nested = vec![952Nested::List(ListNested {953is_optional: true,954offsets: vec![0, 1].try_into().unwrap(),955validity: None,956}),957Nested::structure(None, true, 12),958Nested::List(ListNested {959is_optional: true,960offsets: vec![0, 0].try_into().unwrap(),961validity: None,962}),963Nested::primitive(None, true, 0),964];965let expected = vec![0];966967test(nested, expected)968}969970#[test]971fn list_struct_list_3() {972let nested = vec![973Nested::List(ListNested {974is_optional: true,975offsets: vec![0, 1, 1].try_into().unwrap(),976validity: None,977}),978Nested::structure(None, true, 12),979Nested::List(ListNested {980is_optional: true,981offsets: vec![0, 0].try_into().unwrap(),982validity: None,983}),984Nested::primitive(None, true, 0),985];986let expected = vec![0, 0];987// [1, 0], [0]988// pick last989990test(nested, expected)991}992}993994995