Skip to content

Commit 4672939

Browse files
authored
fix: BQTableSchemaToProtobufDescriptor will now only generate lower-cased fieldnames in the protobuf descriptor (#415)
* fix: all protofields in the generated descriptor will be lowercased * Remove debug output * Test commits * Reverted test commit * No-op
1 parent 1584bdb commit 4672939

File tree

3 files changed

+99
-8
lines changed

3 files changed

+99
-8
lines changed

google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1alpha2/BQTableSchemaToProtoDescriptor.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@
2828
import java.util.List;
2929

3030
/**
31-
* Converts a BQ table schema to protobuf descriptor. The mapping between field types and field
32-
* modes are shown in the ImmutableMaps below.
31+
* Converts a BQ table schema to protobuf descriptor. All field names will be converted to lowercase
32+
* when constructing the protobuf descriptor. The mapping between field types and field modes are
33+
* shown in the ImmutableMaps below.
3334
*/
3435
public class BQTableSchemaToProtoDescriptor {
3536
private static ImmutableMap<Table.TableFieldSchema.Mode, FieldDescriptorProto.Label>
@@ -130,7 +131,7 @@ private static Descriptor convertBQTableSchemaToProtoDescriptorImpl(
130131
private static FieldDescriptorProto convertBQTableFieldToProtoField(
131132
Table.TableFieldSchema BQTableField, int index, String scope) {
132133
Table.TableFieldSchema.Mode mode = BQTableField.getMode();
133-
String fieldName = BQTableField.getName();
134+
String fieldName = BQTableField.getName().toLowerCase();
134135
if (BQTableField.getType() == Table.TableFieldSchema.Type.STRUCT) {
135136
return FieldDescriptorProto.newBuilder()
136137
.setName(fieldName)

google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1alpha2/BQTableSchemaToProtoDescriptorTest.java

+82-2
Original file line numberDiff line numberDiff line change
@@ -171,15 +171,15 @@ public void testStructComplex() throws Exception {
171171
.setType(Table.TableFieldSchema.Type.STRUCT)
172172
.setMode(Table.TableFieldSchema.Mode.REQUIRED)
173173
.addFields(0, test_int)
174-
.setName("complexLvl2")
174+
.setName("complex_lvl2")
175175
.build();
176176
final Table.TableFieldSchema ComplexLvl1 =
177177
Table.TableFieldSchema.newBuilder()
178178
.setType(Table.TableFieldSchema.Type.STRUCT)
179179
.setMode(Table.TableFieldSchema.Mode.REQUIRED)
180180
.addFields(0, test_int)
181181
.addFields(1, ComplexLvl2)
182-
.setName("complexLvl1")
182+
.setName("complex_lvl1")
183183
.build();
184184
final Table.TableSchema tableSchema =
185185
Table.TableSchema.newBuilder()
@@ -197,6 +197,86 @@ public void testStructComplex() throws Exception {
197197
isDescriptorEqual(descriptor, ComplexRoot.getDescriptor());
198198
}
199199

200+
@Test
201+
public void testCasingComplexStruct() throws Exception {
202+
final Table.TableFieldSchema required =
203+
Table.TableFieldSchema.newBuilder()
204+
.setType(Table.TableFieldSchema.Type.INT64)
205+
.setMode(Table.TableFieldSchema.Mode.REQUIRED)
206+
.setName("tEsT_ReQuIrEd")
207+
.build();
208+
final Table.TableFieldSchema repeated =
209+
Table.TableFieldSchema.newBuilder()
210+
.setType(Table.TableFieldSchema.Type.INT64)
211+
.setMode(Table.TableFieldSchema.Mode.REPEATED)
212+
.setName("tESt_repEATed")
213+
.build();
214+
final Table.TableFieldSchema optional =
215+
Table.TableFieldSchema.newBuilder()
216+
.setType(Table.TableFieldSchema.Type.INT64)
217+
.setMode(Table.TableFieldSchema.Mode.NULLABLE)
218+
.setName("test_opTIONal")
219+
.build();
220+
final Table.TableFieldSchema test_int =
221+
Table.TableFieldSchema.newBuilder()
222+
.setType(Table.TableFieldSchema.Type.INT64)
223+
.setMode(Table.TableFieldSchema.Mode.NULLABLE)
224+
.setName("TEST_INT")
225+
.build();
226+
final Table.TableFieldSchema test_string =
227+
Table.TableFieldSchema.newBuilder()
228+
.setType(Table.TableFieldSchema.Type.STRING)
229+
.setMode(Table.TableFieldSchema.Mode.REPEATED)
230+
.setName("TEST_STRING")
231+
.build();
232+
final Table.TableFieldSchema test_bytes =
233+
Table.TableFieldSchema.newBuilder()
234+
.setType(Table.TableFieldSchema.Type.BYTES)
235+
.setMode(Table.TableFieldSchema.Mode.REQUIRED)
236+
.setName("TEST_BYTES")
237+
.build();
238+
final Table.TableFieldSchema test_bool =
239+
Table.TableFieldSchema.newBuilder()
240+
.setType(Table.TableFieldSchema.Type.BOOL)
241+
.setMode(Table.TableFieldSchema.Mode.NULLABLE)
242+
.setName("TEST_BOOL")
243+
.build();
244+
final Table.TableFieldSchema test_double =
245+
Table.TableFieldSchema.newBuilder()
246+
.setType(Table.TableFieldSchema.Type.DOUBLE)
247+
.setMode(Table.TableFieldSchema.Mode.REPEATED)
248+
.setName("TEST_DOUBLE")
249+
.build();
250+
final Table.TableFieldSchema test_date =
251+
Table.TableFieldSchema.newBuilder()
252+
.setType(Table.TableFieldSchema.Type.DATE)
253+
.setMode(Table.TableFieldSchema.Mode.REQUIRED)
254+
.setName("TEST_DATE")
255+
.build();
256+
final Table.TableFieldSchema option_test =
257+
Table.TableFieldSchema.newBuilder()
258+
.setType(Table.TableFieldSchema.Type.STRUCT)
259+
.setMode(Table.TableFieldSchema.Mode.REQUIRED)
260+
.addFields(0, required)
261+
.addFields(1, repeated)
262+
.addFields(2, optional)
263+
.setName("option_test")
264+
.build();
265+
final Table.TableSchema tableSchema =
266+
Table.TableSchema.newBuilder()
267+
.addFields(0, test_int)
268+
.addFields(1, test_string)
269+
.addFields(2, test_bytes)
270+
.addFields(3, test_bool)
271+
.addFields(4, test_double)
272+
.addFields(5, test_date)
273+
.addFields(6, option_test)
274+
.build();
275+
final Descriptor descriptor =
276+
BQTableSchemaToProtoDescriptor.convertBQTableSchemaToProtoDescriptor(tableSchema);
277+
isDescriptorEqual(descriptor, CasingComplex.getDescriptor());
278+
}
279+
200280
@Test
201281
public void testOptions() throws Exception {
202282
final Table.TableFieldSchema required =

google-cloud-bigquerystorage/src/test/proto/jsonTest.proto

+13-3
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,23 @@ message ComplexRoot {
99
optional bool test_bool = 4;
1010
repeated double test_double = 5;
1111
required int32 test_date = 6;
12-
required ComplexLvl1 complexLvl1 = 7;
13-
required ComplexLvl2 complexLvl2 = 8;
12+
required ComplexLvl1 complex_lvl1 = 7;
13+
required ComplexLvl2 complex_lvl2 = 8;
14+
}
15+
16+
message CasingComplex {
17+
optional int64 test_int = 1;
18+
repeated string test_string = 2;
19+
required bytes test_bytes = 3;
20+
optional bool test_bool = 4;
21+
repeated double test_double = 5;
22+
required int32 test_date = 6;
23+
required OptionTest option_test = 7;
1424
}
1525

1626
message ComplexLvl1 {
1727
optional int64 test_int = 1;
18-
required ComplexLvl2 complexLvl2 = 2;
28+
required ComplexLvl2 complex_lvl2 = 2;
1929
}
2030

2131
message ComplexLvl2 {

0 commit comments

Comments
 (0)