Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,24 @@ public Builder setType(LegacySQLTypeName type, Field... subFields) {
return setType(type, subFields.length > 0 ? FieldList.of(subFields) : null);
}

/**
* Sets the type of the field.
*
* @param type BigQuery data type
* @param subFields nested schema fields in case if {@code type} is {@link
* StandardSQLTypeName#STRUCT}, empty otherwise
* @throws IllegalArgumentException if {@code type == StandardSQLTypeName.STRUCT &&
* subFields.length == 0} or if {@code type != StandardSQLTypeName.STRUCT &&
* subFields.length != 0}
* @see <a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types">Data
* Types</a>
*/
public Builder setType(StandardSQLTypeName type, Field... subFields) {
return setType(
LegacySQLTypeName.legacySQLTypeName(type),
subFields.length > 0 ? FieldList.of(subFields) : null);
}

/**
* Sets the type of the field.
*
Expand Down Expand Up @@ -142,6 +160,22 @@ public Builder setType(LegacySQLTypeName type, FieldList subFields) {
return this;
}

/**
* Sets the type of the field.
*
* @param type BigQuery data type
* @param subFields nested schema fields in case if {@code type} is {@link
* StandardSQLTypeName#STRUCT}, empty otherwise
* @throws IllegalArgumentException if {@code type == StandardSQLTypeName.STRUCT &&
* subFields.length == 0} or if {@code type != StandardSQLTypeName.STRUCT &&
* subFields.length != 0}
* @see <a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types">Data
* Types</a>
*/
public Builder setType(StandardSQLTypeName type, FieldList subFields) {
return setType(LegacySQLTypeName.legacySQLTypeName(type), subFields);
}

/** Sets the mode of the field. When not specified {@link Mode#NULLABLE} is used. */
public Builder setMode(Mode mode) {
this.mode = mode != null ? mode.name() : Data.<String>nullOf(String.class);
Expand Down Expand Up @@ -241,11 +275,21 @@ public static Builder newBuilder(String name, LegacySQLTypeName type, Field... s
return new Builder().setName(name).setType(type, subFields);
}

/** Returns a builder for a Field object with given name and type. */
public static Builder newBuilder(String name, StandardSQLTypeName type, Field... subFields) {
return new Builder().setName(name).setType(type, subFields);
}

/** Returns a builder for a Field object with given name and type. */
public static Builder newBuilder(String name, LegacySQLTypeName type, FieldList subFields) {
return new Builder().setName(name).setType(type, subFields);
}

/** Returns a builder for a Field object with given name and type. */
public static Builder newBuilder(String name, StandardSQLTypeName type, FieldList subFields) {
return new Builder().setName(name).setType(type, subFields);
}

TableFieldSchema toPb() {
TableFieldSchema fieldSchemaPb = new TableFieldSchema();
fieldSchemaPb.setName(name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import com.google.api.core.ApiFunction;
import com.google.cloud.StringEnumType;
import com.google.cloud.StringEnumValue;
import java.util.HashMap;
import java.util.Map;

/**
* A type used in legacy SQL contexts. NOTE: some contexts use a mix of types; for example, for
Expand Down Expand Up @@ -84,6 +86,14 @@ public LegacySQLTypeName apply(String constant) {
public static final LegacySQLTypeName RECORD =
type.createAndRegister("RECORD").setStandardType(StandardSQLTypeName.STRUCT);

private static Map<StandardSQLTypeName, LegacySQLTypeName> standardToLegacyMap = new HashMap<>();

static {
for (LegacySQLTypeName legacySqlTypeName : LegacySQLTypeName.values()) {
standardToLegacyMap.put(legacySqlTypeName.equivalent, legacySqlTypeName);
}
}

private StandardSQLTypeName equivalent;

private LegacySQLTypeName setStandardType(StandardSQLTypeName equivalent) {
Expand All @@ -96,6 +106,11 @@ public StandardSQLTypeName getStandardType() {
return equivalent;
}

/** Converts StandardSQLTypeName to LegacySQLTypeName */
public static LegacySQLTypeName legacySQLTypeName(StandardSQLTypeName type) {
return standardToLegacyMap.get(type);
}

private LegacySQLTypeName(String constant) {
super(constant);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,25 @@ public class FieldTest {
.setMode(FIELD_MODE3)
.setDescription(FIELD_DESCRIPTION3)
.build();
private static final Field STANDARD_FIELD_SCHEMA1 =
Field.newBuilder(FIELD_NAME1, StandardSQLTypeName.STRING)
.setMode(FIELD_MODE1)
.setDescription(FIELD_DESCRIPTION1)
.build();
private static final Field STANDARD_FIELD_SCHEMA2 =
Field.newBuilder(FIELD_NAME2, StandardSQLTypeName.INT64)
.setMode(FIELD_MODE2)
.setDescription(FIELD_DESCRIPTION2)
.build();
private static final Field STANDARD_FIELD_SCHEMA3 =
Field.newBuilder(
FIELD_NAME3,
StandardSQLTypeName.STRUCT,
STANDARD_FIELD_SCHEMA1,
STANDARD_FIELD_SCHEMA2)
.setMode(FIELD_MODE3)
.setDescription(FIELD_DESCRIPTION3)
.build();

@Test
public void testToBuilder() {
Expand All @@ -66,6 +85,17 @@ public void testToBuilder() {
compareFieldSchemas(FIELD_SCHEMA1, field);
}

@Test
public void testToBuilderWithStandardSQLTypeName() {
compareFieldSchemas(STANDARD_FIELD_SCHEMA1, STANDARD_FIELD_SCHEMA1.toBuilder().build());
compareFieldSchemas(STANDARD_FIELD_SCHEMA2, STANDARD_FIELD_SCHEMA2.toBuilder().build());
compareFieldSchemas(STANDARD_FIELD_SCHEMA3, STANDARD_FIELD_SCHEMA3.toBuilder().build());
Field field = STANDARD_FIELD_SCHEMA1.toBuilder().setDescription("New Description").build();
assertEquals("New Description", field.getDescription());
field = field.toBuilder().setDescription(FIELD_DESCRIPTION1).build();
compareFieldSchemas(STANDARD_FIELD_SCHEMA1, field);
}

@Test
public void testToBuilderIncomplete() {
Field field = Field.of(FIELD_NAME1, FIELD_TYPE1);
Expand All @@ -74,6 +104,14 @@ public void testToBuilderIncomplete() {
compareFieldSchemas(field, field.toBuilder().build());
}

@Test
public void testToBuilderIncompleteWithStandardSQLTypeName() {
Field field = Field.of(FIELD_NAME1, FIELD_TYPE1);
compareFieldSchemas(field, field.toBuilder().build());
field = Field.of(FIELD_NAME2, FIELD_TYPE3, STANDARD_FIELD_SCHEMA1, STANDARD_FIELD_SCHEMA2);
compareFieldSchemas(field, field.toBuilder().build());
}

@Test
public void testBuilder() {
assertEquals(FIELD_NAME1, FIELD_SCHEMA1.getName());
Expand All @@ -88,6 +126,22 @@ public void testBuilder() {
assertEquals(FieldList.of(FIELD_SCHEMA1, FIELD_SCHEMA2), FIELD_SCHEMA3.getSubFields());
}

@Test
public void testBuilderWithStandardSQLTypeName() {
assertEquals(FIELD_NAME1, STANDARD_FIELD_SCHEMA1.getName());
assertEquals(FIELD_TYPE1, STANDARD_FIELD_SCHEMA1.getType());
assertEquals(FIELD_MODE1, STANDARD_FIELD_SCHEMA1.getMode());
assertEquals(FIELD_DESCRIPTION1, STANDARD_FIELD_SCHEMA1.getDescription());
assertEquals(null, STANDARD_FIELD_SCHEMA1.getSubFields());
assertEquals(FIELD_NAME3, STANDARD_FIELD_SCHEMA3.getName());
assertEquals(FIELD_TYPE3, STANDARD_FIELD_SCHEMA3.getType());
assertEquals(FIELD_MODE3, STANDARD_FIELD_SCHEMA3.getMode());
assertEquals(FIELD_DESCRIPTION3, STANDARD_FIELD_SCHEMA3.getDescription());
assertEquals(
FieldList.of(STANDARD_FIELD_SCHEMA1, STANDARD_FIELD_SCHEMA2),
STANDARD_FIELD_SCHEMA3.getSubFields());
}

@Test
public void testToAndFromPb() {
compareFieldSchemas(FIELD_SCHEMA1, Field.fromPb(FIELD_SCHEMA1.toPb()));
Expand All @@ -97,6 +151,15 @@ public void testToAndFromPb() {
compareFieldSchemas(field, Field.fromPb(field.toPb()));
}

@Test
public void testToAndFromPbWithStandardSQLTypeName() {
compareFieldSchemas(STANDARD_FIELD_SCHEMA1, Field.fromPb(STANDARD_FIELD_SCHEMA1.toPb()));
compareFieldSchemas(STANDARD_FIELD_SCHEMA2, Field.fromPb(STANDARD_FIELD_SCHEMA2.toPb()));
compareFieldSchemas(STANDARD_FIELD_SCHEMA3, Field.fromPb(STANDARD_FIELD_SCHEMA3.toPb()));
Field field = Field.newBuilder(FIELD_NAME1, FIELD_TYPE1).build();
compareFieldSchemas(field, Field.fromPb(field.toPb()));
}

@Test
public void testSubFieldWithClonedType() throws Exception {
LegacySQLTypeName record = LegacySQLTypeName.RECORD;
Expand Down