Skip to content

Commit fcea662

Browse files
author
Praful Makani
authored
feat: add case insensitive for fields get by name (#775)
1 parent 58e2e4e commit fcea662

File tree

3 files changed

+64
-4
lines changed

3 files changed

+64
-4
lines changed

google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/FieldList.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919
import com.google.api.services.bigquery.model.TableFieldSchema;
2020
import com.google.common.collect.ImmutableList;
21-
import com.google.common.collect.ImmutableMap;
2221
import com.google.common.collect.Lists;
2322
import java.io.Serializable;
2423
import java.util.AbstractList;
24+
import java.util.HashMap;
2525
import java.util.List;
2626
import java.util.Map;
2727

@@ -36,16 +36,28 @@ public final class FieldList extends AbstractList<Field> implements Serializable
3636
private final List<Field> fields;
3737
private final Map<String, Integer> nameIndex;
3838

39+
private static class CaseInsensitiveMap extends HashMap<String, Integer> {
40+
@Override
41+
public Integer put(String key, Integer value) {
42+
return super.put(key.toLowerCase(), value);
43+
}
44+
45+
@Override
46+
public Integer get(Object key) {
47+
return super.get(key.toString().toLowerCase());
48+
}
49+
}
50+
3951
private FieldList(Iterable<Field> fields) {
4052
this.fields = ImmutableList.copyOf(fields);
41-
ImmutableMap.Builder<String, Integer> nameIndexBuilder = ImmutableMap.builder();
53+
Map<String, Integer> caseInsensitiveMap = new CaseInsensitiveMap();
4254
int index = 0;
4355
for (Field field : fields) {
44-
nameIndexBuilder.put(field.getName(), index);
56+
caseInsensitiveMap.put(field.getName(), index);
4557
index++;
4658
}
4759

48-
this.nameIndex = nameIndexBuilder.build();
60+
this.nameIndex = caseInsensitiveMap;
4961
}
5062

5163
/**

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/FieldListTest.java

+20
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ public class FieldListTest {
2626
private static final String FIELD_NAME1 = "StringField";
2727
private static final String FIELD_NAME2 = "IntegerField";
2828
private static final String FIELD_NAME3 = "RecordField";
29+
private static final String FIELD_NAME_CASE_INSENSITIVE1 = "stringfield";
30+
private static final String FIELD_NAME_CASE_INSENSITIVE2 = "integerfield";
31+
private static final String FIELD_NAME_CASE_INSENSITIVE3 = "recordfield";
32+
private static final String FIELD_NAME_CASE_INSENSITIVE4 = "stRingfiEld";
33+
private static final String FIELD_NAME_CASE_INSENSITIVE5 = "inTeGerField";
34+
private static final String FIELD_NAME_CASE_INSENSITIVE6 = "recOrdfieLd";
2935
private static final String FIELD_NAME4 = "NonExistentField";
3036
private static final LegacySQLTypeName FIELD_TYPE1 = LegacySQLTypeName.STRING;
3137
private static final LegacySQLTypeName FIELD_TYPE2 = LegacySQLTypeName.INTEGER;
@@ -61,6 +67,12 @@ public void testGetByName() {
6167
assertEquals(fieldSchema1, fieldsSchema.get(FIELD_NAME1));
6268
assertEquals(fieldSchema2, fieldsSchema.get(FIELD_NAME2));
6369
assertEquals(fieldSchema3, fieldsSchema.get(FIELD_NAME3));
70+
assertEquals(fieldSchema1, fieldsSchema.get(FIELD_NAME_CASE_INSENSITIVE1));
71+
assertEquals(fieldSchema2, fieldsSchema.get(FIELD_NAME_CASE_INSENSITIVE2));
72+
assertEquals(fieldSchema3, fieldsSchema.get(FIELD_NAME_CASE_INSENSITIVE3));
73+
assertEquals(fieldSchema1, fieldsSchema.get(FIELD_NAME_CASE_INSENSITIVE4));
74+
assertEquals(fieldSchema2, fieldsSchema.get(FIELD_NAME_CASE_INSENSITIVE5));
75+
assertEquals(fieldSchema3, fieldsSchema.get(FIELD_NAME_CASE_INSENSITIVE6));
6476

6577
assertEquals(3, fieldsSchema.size());
6678

@@ -95,8 +107,16 @@ public void testGetRecordSchema() {
95107
assertEquals(2, fieldSchema3.getSubFields().size());
96108
assertEquals(fieldSchema1, fieldSchema3.getSubFields().get(FIELD_NAME1));
97109
assertEquals(fieldSchema2, fieldSchema3.getSubFields().get(FIELD_NAME2));
110+
assertEquals(fieldSchema1, fieldSchema3.getSubFields().get(FIELD_NAME_CASE_INSENSITIVE1));
111+
assertEquals(fieldSchema2, fieldSchema3.getSubFields().get(FIELD_NAME_CASE_INSENSITIVE2));
112+
assertEquals(fieldSchema1, fieldSchema3.getSubFields().get(FIELD_NAME_CASE_INSENSITIVE4));
113+
assertEquals(fieldSchema2, fieldSchema3.getSubFields().get(FIELD_NAME_CASE_INSENSITIVE5));
98114
assertEquals(0, fieldSchema3.getSubFields().getIndex(FIELD_NAME1));
99115
assertEquals(1, fieldSchema3.getSubFields().getIndex(FIELD_NAME2));
116+
assertEquals(0, fieldSchema3.getSubFields().getIndex(FIELD_NAME_CASE_INSENSITIVE1));
117+
assertEquals(1, fieldSchema3.getSubFields().getIndex(FIELD_NAME_CASE_INSENSITIVE2));
118+
assertEquals(0, fieldSchema3.getSubFields().getIndex(FIELD_NAME_CASE_INSENSITIVE4));
119+
assertEquals(1, fieldSchema3.getSubFields().getIndex(FIELD_NAME_CASE_INSENSITIVE5));
100120
assertEquals(fieldSchema1, fieldSchema3.getSubFields().get(0));
101121
assertEquals(fieldSchema2, fieldSchema3.getSubFields().get(1));
102122
}

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java

+28
Original file line numberDiff line numberDiff line change
@@ -1532,6 +1532,34 @@ public void testQuery() throws InterruptedException {
15321532
assertNotNull(statistics.getQueryPlan());
15331533
}
15341534

1535+
@Test
1536+
public void testQueryCaseInsensitiveSchemaFieldByGetName() throws InterruptedException {
1537+
String query = "SELECT TimestampField, StringField, BooleanField FROM " + TABLE_ID.getTable();
1538+
QueryJobConfiguration config =
1539+
QueryJobConfiguration.newBuilder(query).setDefaultDataset(DatasetId.of(DATASET)).build();
1540+
Job job = bigquery.create(JobInfo.of(JobId.of(), config));
1541+
1542+
TableResult result = job.getQueryResults();
1543+
assertEquals(QUERY_RESULT_SCHEMA, result.getSchema());
1544+
int rowCount = 0;
1545+
for (FieldValueList row : result.getValues()) {
1546+
FieldValue timestampCell = row.get(0);
1547+
assertEquals(timestampCell, row.get("TimestampField"));
1548+
assertEquals(timestampCell, row.get("timestampfield"));
1549+
assertEquals(timestampCell, row.get("timeStampfIeld"));
1550+
FieldValue stringCell = row.get(1);
1551+
assertEquals(stringCell, row.get("StringField"));
1552+
assertEquals(stringCell, row.get("stringfield"));
1553+
assertEquals(stringCell, row.get("sTrinGfield"));
1554+
FieldValue booleanCell = row.get(2);
1555+
assertEquals(booleanCell, row.get("BooleanField"));
1556+
assertEquals(booleanCell, row.get("booleanfield"));
1557+
assertEquals(booleanCell, row.get("booLeanfielD"));
1558+
rowCount++;
1559+
}
1560+
assertEquals(2, rowCount);
1561+
}
1562+
15351563
@Test
15361564
public void testFastSQLQuery() throws InterruptedException {
15371565
String query =

0 commit comments

Comments
 (0)