@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 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 unsupportedSelectArrayStructValue() { Struct p = structValue(); expectedException.expect(isSpannerException(ErrorCode.UNIMPLEMENTED)); expectedException.expectMessage( "Unsupported query shape: " + "This query can return a null-valued array of struct, " + "which is not supported by Spanner."); execute( Statement.newBuilder("SELECT @p").bind("p").toStructArray(p.getType(), asList(p)).build(), p.getType()); }
@Test public void bindArrayOfStructNull() { Type elementType = Type.struct( asList( Type.StructField.of("f1", Type.string()), Type.StructField.of("f2", Type.float64()))); Struct row = execute( Statement.newBuilder("SELECT @p IS NULL") .bind("p") .toStructArray(elementType, null) .build(), Type.bool()); assertThat(row.getBoolean(0)).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"); }
Struct.newBuilder() .set("") .toStructArray( Type.struct( asList(
@Test public void structArrayFieldNull() { Type elementType = Type.struct( Arrays.asList( Type.StructField.of("ff1", Type.string()), Type.StructField.of("ff2", Type.int64()))); Struct struct = Struct.newBuilder().set("f1").to("x").set("f2").toStructArray(elementType, null).build(); assertThat(struct.getType()) .isEqualTo( Type.struct( Type.StructField.of("f1", Type.string()), Type.StructField.of("f2", Type.array(elementType)))); assertThat(struct.isNull(0)).isFalse(); assertThat(struct.isNull(1)).isTrue(); }
Struct.newBuilder() .set("f1") .toStructArray(nestedStructType, arrayValue) .set("f2") .to((Long) null) Struct.newBuilder() .set("f1") .toStructArray(nestedStructType, null) .set("f2") .to(20)
builder .set(fieldName) .toStructArray(fieldType.getArrayElementType(), (Iterable<Struct>) value); break; default:
@Test public void structWithArrayOfStructField() { Type elementType = Type.struct( Arrays.asList( Type.StructField.of("ff1", Type.string()), Type.StructField.of("ff2", Type.int64()))); List<Struct> arrayElements = Arrays.asList( Struct.newBuilder().set("ff1").to("v1").set("ff2").to(1).build(), Struct.newBuilder().set("ff1").to("v1").set("ff2").to(1).build()); Struct struct = Struct.newBuilder() .set("f1") .to("x") .set("f2") .toStructArray(elementType, arrayElements) .build(); assertThat(struct.getType()) .isEqualTo( Type.struct( Type.StructField.of("f1", Type.string()), Type.StructField.of("f2", Type.array(elementType)))); assertThat(struct.isNull(0)).isFalse(); assertThat(struct.isNull(1)).isFalse(); assertThat(struct.getString(0)).isEqualTo("x"); assertThat(struct.getStructList(1)).isEqualTo(arrayElements); }
@Test public void structArrayField() { Type elementType = Type.struct( Arrays.asList( Type.StructField.of("ff1", Type.string()), Type.StructField.of("ff2", Type.int64()))); List<Struct> arrayElements = Arrays.asList( Struct.newBuilder().set("ff1").to("v1").set("ff2").to(1).build(), null, Struct.newBuilder().set("ff1").to("v3").set("ff2").to(3).build()); Struct struct = Struct.newBuilder() .set("f1") .to("x") .set("f2") .toStructArray(elementType, arrayElements) .build(); assertThat(struct.getType()) .isEqualTo( Type.struct( Type.StructField.of("f1", Type.string()), Type.StructField.of("f2", Type.array(elementType)))); assertThat(struct.isNull(0)).isFalse(); assertThat(struct.isNull(1)).isFalse(); assertThat(struct.getString(0)).isEqualTo("x"); assertThat(struct.getStructList(1)).isEqualTo(arrayElements); }
Struct.newBuilder() .set("f1") .toStructArray(simpleStruct.getType(), new ArrayList<Struct>()) .build(); reserializeAndAssert(arrayStructFieldStruct); arrayStructFieldStruct = Struct.newBuilder().set("f1").toStructArray(simpleStruct.getType(), null).build(); reserializeAndAssert(arrayStructFieldStruct);
+ "IN UNNEST(@names)") .bind("names") .toStructArray(nameType, bandMembers) .build();
Struct.newBuilder() .set("arraysf") .toStructArray(nestedStruct.getType(), Arrays.asList(null, nestedStruct)) .set("nullarraysf") .toStructArray(nestedStruct.getType(), null) .build(); Struct arrayStructFieldStruct2 =
.to("Imagination") .set("artistNames") .toStructArray( nameType, Arrays.asList(
builder .set(fieldName) .toStructArray(fieldType.getArrayElementType(), (Iterable<Struct>) value); break; default: