From b19ad767a53a9bd5d14b4cb36716cbb1c7b44ed6 Mon Sep 17 00:00:00 2001 From: shollyman Date: Fri, 15 Jul 2022 11:00:55 -0500 Subject: [PATCH] feat(bigquery): enable use of GEOGRAPHY query params (#2158) * feat(bigquery): enable use of GEOGRAPHY query params --- .../cloud/bigquery/QueryParameterValue.java | 9 ++++++++ .../bigquery/QueryParameterValueTest.java | 9 ++++++++ .../cloud/bigquery/it/ITBigQueryTest.java | 22 +++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java index 227597bb1..b92cb734c 100644 --- a/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java +++ b/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java @@ -258,6 +258,11 @@ public static QueryParameterValue string(String value) { return of(value, StandardSQLTypeName.STRING); } + /** Creates a {@code QueryParameterValue} object with a type of GEOGRAPHY. */ + public static QueryParameterValue geography(String value) { + return of(value, StandardSQLTypeName.GEOGRAPHY); + } + /** * Creates a {@code QueryParameterValue} object with a type of JSON. Currently, this is only * supported in INSERT, not in query as a filter @@ -369,6 +374,8 @@ private static StandardSQLTypeName classToType(Class type) { return StandardSQLTypeName.BOOL; } else if (String.class.isAssignableFrom(type)) { return StandardSQLTypeName.STRING; + } else if (String.class.isAssignableFrom(type)) { + return StandardSQLTypeName.GEOGRAPHY; } else if (Integer.class.isAssignableFrom(type)) { return StandardSQLTypeName.INT64; } else if (Long.class.isAssignableFrom(type)) { @@ -422,6 +429,8 @@ private static String valueToStringOrNull(T value, StandardSQLTypeName type) break; case STRING: return value.toString(); + case GEOGRAPHY: + return value.toString(); case JSON: if (value instanceof String || value instanceof JsonObject) return value.toString(); case INTERVAL: diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java index 6b5368003..05920df23 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java @@ -196,6 +196,15 @@ public void testString() { assertThat(value.getArrayValues()).isNull(); } + @Test + public void testGeography() { + QueryParameterValue value = QueryParameterValue.geography("POINT(-122.350220 47.649154)"); + assertThat(value.getValue()).isEqualTo("POINT(-122.350220 47.649154)"); + assertThat(value.getType()).isEqualTo(StandardSQLTypeName.GEOGRAPHY); + assertThat(value.getArrayType()).isNull(); + assertThat(value.getArrayValues()).isNull(); + } + @Test public void testJson() { QueryParameterValue value = diff --git a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java index 891beed92..b733026a4 100644 --- a/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java +++ b/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITBigQueryTest.java @@ -3655,6 +3655,28 @@ public void testBytesParameter() throws Exception { assertEquals(1, rowCount); } + @Test + public void testGeographyParameter() throws Exception { + // Issues a simple ST_DISTANCE using two geopoints, one being a named geography parameter. + String query = + "SELECT ST_DISTANCE(ST_GEOGFROMTEXT(\"POINT(-122.335503 47.625536)\"), @geo) < 3000 as within3k"; + QueryParameterValue geoParameterValue = + QueryParameterValue.geography("POINT(-122.3509153 47.6495389)"); + QueryJobConfiguration config = + QueryJobConfiguration.newBuilder(query) + .setDefaultDataset(DatasetId.of(DATASET)) + .setUseLegacySql(false) + .addNamedParameter("geo", geoParameterValue) + .build(); + TableResult result = bigquery.query(config); + int rowCount = 0; + for (FieldValueList row : result.getValues()) { + rowCount++; + assertEquals(true, row.get(0).getBooleanValue()); + } + assertEquals(1, rowCount); + } + @Test public void testListJobs() { Page jobs = bigquery.listJobs();