Skip to content

Commit b19ad76

Browse files
authored
feat(bigquery): enable use of GEOGRAPHY query params (#2158)
* feat(bigquery): enable use of GEOGRAPHY query params
1 parent 970135b commit b19ad76

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,11 @@ public static QueryParameterValue string(String value) {
258258
return of(value, StandardSQLTypeName.STRING);
259259
}
260260

261+
/** Creates a {@code QueryParameterValue} object with a type of GEOGRAPHY. */
262+
public static QueryParameterValue geography(String value) {
263+
return of(value, StandardSQLTypeName.GEOGRAPHY);
264+
}
265+
261266
/**
262267
* Creates a {@code QueryParameterValue} object with a type of JSON. Currently, this is only
263268
* supported in INSERT, not in query as a filter
@@ -369,6 +374,8 @@ private static <T> StandardSQLTypeName classToType(Class<T> type) {
369374
return StandardSQLTypeName.BOOL;
370375
} else if (String.class.isAssignableFrom(type)) {
371376
return StandardSQLTypeName.STRING;
377+
} else if (String.class.isAssignableFrom(type)) {
378+
return StandardSQLTypeName.GEOGRAPHY;
372379
} else if (Integer.class.isAssignableFrom(type)) {
373380
return StandardSQLTypeName.INT64;
374381
} else if (Long.class.isAssignableFrom(type)) {
@@ -422,6 +429,8 @@ private static <T> String valueToStringOrNull(T value, StandardSQLTypeName type)
422429
break;
423430
case STRING:
424431
return value.toString();
432+
case GEOGRAPHY:
433+
return value.toString();
425434
case JSON:
426435
if (value instanceof String || value instanceof JsonObject) return value.toString();
427436
case INTERVAL:

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,15 @@ public void testString() {
196196
assertThat(value.getArrayValues()).isNull();
197197
}
198198

199+
@Test
200+
public void testGeography() {
201+
QueryParameterValue value = QueryParameterValue.geography("POINT(-122.350220 47.649154)");
202+
assertThat(value.getValue()).isEqualTo("POINT(-122.350220 47.649154)");
203+
assertThat(value.getType()).isEqualTo(StandardSQLTypeName.GEOGRAPHY);
204+
assertThat(value.getArrayType()).isNull();
205+
assertThat(value.getArrayValues()).isNull();
206+
}
207+
199208
@Test
200209
public void testJson() {
201210
QueryParameterValue value =

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3655,6 +3655,28 @@ public void testBytesParameter() throws Exception {
36553655
assertEquals(1, rowCount);
36563656
}
36573657

3658+
@Test
3659+
public void testGeographyParameter() throws Exception {
3660+
// Issues a simple ST_DISTANCE using two geopoints, one being a named geography parameter.
3661+
String query =
3662+
"SELECT ST_DISTANCE(ST_GEOGFROMTEXT(\"POINT(-122.335503 47.625536)\"), @geo) < 3000 as within3k";
3663+
QueryParameterValue geoParameterValue =
3664+
QueryParameterValue.geography("POINT(-122.3509153 47.6495389)");
3665+
QueryJobConfiguration config =
3666+
QueryJobConfiguration.newBuilder(query)
3667+
.setDefaultDataset(DatasetId.of(DATASET))
3668+
.setUseLegacySql(false)
3669+
.addNamedParameter("geo", geoParameterValue)
3670+
.build();
3671+
TableResult result = bigquery.query(config);
3672+
int rowCount = 0;
3673+
for (FieldValueList row : result.getValues()) {
3674+
rowCount++;
3675+
assertEquals(true, row.get(0).getBooleanValue());
3676+
}
3677+
assertEquals(1, rowCount);
3678+
}
3679+
36583680
@Test
36593681
public void testListJobs() {
36603682
Page<Job> jobs = bigquery.listJobs();

0 commit comments

Comments
 (0)