From a28c4886e32b38859fb7cac2c9ef55b6fd4ba080 Mon Sep 17 00:00:00 2001 From: zhiheng123 <903292776@qq.com> Date: Tue, 27 Aug 2024 23:54:34 +0800 Subject: [PATCH] fix: add precision in query method Signed-off-by: zhiheng123 <903292776@qq.com> --- .../io/opengemini/client/api/Precision.java | 17 ++++--- .../java/io/opengemini/client/api/Query.java | 10 +++++ .../OpenGeminiAsyncHttpClientTest.java | 43 ++++++++++++++++++ .../opengemini/client/common/BaseClient.java | 4 ++ .../client/jdk/OpenGeminiJdkClientTest.java | 38 ++++++++++++++++ .../okhttp/OpenGeminiOkhttpClientTest.java | 44 +++++++++++++++++++ 6 files changed, 149 insertions(+), 7 deletions(-) diff --git a/opengemini-client-api/src/main/java/io/opengemini/client/api/Precision.java b/opengemini-client-api/src/main/java/io/opengemini/client/api/Precision.java index 03f628ae..89f148cb 100644 --- a/opengemini-client-api/src/main/java/io/opengemini/client/api/Precision.java +++ b/opengemini-client-api/src/main/java/io/opengemini/client/api/Precision.java @@ -6,24 +6,27 @@ @Getter public enum Precision { - PRECISIONNANOSECOND("PrecisionNanoSecond", TimeUnit.NANOSECONDS), + PRECISIONNANOSECOND("PrecisionNanoSecond", TimeUnit.NANOSECONDS, "ns"), - PRECISIONMICROSECOND("PrecisionMicrosecond", TimeUnit.MICROSECONDS), + PRECISIONMICROSECOND("PrecisionMicrosecond", TimeUnit.MICROSECONDS, "u"), - PRECISIONMILLISECOND("PrecisionMillisecond", TimeUnit.MILLISECONDS), + PRECISIONMILLISECOND("PrecisionMillisecond", TimeUnit.MILLISECONDS, "ms"), - PRECISIONSECOND("PrecisionSecond", TimeUnit.SECONDS), + PRECISIONSECOND("PrecisionSecond", TimeUnit.SECONDS, "s"), - PRECISIONMINUTE("PrecisionMinute", TimeUnit.MINUTES), + PRECISIONMINUTE("PrecisionMinute", TimeUnit.MINUTES, "m"), - PRECISIONHOUR("PrecisionHour", TimeUnit.HOURS); + PRECISIONHOUR("PrecisionHour", TimeUnit.HOURS, "h"); private final String description; private final TimeUnit timeUnit; - Precision(String description, TimeUnit timeUnit) { + private final String epoch; + + Precision(String description, TimeUnit timeUnit, String epoch) { this.description = description; this.timeUnit = timeUnit; + this.epoch = epoch; } } diff --git a/opengemini-client-api/src/main/java/io/opengemini/client/api/Query.java b/opengemini-client-api/src/main/java/io/opengemini/client/api/Query.java index a9b4e954..cef92c3c 100644 --- a/opengemini-client-api/src/main/java/io/opengemini/client/api/Query.java +++ b/opengemini-client-api/src/main/java/io/opengemini/client/api/Query.java @@ -23,8 +23,18 @@ public class Query { */ private String retentionPolicy; + /* + * the precision of the time in query result + */ + private Precision precision; + public Query(String command) { this.command = command; } + public Query(String command, String database, String retentionPolicy) { + this.command = command; + this.database = database; + this.retentionPolicy = retentionPolicy; + } } diff --git a/opengemini-client-asynchttpclient/src/test/java/io/opengemini/client/asynchttpclient/OpenGeminiAsyncHttpClientTest.java b/opengemini-client-asynchttpclient/src/test/java/io/opengemini/client/asynchttpclient/OpenGeminiAsyncHttpClientTest.java index c04835fc..8a13fe17 100644 --- a/opengemini-client-asynchttpclient/src/test/java/io/opengemini/client/asynchttpclient/OpenGeminiAsyncHttpClientTest.java +++ b/opengemini-client-asynchttpclient/src/test/java/io/opengemini/client/asynchttpclient/OpenGeminiAsyncHttpClientTest.java @@ -4,11 +4,13 @@ import io.opengemini.client.api.OpenGeminiException; import io.opengemini.client.api.Point; import io.opengemini.client.api.Pong; +import io.opengemini.client.api.Precision; import io.opengemini.client.api.Query; import io.opengemini.client.api.QueryResult; import io.opengemini.client.api.RetentionPolicy; import io.opengemini.client.api.RpConfig; import io.opengemini.client.api.Series; +import lombok.SneakyThrows; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -288,4 +290,45 @@ private static Point testPoint(String measurementName, int valueIndex, int field testPoint.setFields(fields); return testPoint; } + + @SneakyThrows + @Test + void testQueryPrecision() { + String databaseName = "query_precision_0001"; + CompletableFuture createdb = openGeminiAsyncHttpClient.createDatabase(databaseName); + createdb.get(); + + String measurementName = "query_precision_ms_0001"; + Point testPoint1 = testPoint(measurementName, 1, 1); + Point testPoint2 = testPoint(measurementName, 2, 1); + Point testPoint3 = testPoint(measurementName, 3, 1); + + CompletableFuture writeRsp = openGeminiAsyncHttpClient.write(databaseName, + Arrays.asList(testPoint1, testPoint2, testPoint3)); + writeRsp.get(); + Thread.sleep(3000); + + Query selectQuery = new Query("select * from " + measurementName, databaseName, ""); + CompletableFuture rst = openGeminiAsyncHttpClient.query(selectQuery); + QueryResult queryResult = rst.get(); + + Series x = queryResult.getResults().get(0).getSeries().get(0); + Object timeValue = x.getValues().get(0).get(0); + Assertions.assertInstanceOf(String.class, timeValue); + String timeValueStr = (String) timeValue; + Assertions.assertTrue(timeValueStr.startsWith("20") && timeValueStr.endsWith("Z")); + + selectQuery = new Query("select * from " + measurementName, databaseName, "", Precision.PRECISIONNANOSECOND); + rst = openGeminiAsyncHttpClient.query(selectQuery); + queryResult = rst.get(); + + x = queryResult.getResults().get(0).getSeries().get(0); + timeValue = x.getValues().get(0).get(0); + Assertions.assertInstanceOf(Long.class, timeValue); + long timeValueDouble = (Long) timeValue; + Assertions.assertTrue(timeValueDouble > 1724778721457052741L); + + CompletableFuture dropdb = openGeminiAsyncHttpClient.dropDatabase(databaseName); + dropdb.get(); + } } diff --git a/opengemini-client-common/src/main/java/io/opengemini/client/common/BaseClient.java b/opengemini-client-common/src/main/java/io/opengemini/client/common/BaseClient.java index 5be5bd16..6e2f03ac 100644 --- a/opengemini-client-common/src/main/java/io/opengemini/client/common/BaseClient.java +++ b/opengemini-client-common/src/main/java/io/opengemini/client/common/BaseClient.java @@ -58,6 +58,10 @@ protected String getQueryUrl(Query query) { if (query.getRetentionPolicy() != null) { queryUrl += "&rp=" + query.getRetentionPolicy(); } + + if (query.getPrecision() != null) { + queryUrl += "&epoch=" + query.getPrecision().getEpoch(); + } return queryUrl; } } diff --git a/opengemini-client-jdk/src/test/java/io/opengemini/client/jdk/OpenGeminiJdkClientTest.java b/opengemini-client-jdk/src/test/java/io/opengemini/client/jdk/OpenGeminiJdkClientTest.java index 81b0105b..d218ace0 100644 --- a/opengemini-client-jdk/src/test/java/io/opengemini/client/jdk/OpenGeminiJdkClientTest.java +++ b/opengemini-client-jdk/src/test/java/io/opengemini/client/jdk/OpenGeminiJdkClientTest.java @@ -6,6 +6,7 @@ import io.opengemini.client.api.OpenGeminiException; import io.opengemini.client.api.Point; import io.opengemini.client.api.Pong; +import io.opengemini.client.api.Precision; import io.opengemini.client.api.Query; import io.opengemini.client.api.QueryResult; import io.opengemini.client.api.RetentionPolicy; @@ -284,4 +285,41 @@ void ping() throws Exception { Assertions.assertNotNull(pong.getVersion()); } + @SneakyThrows + @Test + void testQueryPrecision() { + String databaseName = "query_precision_0001"; + CompletableFuture createdb = openGeminiJdkClient.createDatabase(databaseName); + createdb.get(); + + String measurementName = "query_precision_ms_0001"; + Point testPoint = generalTestPoint(measurementName, 1, 1); + + CompletableFuture writeRsp = openGeminiJdkClient.write(databaseName, testPoint); + writeRsp.get(); + Thread.sleep(3000); + + Query selectQuery = new Query("select * from " + measurementName, databaseName, ""); + CompletableFuture rst = openGeminiJdkClient.query(selectQuery); + QueryResult queryResult = rst.get(); + + Series x = queryResult.getResults().get(0).getSeries().get(0); + Object timeValue = x.getValues().get(0).get(0); + Assertions.assertInstanceOf(String.class, timeValue); + String timeValueStr = (String) timeValue; + Assertions.assertTrue(timeValueStr.startsWith("20") && timeValueStr.endsWith("Z")); + + selectQuery = new Query("select * from " + measurementName, databaseName, "", Precision.PRECISIONNANOSECOND); + rst = openGeminiJdkClient.query(selectQuery); + queryResult = rst.get(); + + x = queryResult.getResults().get(0).getSeries().get(0); + timeValue = x.getValues().get(0).get(0); + Assertions.assertInstanceOf(Long.class, timeValue); + long timeValueDouble = (Long) timeValue; + Assertions.assertTrue(timeValueDouble > 1724778721457052741L); + + CompletableFuture dropdb = openGeminiJdkClient.dropDatabase(databaseName); + dropdb.get(); + } } diff --git a/opengemini-client-okhttp/src/test/java/io/opengemini/client/okhttp/OpenGeminiOkhttpClientTest.java b/opengemini-client-okhttp/src/test/java/io/opengemini/client/okhttp/OpenGeminiOkhttpClientTest.java index b0223ace..df09fbea 100644 --- a/opengemini-client-okhttp/src/test/java/io/opengemini/client/okhttp/OpenGeminiOkhttpClientTest.java +++ b/opengemini-client-okhttp/src/test/java/io/opengemini/client/okhttp/OpenGeminiOkhttpClientTest.java @@ -4,11 +4,13 @@ import io.opengemini.client.api.OpenGeminiException; import io.opengemini.client.api.Point; import io.opengemini.client.api.Pong; +import io.opengemini.client.api.Precision; import io.opengemini.client.api.Query; import io.opengemini.client.api.QueryResult; import io.opengemini.client.api.RetentionPolicy; import io.opengemini.client.api.RpConfig; import io.opengemini.client.api.Series; +import lombok.SneakyThrows; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -287,4 +289,46 @@ private static Point testPoint(String measurementName, int valueIndex, int field testPoint.setFields(fields); return testPoint; } + + + @SneakyThrows + @Test + void testQueryPrecision() { + String databaseName = "query_precision_0001"; + CompletableFuture createdb = openGeminiOkhttpClient.createDatabase(databaseName); + createdb.get(); + + String measurementName = "query_precision_ms_0001"; + Point testPoint1 = testPoint(measurementName, 1, 1); + Point testPoint2 = testPoint(measurementName, 2, 1); + Point testPoint3 = testPoint(measurementName, 3, 1); + + CompletableFuture writeRsp = openGeminiOkhttpClient.write(databaseName, + Arrays.asList(testPoint1, testPoint2, testPoint3)); + writeRsp.get(); + Thread.sleep(3000); + + Query selectQuery = new Query("select * from " + measurementName, databaseName, ""); + CompletableFuture rst = openGeminiOkhttpClient.query(selectQuery); + QueryResult queryResult = rst.get(); + + Series x = queryResult.getResults().get(0).getSeries().get(0); + Object timeValue = x.getValues().get(0).get(0); + Assertions.assertInstanceOf(String.class, timeValue); + String timeValueStr = (String) timeValue; + Assertions.assertTrue(timeValueStr.startsWith("20") && timeValueStr.endsWith("Z")); + + selectQuery = new Query("select * from " + measurementName, databaseName, "", Precision.PRECISIONNANOSECOND); + rst = openGeminiOkhttpClient.query(selectQuery); + queryResult = rst.get(); + + x = queryResult.getResults().get(0).getSeries().get(0); + timeValue = x.getValues().get(0).get(0); + Assertions.assertInstanceOf(Long.class, timeValue); + long timeValueDouble = (Long) timeValue; + Assertions.assertTrue(timeValueDouble > 1724778721457052741L); + + CompletableFuture dropdb = openGeminiOkhttpClient.dropDatabase(databaseName); + dropdb.get(); + } }