5151import org .junit .jupiter .api .BeforeAll ;
5252import org .junit .jupiter .api .Test ;
5353
54- public class ITHighPrecisionTimestamp {
54+ class ITHighPrecisionTimestamp {
5555
56- public static final String TEST_HIGH_PRECISION_TIMESTAMP_TABLE_NAME =
57- "test_high_precision_timestamp" ;
56+ private static final String TEST_HIGH_PRECISION_TIMESTAMP_TABLE_NAME =
57+ generateTempTableName ( "test_high_precision_timestamp" ) ;
5858 private static BigQuery bigquery ;
5959 private static final String DATASET = RemoteBigQueryHelper .generateDatasetName ();
6060 private static TableId defaultTableId ;
61- public static final long TIMESTAMP_PICOSECOND_PRECISION = 12L ;
61+ private static final long TIMESTAMP_PICOSECOND_PRECISION = 12L ;
6262 private static final Field TIMESTAMP_HIGH_PRECISION_FIELD_SCHEMA =
6363 Field .newBuilder ("timestampHighPrecisionField" , StandardSQLTypeName .TIMESTAMP )
6464 .setTimestampPrecision (TIMESTAMP_PICOSECOND_PRECISION )
@@ -69,8 +69,12 @@ public class ITHighPrecisionTimestamp {
6969 private static final String TIMESTAMP2 = "1970-01-01T12:34:56.123456789123Z" ;
7070 private static final String TIMESTAMP3 = "2000-01-01T12:34:56.123456789123Z" ;
7171
72+ private static String generateTempTableName (String prefix ) {
73+ return String .format ("%s_%s" , prefix , UUID .randomUUID ().toString ().substring (0 , 8 ));
74+ }
75+
7276 @ BeforeAll
73- public static void beforeClass () {
77+ static void beforeClass () {
7478 BigQueryOptions .Builder builder =
7579 BigQueryOptions .newBuilder ()
7680 .setDataFormatOptions (
@@ -111,21 +115,15 @@ public static void beforeClass() {
111115 }
112116
113117 @ AfterAll
114- public static void afterClass () {
118+ static void afterClass () {
115119 if (bigquery != null ) {
116120 bigquery .delete (defaultTableId );
117121 RemoteBigQueryHelper .forceDelete (bigquery , DATASET );
118122 }
119123 }
120124
121- private static String generateTempTableName () {
122- return String .format (
123- "insert_temp_%s%s" ,
124- UUID .randomUUID ().toString ().substring (0 , 6 ), TEST_HIGH_PRECISION_TIMESTAMP_TABLE_NAME );
125- }
126-
127125 @ Test
128- public void query_highPrecisionTimestamp () throws InterruptedException {
126+ void query_highPrecisionTimestamp () throws InterruptedException {
129127 String sql =
130128 String .format ("SELECT timestampHighPrecisionField FROM %s;" , defaultTableId .getTable ());
131129 QueryJobConfiguration queryJobConfiguration =
@@ -147,10 +145,10 @@ public void query_highPrecisionTimestamp() throws InterruptedException {
147145 }
148146
149147 @ Test
150- public void insert_highPrecisionTimestamp_ISOValidFormat () {
148+ void insert_highPrecisionTimestamp_ISOValidFormat () {
151149 StandardTableDefinition tableDefinition =
152150 StandardTableDefinition .newBuilder ().setSchema (TABLE_SCHEMA ).build ();
153- String tempTableName = generateTempTableName ();
151+ String tempTableName = generateTempTableName ("insert_temp" );
154152 TableId tableId = TableId .of (DATASET , tempTableName );
155153 Table createdTable = bigquery .create (TableInfo .of (tableId , tableDefinition ));
156154 assertNotNull (createdTable );
@@ -166,10 +164,10 @@ public void insert_highPrecisionTimestamp_ISOValidFormat() {
166164 }
167165
168166 @ Test
169- public void insert_highPrecisionTimestamp_invalidFormats () {
167+ void insert_highPrecisionTimestamp_invalidFormats () {
170168 StandardTableDefinition tableDefinition =
171169 StandardTableDefinition .newBuilder ().setSchema (TABLE_SCHEMA ).build ();
172- String tempTable = generateTempTableName ();
170+ String tempTable = generateTempTableName ("insert_temp" );
173171 TableId tableId = TableId .of (DATASET , tempTable );
174172 Table createdTable = bigquery .create (TableInfo .of (tableId , tableDefinition ));
175173 assertNotNull (createdTable );
@@ -207,7 +205,7 @@ public void insert_highPrecisionTimestamp_invalidFormats() {
207205 }
208206
209207 @ Test
210- public void queryNamedParameter_highPrecisionTimestamp () throws InterruptedException {
208+ void queryNamedParameter_highPrecisionTimestamp () throws InterruptedException {
211209 String query =
212210 String .format (
213211 "SELECT * FROM %s.%s WHERE timestampHighPrecisionField >= CAST(@timestampParam AS TIMESTAMP(12))" ,
@@ -236,7 +234,34 @@ public void queryNamedParameter_highPrecisionTimestamp() throws InterruptedExcep
236234 }
237235
238236 @ Test
239- public void queryNamedParameter_highPrecisionTimestamp_microsLong () throws InterruptedException {
237+ void queryPositionalParameter_highPrecisionTimestamp () throws InterruptedException {
238+ String query =
239+ String .format (
240+ "SELECT * FROM %s.%s WHERE timestampHighPrecisionField >= CAST(? AS TIMESTAMP(12))" ,
241+ DATASET , defaultTableId .getTable ());
242+
243+ QueryJobConfiguration queryConfig =
244+ QueryJobConfiguration .newBuilder (query )
245+ .setDefaultDataset (DATASET )
246+ .setUseLegacySql (false )
247+ .addPositionalParameter (QueryParameterValue .timestamp ("2000-01-01 12:34:56.123456789123Z" ))
248+ .build ();
249+
250+ TableResult result = bigquery .query (queryConfig );
251+ assertNotNull (result );
252+ String [] expected = new String [] {TIMESTAMP1 , TIMESTAMP3 };
253+ List <String > timestamps =
254+ StreamSupport .stream (result .getValues ().spliterator (), false )
255+ .map (x -> (String ) x .get (0 ).getValue ())
256+ .collect (Collectors .toList ());
257+ assertEquals (expected .length , timestamps .size ());
258+ for (int i = 0 ; i < timestamps .size (); i ++) {
259+ assertEquals (expected [i ], timestamps .get (i ));
260+ }
261+ }
262+
263+ @ Test
264+ void queryNamedParameter_highPrecisionTimestamp_microsLong () throws InterruptedException {
240265 String query =
241266 String .format (
242267 "SELECT * FROM %s.%s WHERE timestampHighPrecisionField >= CAST(@timestampParam AS TIMESTAMP(12))" ,
@@ -269,8 +294,7 @@ public void queryNamedParameter_highPrecisionTimestamp_microsLong() throws Inter
269294 }
270295
271296 @ Test
272- public void queryNamedParameter_highPrecisionTimestamp_microsISOString ()
273- throws InterruptedException {
297+ void queryNamedParameter_highPrecisionTimestamp_microsISOString () throws InterruptedException {
274298 String query =
275299 String .format (
276300 "SELECT * FROM %s.%s WHERE timestampHighPrecisionField >= CAST(@timestampParam AS TIMESTAMP(12))" ,
@@ -298,7 +322,7 @@ public void queryNamedParameter_highPrecisionTimestamp_microsISOString()
298322 }
299323
300324 @ Test
301- public void queryNamedParameter_highPrecisionTimestamp_noExplicitCastInQuery_fails () {
325+ void queryNamedParameter_highPrecisionTimestamp_noExplicitCastInQuery_fails () {
302326 String query =
303327 String .format (
304328 "SELECT * FROM %s.%s WHERE timestampHighPrecisionField >= @timestampParam" ,
0 commit comments