1818 */
1919package org .apache .parquet .avro ;
2020
21- import static org .apache .parquet .avro .AvroTestUtil .*;
2221import static org .apache .parquet .schema .PrimitiveType .PrimitiveTypeName .*;
2322import static org .junit .Assert .*;
2423
4847
4948public class TestWriteVariant extends DirectWriterTest {
5049
51- // Construct a variant, and return the value binary, dropping metadata.
5250 private static Variant fullVariant (Consumer <VariantBuilder > appendValue ) {
5351 VariantBuilder builder = new VariantBuilder ();
5452 appendValue .accept (builder );
@@ -103,8 +101,14 @@ private static MessageType parquetSchema(GroupType variantGroup) {
103101 private ByteBuffer TEST_METADATA ;
104102 private ByteBuffer TEST_OBJECT ;
105103 private ByteBuffer SIMILAR_OBJECT ;
106- private ByteBuffer TEST_ARRAY ;
107- private ByteBuffer SIMILAR_ARRAY ;
104+ private ByteBuffer EMPTY_ARRAY ;
105+ private ByteBuffer STRING_ARRAY ;
106+ private ByteBuffer MIXED_ARRAY ;
107+ private ByteBuffer NESTED_ARRAY ;
108+ private ByteBuffer MIXED_NESTED_ARRAY ;
109+ private ByteBuffer OBJECT_IN_ARRAY ;
110+ private ByteBuffer MIXED_OBJECT_IN_ARRAY ;
111+ private ByteBuffer SIMILAR_OBJECT_IN_ARRAY ;
108112 private ByteBuffer EMPTY_OBJECT ;
109113 private ByteBuffer EMPTY_METADATA = fullVariant (b -> b .appendNull ()).getMetadataBuffer ();
110114 private Variant [] VARIANTS ;
@@ -144,8 +148,79 @@ public TestWriteVariant() throws Exception {
144148 b .endObject ();
145149 });
146150
151+ EMPTY_ARRAY = variant (b -> {
152+ b .startArray ();
153+ b .endArray ();
154+ });
155+
156+ STRING_ARRAY = variant (b -> {
157+ VariantArrayBuilder ab = b .startArray ();
158+ ab .appendString ("parquet" );
159+ b .endArray ();
160+ });
161+
162+ MIXED_ARRAY = variant (b -> {
163+ VariantArrayBuilder ab = b .startArray ();
164+ ab .appendString ("parquet" );
165+ ab .appendString ("string" );
166+ ab .appendInt (34 );
167+ b .endArray ();
168+ });
169+
170+ NESTED_ARRAY = variant (b -> {
171+ VariantArrayBuilder ab = b .startArray ();
172+ VariantArrayBuilder inner1 = ab .startArray ();
173+ inner1 .appendString ("parquet" );
174+ inner1 .appendString ("string" );
175+ ab .endArray ();
176+ VariantArrayBuilder inner2 = ab .startArray ();
177+ inner2 .appendString ("parquet" );
178+ inner2 .appendString ("string" );
179+ ab .endArray ();
180+ b .endArray ();
181+ });
182+
183+ MIXED_NESTED_ARRAY = variant (b -> {
184+ VariantArrayBuilder ab = b .startArray ();
185+ VariantArrayBuilder inner1 = ab .startArray ();
186+ inner1 .appendString ("parquet" );
187+ inner1 .appendString ("string" );
188+ inner1 .appendInt (34 );
189+ ab .endArray ();
190+ VariantArrayBuilder inner2 = ab .startArray ();
191+ inner2 .appendInt (34 );
192+ inner2 .appendNull ();
193+ ab .endArray ();
194+ ab .startArray ();
195+ ab .endArray ();
196+ VariantArrayBuilder inner4 = ab .startArray ();
197+ inner4 .appendString ("parquet" );
198+ inner4 .appendString ("string" );
199+ inner4 .appendInt (34 );
200+ ab .endArray ();
201+ b .endArray ();
202+ });
203+
147204 // The first array element defines the schema.
148- TEST_ARRAY = variant (TEST_METADATA , b -> {
205+ OBJECT_IN_ARRAY = variant (TEST_METADATA , b -> {
206+ VariantArrayBuilder ab = b .startArray ();
207+ VariantObjectBuilder ob = ab .startObject ();
208+ ob .appendKey ("a" );
209+ ob .appendNull ();
210+ ob .appendKey ("d" );
211+ ob .appendString ("iceberg" );
212+ ab .endObject ();
213+ ab .appendInt (123 );
214+ VariantObjectBuilder ob2 = ab .startObject ();
215+ ob2 .appendKey ("c" );
216+ ob2 .appendString ("hello" );
217+ ob2 .appendKey ("d" );
218+ ob2 .appendDate (12345 );
219+ ab .endObject ();
220+ b .endArray ();
221+ });
222+
223+ MIXED_OBJECT_IN_ARRAY = variant (TEST_METADATA , b -> {
149224 VariantArrayBuilder ab = b .startArray ();
150225 VariantObjectBuilder ob = ab .startObject ();
151226 ob .appendKey ("a" );
@@ -160,11 +235,13 @@ public TestWriteVariant() throws Exception {
160235 ob2 .appendKey ("d" );
161236 ob2 .appendDate (12345 );
162237 ab .endObject ();
238+ ab .appendString ("parquet" );
239+ ab .appendInt (34 );
163240 b .endArray ();
164241 });
165242
166243 // Change one field name and one type in the first element to change the schema.
167- SIMILAR_ARRAY = variant (TEST_METADATA , b -> {
244+ SIMILAR_OBJECT_IN_ARRAY = variant (TEST_METADATA , b -> {
168245 VariantArrayBuilder ab = b .startArray ();
169246 VariantObjectBuilder ob = ab .startObject ();
170247 ob .appendKey ("c" );
@@ -206,8 +283,14 @@ public TestWriteVariant() throws Exception {
206283 new Variant (EMPTY_OBJECT , EMPTY_METADATA ),
207284 new Variant (TEST_OBJECT , TEST_METADATA ),
208285 new Variant (SIMILAR_OBJECT , TEST_METADATA ),
209- new Variant (TEST_ARRAY , TEST_METADATA ),
210- new Variant (SIMILAR_ARRAY , TEST_METADATA ),
286+ new Variant (EMPTY_ARRAY , EMPTY_METADATA ),
287+ new Variant (STRING_ARRAY , EMPTY_METADATA ),
288+ new Variant (MIXED_ARRAY , EMPTY_METADATA ),
289+ new Variant (NESTED_ARRAY , EMPTY_METADATA ),
290+ new Variant (MIXED_NESTED_ARRAY , EMPTY_METADATA ),
291+ new Variant (OBJECT_IN_ARRAY , TEST_METADATA ),
292+ new Variant (MIXED_OBJECT_IN_ARRAY , TEST_METADATA ),
293+ new Variant (SIMILAR_OBJECT_IN_ARRAY , TEST_METADATA ),
211294 fullVariant (b -> b .appendDate (12345 )),
212295 fullVariant (b -> b .appendDate (-12345 )),
213296 fullVariant (b -> b .appendTimestampTz (1234567890L )),
@@ -233,7 +316,6 @@ public TestWriteVariant() throws Exception {
233316
234317 /**
235318 * Create a record containing a Variant value using the standard schema.
236- * @return
237319 */
238320 GenericRecord createRecord (int i , Variant v ) {
239321 GenericRecord vRecord = new GenericData .Record (VARIANT_SCHEMA );
0 commit comments