@Test public void bindEmptyArrayOfStruct() { Type elementType = Type.struct(asList(Type.StructField.of("f1", Type.date()))); List<Struct> p = asList(); assertThat(p).isEmpty(); List<Struct> rows = resultRows( Statement.newBuilder("SELECT * FROM UNNEST(@p)") .bind("p") .toStructArray(elementType, p) .build(), elementType); assertThat(rows).isEmpty(); }
@Test public void bindArrayOfStruct() { Struct arrayElement = structValue(); List<Struct> p = asList(arrayElement, null); List<Struct> rows = resultRows( Statement.newBuilder("SELECT * FROM UNNEST(@p)") .bind("p") .toStructArray(arrayElement.getType(), p) .build(), arrayElement.getType()); assertThat(rows).hasSize(p.size()); assertThat(rows.get(0)).isEqualTo(p.get(0)); // Field accesses on a null struct element (because of SELECT *) return null values. Struct structElementFromNull = rows.get(1); // assertThat(structElementFromNull.isNull()).isFalse(); for (int i = 0; i < arrayElement.getType().getStructFields().size(); ++i) { assertThat(structElementFromNull.isNull(i)).isTrue(); } }
@Test public void bindStructWithArrayOfStructField() { Struct arrayElement1 = Struct.newBuilder().set("ff1").to("abc").build(); Struct arrayElement2 = Struct.newBuilder().set("ff1").to("def").build(); Struct p = Struct.newBuilder() .set("f1") .toStructArray(arrayElement1.getType(), asList(arrayElement1, arrayElement2)) .build(); List<Struct> rows = resultRows( Statement.newBuilder("SELECT * FROM UNNEST(@p.f1)").bind("p").to(p).build(), arrayElement1.getType()); assertThat(rows.get(0).getString(0)).isEqualTo("abc"); assertThat(rows.get(1).getString(0)).isEqualTo("def"); }