From 45d1e958de45133e40286e8c8410fb57f36709d3 Mon Sep 17 00:00:00 2001 From: Praful Makani Date: Wed, 13 Feb 2019 19:35:24 +0530 Subject: [PATCH 1/3] Fix Standard Date in QueryParameterValue classToType --- .../cloud/bigquery/QueryParameterValue.java | 17 +++++++++++++++++ .../cloud/bigquery/QueryParameterValueTest.java | 15 +++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java b/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java index 5bf6b4e9f93a..4db4f561a43e 100644 --- a/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java +++ b/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java @@ -24,7 +24,10 @@ import com.google.common.io.BaseEncoding; import java.io.Serializable; import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; import javax.annotation.Nullable; import org.threeten.bp.Instant; @@ -67,6 +70,7 @@ public abstract class QueryParameterValue implements Serializable { DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS"); private static final DateTimeFormatter datetimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"); + private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); static final Function< QueryParameterValue, com.google.api.services.bigquery.model.QueryParameterValue> @@ -256,6 +260,8 @@ private static StandardSQLTypeName classToType(Class type) { return StandardSQLTypeName.FLOAT64; } else if (BigDecimal.class.isAssignableFrom(type)) { return StandardSQLTypeName.NUMERIC; + } else if (Date.class.isAssignableFrom(type)) { + return StandardSQLTypeName.DATE; } throw new IllegalArgumentException("Unsupported object type for QueryParameter: " + type); } @@ -310,6 +316,9 @@ private static String valueToStringOrNull(T value, StandardSQLTypeName type) // verify that the String is in the right format checkFormat(value, dateFormatter); return (String) value; + } else if (value instanceof Date) { + checkFormat(value, dateFormat); + return dateFormat.format(value); } break; case TIME: @@ -341,6 +350,14 @@ private static void checkFormat(Object value, DateTimeFormatter formatter) { } } + private static void checkFormat(Object value, DateFormat format) { + try { + format.format(value); + } catch (Exception e) { + throw new IllegalArgumentException(e.getMessage(), e); + } + } + /** Returns a builder for a QueryParameterValue object with given value. */ public abstract Builder toBuilder(); diff --git a/google-cloud-clients/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java b/google-cloud-clients/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java index 485b81e5e497..8a793b27d0ec 100644 --- a/google-cloud-clients/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java +++ b/google-cloud-clients/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java @@ -20,11 +20,16 @@ import com.google.api.services.bigquery.model.QueryParameterType; import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; import org.junit.Test; public class QueryParameterValueTest { + private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + @Test public void testBool() { QueryParameterValue value = QueryParameterValue.bool(true); @@ -204,6 +209,16 @@ public void testDate() { assertThat(value.getArrayValues()).isNull(); } + @Test + public void testStandardDate() throws ParseException { + Date date = SIMPLE_DATE_FORMAT.parse("2016-09-18"); + QueryParameterValue value = QueryParameterValue.of(date, Date.class); + assertThat(value.getValue()).isEqualTo("2016-09-18"); + assertThat(value.getType()).isEqualTo(StandardSQLTypeName.DATE); + assertThat(value.getArrayType()).isNull(); + assertThat(value.getArrayValues()).isNull(); + } + @Test(expected = IllegalArgumentException.class) public void testInvalidDate() { // not supposed to have the time From 888fdc665d9cdf85406a30c3f9941c9c66a01c57 Mon Sep 17 00:00:00 2001 From: Praful Makani Date: Thu, 14 Feb 2019 21:37:20 +0530 Subject: [PATCH 2/3] remove Standard DateFormat and use Google Date --- .../cloud/bigquery/QueryParameterValue.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java b/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java index 4db4f561a43e..64abfebfa328 100644 --- a/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java +++ b/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/QueryParameterValue.java @@ -24,8 +24,6 @@ import com.google.common.io.BaseEncoding; import java.io.Serializable; import java.math.BigDecimal; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -70,7 +68,6 @@ public abstract class QueryParameterValue implements Serializable { DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS"); private static final DateTimeFormatter datetimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"); - private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); static final Function< QueryParameterValue, com.google.api.services.bigquery.model.QueryParameterValue> @@ -317,8 +314,8 @@ private static String valueToStringOrNull(T value, StandardSQLTypeName type) checkFormat(value, dateFormatter); return (String) value; } else if (value instanceof Date) { - checkFormat(value, dateFormat); - return dateFormat.format(value); + com.google.cloud.Date date = com.google.cloud.Date.fromJavaUtilDate((Date) value); + return date.toString(); } break; case TIME: @@ -350,14 +347,6 @@ private static void checkFormat(Object value, DateTimeFormatter formatter) { } } - private static void checkFormat(Object value, DateFormat format) { - try { - format.format(value); - } catch (Exception e) { - throw new IllegalArgumentException(e.getMessage(), e); - } - } - /** Returns a builder for a QueryParameterValue object with given value. */ public abstract Builder toBuilder(); From 0b09ee4440bab7e89c4503cbc97a7232e998fa1c Mon Sep 17 00:00:00 2001 From: Praful Makani Date: Thu, 14 Feb 2019 22:25:36 +0530 Subject: [PATCH 3/3] remove Standard DateFormat from Test case --- .../com/google/cloud/bigquery/QueryParameterValueTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/google-cloud-clients/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java b/google-cloud-clients/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java index 8a793b27d0ec..8047bf33d0f4 100644 --- a/google-cloud-clients/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java +++ b/google-cloud-clients/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/QueryParameterValueTest.java @@ -21,15 +21,12 @@ import com.google.api.services.bigquery.model.QueryParameterType; import java.math.BigDecimal; import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.junit.Test; public class QueryParameterValueTest { - private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); - @Test public void testBool() { QueryParameterValue value = QueryParameterValue.bool(true); @@ -211,7 +208,8 @@ public void testDate() { @Test public void testStandardDate() throws ParseException { - Date date = SIMPLE_DATE_FORMAT.parse("2016-09-18"); + com.google.cloud.Date gcDate = com.google.cloud.Date.parseDate("2016-09-18"); + Date date = com.google.cloud.Date.toJavaUtilDate(gcDate); QueryParameterValue value = QueryParameterValue.of(date, Date.class); assertThat(value.getValue()).isEqualTo("2016-09-18"); assertThat(value.getType()).isEqualTo(StandardSQLTypeName.DATE);