@Override public int getColumnCount() { return getType().getStructFields().size(); }
@Override public int getColumnCount() { return getType().getStructFields().size(); }
@Override public Type getColumnType(int columnIndex) { return getType().getStructFields().get(columnIndex).getType(); }
@Override public Type getColumnType(int columnIndex) { return getType().getStructFields().get(columnIndex).getType(); }
private static Struct decodeStructValue(Type structType, ListValue structValue) { List<Type.StructField> fieldTypes = structType.getStructFields(); checkArgument( structValue.getValuesCount() == fieldTypes.size(), "Size mismatch between type descriptor and actual values."); List<Object> fields = new ArrayList<>(fieldTypes.size()); List<com.google.protobuf.Value> fieldValues = structValue.getValuesList(); for (int i = 0; i < fieldTypes.size(); ++i) { fields.add(decodeValue(fieldTypes.get(i).getType(), fieldValues.get(i))); } return new GrpcStruct(structType, fields); }
for (int i = 0; i < getStructFields().size(); ++i) { Type.StructField field = getStructFields().get(i); if (tmp.put(field.getName(), i) != null) {
boolean consumeRow(Iterator<com.google.protobuf.Value> iterator) { rowData.clear(); if (!iterator.hasNext()) { return false; } for (Type.StructField fieldType : getType().getStructFields()) { if (!iterator.hasNext()) { throw newSpannerException( ErrorCode.INTERNAL, "Invalid value stream: end of stream reached before row is complete"); } com.google.protobuf.Value value = iterator.next(); rowData.add(decodeValue(fieldType.getType(), value)); } return true; }
@Override public Type getColumnType(String columnName) { for (Type.StructField field : getType().getStructFields()) { if (field.getName().equals(columnName)) { return field.getType(); } } return null; }
PrePopulatedResultSet(Type type, Iterable<Struct> rows) { Preconditions.checkNotNull(rows); Preconditions.checkNotNull(type); Preconditions.checkArgument(type.getCode() == Type.Code.STRUCT); for (StructField field : type.getStructFields()) { if (field.getType().getCode() == Code.STRUCT) { throw new UnsupportedOperationException( "STRUCT-typed columns are not supported inside ResultSets."); } } this.type = type; this.rows = rows instanceof List<?> ? (List<Struct>) rows : Lists.newArrayList(rows); for (Struct row : rows) { Preconditions.checkArgument(row.getType().equals(type)); } }
@Override public Type getColumnType(String columnName) { return getType().getStructFields().get(getColumnIndex(columnName)).getType(); }
@Test public void emptyStruct() { Type t = Type.struct(); assertThat(t.getCode()).isEqualTo(Type.Code.STRUCT); assertThat(t.getStructFields()).isEmpty(); assertThat(t.toString()).isEqualTo("STRUCT<>"); assertProtoEquals(t.toProto(), "code: STRUCT struct_type {}"); }
@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 struct() { Type t = Type.struct(StructField.of("f1", Type.int64()), StructField.of("f2", Type.string())); assertThat(t.getCode()).isEqualTo(Type.Code.STRUCT); // Exercise StructField equality. assertThat(t.getStructFields()) .containsExactly(StructField.of("f1", Type.int64()), StructField.of("f2", Type.string())) .inOrder(); // Exercise StructField getters. assertThat(t.getStructFields().get(0).getName()).isEqualTo("f1"); assertThat(t.getStructFields().get(0).getType()).isEqualTo(Type.int64()); assertThat(t.getStructFields().get(1).getName()).isEqualTo("f2"); assertThat(t.getStructFields().get(1).getType()).isEqualTo(Type.string()); assertThat(t.toString()).isEqualTo("STRUCT<f1 INT64, f2 STRING>"); assertThat(t.getFieldIndex("f1")).isEqualTo(0); assertThat(t.getFieldIndex("f2")).isEqualTo(1); assertProtoEquals( t.toProto(), "code: STRUCT struct_type { fields { name: 'f1' type { code: INT64 } }" + " fields { name: 'f2' type { code: STRING } } }"); }
@Test public void nullStruct() { List<Type.StructField> fieldTypes = Arrays.asList( Type.StructField.of("f1", Type.string()), Type.StructField.of("f2", Type.int64())); Value v = Value.struct(Type.struct(fieldTypes), null); assertThat(v.getType().getStructFields()).isEqualTo(fieldTypes); assertThat(v.isNull()).isTrue(); assertThat(v.toString()).isEqualTo(NULL_STRING); expectedException.expect(NullPointerException.class); expectedException.expectMessage("Illegal call to create a NULL struct value."); Value.struct(null); }
List<Type.StructField> structFields = getType().getStructFields(); for (int i = 0; i < structFields.size(); i++) { Type.StructField field = structFields.get(i);
assertThat(rs.getColumnCount()).isEqualTo(type.getStructFields().size()); assertThat(rs.getColumnIndex("f1")).isEqualTo(0); assertThat(rs.getColumnType("nonexistent")).isNull();
private Set<String> indexColumnNames() { Set<String> cols = new HashSet<>(); for (Type.StructField f : this.struct.getType().getStructFields()) { cols.add(f.getName()); } return cols; }
private Set<String> indexColumnNames() { Set<String> cols = new HashSet<>(); for (Type.StructField f : this.struct.getType().getStructFields()) { cols.add(f.getName()); } return cols; }
@Override public Type getColumnType(String columnName) { return getType().getStructFields().get(getColumnIndex(columnName)).getType(); }
@Override public Type getColumnType(String columnName) { for (Type.StructField field : getType().getStructFields()) { if (field.getName().equals(columnName)) { return field.getType(); } } return null; }