From b18e37b8e8ea1f1f9791f848fe7a525b4f1876d0 Mon Sep 17 00:00:00 2001 From: Nandkumar Kadivar Date: Thu, 30 Mar 2023 21:46:40 -0300 Subject: [PATCH 1/6] Refactored code smell with extract method --- .../org/influxdb/impl/RetryCapableBatchWriter.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/influxdb/impl/RetryCapableBatchWriter.java b/src/main/java/org/influxdb/impl/RetryCapableBatchWriter.java index e2b08190b..806302de7 100644 --- a/src/main/java/org/influxdb/impl/RetryCapableBatchWriter.java +++ b/src/main/java/org/influxdb/impl/RetryCapableBatchWriter.java @@ -67,6 +67,12 @@ private WriteResult(final InfluxDBException e) { @Override public synchronized void write(final Collection collection) { // empty the cached data first + emptyCachedData(collection); + // write the last given batch last so that duplicate data points get overwritten correctly + writeLastBatch(collection); + } + + private void emptyCachedData(final Collection collection){ ListIterator batchQueueIterator = batchQueue.listIterator(); while (batchQueueIterator.hasNext()) { BatchPoints entry = batchQueueIterator.next(); @@ -88,7 +94,9 @@ public synchronized void write(final Collection collection) { return; } } - // write the last given batch last so that duplicate data points get overwritten correctly + } + + private void writeLastBatch(final Collection collection){ Iterator collectionIterator = collection.iterator(); while (collectionIterator.hasNext()) { BatchPoints batchPoints = collectionIterator.next(); From a133bcba8d35c4077a1cb9f9001058d81acb0e35 Mon Sep 17 00:00:00 2001 From: Nandkumar Kadivar Date: Thu, 30 Mar 2023 22:05:31 -0300 Subject: [PATCH 2/6] Refactore code smell with introducing explaining varibale --- src/main/java/org/influxdb/impl/Preconditions.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/influxdb/impl/Preconditions.java b/src/main/java/org/influxdb/impl/Preconditions.java index 1e34204a3..b996b6a06 100644 --- a/src/main/java/org/influxdb/impl/Preconditions.java +++ b/src/main/java/org/influxdb/impl/Preconditions.java @@ -1,5 +1,7 @@ package org.influxdb.impl; +import java.util.regex.Pattern; + /** * Functions for parameter validation. * @@ -7,6 +9,8 @@ */ public final class Preconditions { + private static final String DURATION_REGULAR_EXPRESSION = "(\\d+[wdmhs])+|inf"; + private Preconditions() { } @@ -54,7 +58,7 @@ public static void checkNotNegativeNumber(final Number number, final String name * @throws IllegalArgumentException if the given duration is not valid. */ public static void checkDuration(final String duration, final String name) throws IllegalArgumentException { - if (!duration.matches("(\\d+[wdmhs])+|inf")) { + if (!duration.matches(DURATION_REGULAR_EXPRESSION)) { throw new IllegalArgumentException("Invalid InfluxDB duration: " + duration + " for " + name); } From 8d5687bde47e4dfc26c6956bb7edcc080f0018f6 Mon Sep 17 00:00:00 2001 From: Nandkumar Kadivar Date: Thu, 30 Mar 2023 22:27:28 -0300 Subject: [PATCH 3/6] Refactored code smell with Decompose Condition --- src/main/java/org/influxdb/dto/Point.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/influxdb/dto/Point.java b/src/main/java/org/influxdb/dto/Point.java index 96069026c..da9ff7386 100755 --- a/src/main/java/org/influxdb/dto/Point.java +++ b/src/main/java/org/influxdb/dto/Point.java @@ -526,7 +526,7 @@ private int concatenatedFields(final StringBuilder sb) { escapeKey(sb, field.getKey()); sb.append('='); if (value instanceof Number) { - if (value instanceof Double || value instanceof Float || value instanceof BigDecimal) { + if (isValidInstanceType(value)) { sb.append(NUMBER_FORMATTER.get().format(value)); } else { sb.append(value).append('i'); @@ -554,6 +554,10 @@ private int concatenatedFields(final StringBuilder sb) { return fieldCount; } + private boolean isValidInstanceType(Object value){ + return value instanceof Double || value instanceof Float || value instanceof BigDecimal; + } + static void escapeKey(final StringBuilder sb, final String key) { for (int i = 0; i < key.length(); i++) { switch (key.charAt(i)) { From fdbbba25678dd69317d7b8e119f52ebb916f090c Mon Sep 17 00:00:00 2001 From: Nandkumar Kadivar Date: Thu, 30 Mar 2023 23:04:06 -0300 Subject: [PATCH 4/6] Refactored code smell with Extract Class --- .../org/influxdb/querybuilder/BuiltQuery.java | 21 +---------------- .../influxdb/querybuilder/SelectCoreImpl.java | 2 +- .../org/influxdb/querybuilder/Utility.java | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+), 21 deletions(-) create mode 100644 src/main/java/org/influxdb/querybuilder/Utility.java diff --git a/src/main/java/org/influxdb/querybuilder/BuiltQuery.java b/src/main/java/org/influxdb/querybuilder/BuiltQuery.java index d9a3c5920..8b88e7a01 100644 --- a/src/main/java/org/influxdb/querybuilder/BuiltQuery.java +++ b/src/main/java/org/influxdb/querybuilder/BuiltQuery.java @@ -29,29 +29,10 @@ public BuiltQuery(final String database, final boolean requiresPost) { super(null, database, requiresPost); } - static StringBuilder addSemicolonIfMissing(final StringBuilder stringBuilder) { - int length = trimLast(stringBuilder); - if (length == 0 || stringBuilder.charAt(length - 1) != ';') { - stringBuilder.append(';'); - } - return stringBuilder; - } - - static int trimLast(final StringBuilder stringBuilder) { - int length = stringBuilder.length(); - while (length > 0 && stringBuilder.charAt(length - 1) <= ' ') { - length -= 1; - } - if (length != stringBuilder.length()) { - stringBuilder.setLength(length); - } - return length; - } - @Override public String getCommand() { StringBuilder sb = buildQueryString(new StringBuilder()); - addSemicolonIfMissing(sb); + Utility.addSemicolonIfMissing(sb); return sb.toString(); } diff --git a/src/main/java/org/influxdb/querybuilder/SelectCoreImpl.java b/src/main/java/org/influxdb/querybuilder/SelectCoreImpl.java index 37ccf47be..d334003ad 100644 --- a/src/main/java/org/influxdb/querybuilder/SelectCoreImpl.java +++ b/src/main/java/org/influxdb/querybuilder/SelectCoreImpl.java @@ -3,7 +3,7 @@ import static org.influxdb.querybuilder.Appender.appendValue; import static org.influxdb.querybuilder.Appender.joinAndAppend; import static org.influxdb.querybuilder.Appender.joinAndAppendNames; -import static org.influxdb.querybuilder.BuiltQuery.trimLast; +import static org.influxdb.querybuilder.Utility.trimLast; import static org.influxdb.querybuilder.FunctionFactory.function; import java.util.Arrays; diff --git a/src/main/java/org/influxdb/querybuilder/Utility.java b/src/main/java/org/influxdb/querybuilder/Utility.java new file mode 100644 index 000000000..1d1b3c1c2 --- /dev/null +++ b/src/main/java/org/influxdb/querybuilder/Utility.java @@ -0,0 +1,23 @@ +package org.influxdb.querybuilder; + +public class Utility { + + static StringBuilder addSemicolonIfMissing(final StringBuilder stringBuilder) { + int length = trimLast(stringBuilder); + if (length == 0 || stringBuilder.charAt(length - 1) != ';') { + stringBuilder.append(';'); + } + return stringBuilder; + } + + static int trimLast(final StringBuilder stringBuilder) { + int length = stringBuilder.length(); + while (length > 0 && stringBuilder.charAt(length - 1) <= ' ') { + length -= 1; + } + if (length != stringBuilder.length()) { + stringBuilder.setLength(length); + } + return length; + } +} From fec97f4439af57222f283126cd61b732000b984f Mon Sep 17 00:00:00 2001 From: Nandkumar Kadivar Date: Thu, 30 Mar 2023 23:20:56 -0300 Subject: [PATCH 5/6] Refactored code smell with Move Method --- src/main/java/org/influxdb/impl/InfluxDBMapper.java | 4 ++++ src/main/java/org/influxdb/impl/InfluxDBResultMapper.java | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/influxdb/impl/InfluxDBMapper.java b/src/main/java/org/influxdb/impl/InfluxDBMapper.java index 700a960cf..a2736dea1 100644 --- a/src/main/java/org/influxdb/impl/InfluxDBMapper.java +++ b/src/main/java/org/influxdb/impl/InfluxDBMapper.java @@ -21,6 +21,10 @@ public InfluxDBMapper(final InfluxDB influxDB) { this.influxDB = influxDB; } + String getDatabaseName(final Class clazz) { + return ((Measurement) clazz.getAnnotation(Measurement.class)).database(); + } + public List query(final Query query, final Class clazz, final String measurementName) { QueryResult queryResult = influxDB.query(query); return toPOJO(queryResult, clazz, measurementName); diff --git a/src/main/java/org/influxdb/impl/InfluxDBResultMapper.java b/src/main/java/org/influxdb/impl/InfluxDBResultMapper.java index d6edef17c..7766a6e91 100644 --- a/src/main/java/org/influxdb/impl/InfluxDBResultMapper.java +++ b/src/main/java/org/influxdb/impl/InfluxDBResultMapper.java @@ -231,10 +231,6 @@ String getMeasurementName(final Class clazz) { return ((Measurement) clazz.getAnnotation(Measurement.class)).name(); } - String getDatabaseName(final Class clazz) { - return ((Measurement) clazz.getAnnotation(Measurement.class)).database(); - } - String getRetentionPolicy(final Class clazz) { return ((Measurement) clazz.getAnnotation(Measurement.class)).retentionPolicy(); } From eed38b37086a00fb108d002d48fbb93ef8bf0d8a Mon Sep 17 00:00:00 2001 From: Nandkumar Kadivar Date: Fri, 31 Mar 2023 19:46:26 -0300 Subject: [PATCH 6/6] Refactor code smell with pushdown method and fixed test cases --- .../org/influxdb/impl/InfluxDBMapper.java | 24 +++++++++++++++++++ .../influxdb/impl/InfluxDBResultMapper.java | 24 ------------------- .../impl/InfluxDBResultMapperTest.java | 5 ++-- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/influxdb/impl/InfluxDBMapper.java b/src/main/java/org/influxdb/impl/InfluxDBMapper.java index a2736dea1..58a6e4c51 100644 --- a/src/main/java/org/influxdb/impl/InfluxDBMapper.java +++ b/src/main/java/org/influxdb/impl/InfluxDBMapper.java @@ -25,6 +25,30 @@ String getDatabaseName(final Class clazz) { return ((Measurement) clazz.getAnnotation(Measurement.class)).database(); } + /** + *

+ * Process a {@link QueryResult} object returned by the InfluxDB client inspecting the internal + * data structure and creating the respective object instances based on the Class passed as + * parameter. + *

+ * + * @param queryResult the InfluxDB result object + * @param clazz the Class that will be used to hold your measurement data + * @param the target type + * @param measurementName name of the Measurement + * + * @return a {@link List} of objects from the same Class passed as parameter and sorted on the + * same order as received from InfluxDB. + * + * @throws InfluxDBMapperException If {@link QueryResult} parameter contain errors, + * clazz parameter is not annotated with @Measurement or it was not + * possible to define the values of your POJO (e.g. due to an unsupported field type). + */ + public List toPOJO(final QueryResult queryResult, final Class clazz, final String measurementName) + throws InfluxDBMapperException { + return toPOJO(queryResult, clazz, measurementName, TimeUnit.MILLISECONDS); + } + public List query(final Query query, final Class clazz, final String measurementName) { QueryResult queryResult = influxDB.query(query); return toPOJO(queryResult, clazz, measurementName); diff --git a/src/main/java/org/influxdb/impl/InfluxDBResultMapper.java b/src/main/java/org/influxdb/impl/InfluxDBResultMapper.java index 7766a6e91..17fc22289 100644 --- a/src/main/java/org/influxdb/impl/InfluxDBResultMapper.java +++ b/src/main/java/org/influxdb/impl/InfluxDBResultMapper.java @@ -113,30 +113,6 @@ public List toPOJO(final QueryResult queryResult, final Class clazz, return this.toPOJO(queryResult, clazz, measurementName, precision); } - /** - *

- * Process a {@link QueryResult} object returned by the InfluxDB client inspecting the internal - * data structure and creating the respective object instances based on the Class passed as - * parameter. - *

- * - * @param queryResult the InfluxDB result object - * @param clazz the Class that will be used to hold your measurement data - * @param the target type - * @param measurementName name of the Measurement - * - * @return a {@link List} of objects from the same Class passed as parameter and sorted on the - * same order as received from InfluxDB. - * - * @throws InfluxDBMapperException If {@link QueryResult} parameter contain errors, - * clazz parameter is not annotated with @Measurement or it was not - * possible to define the values of your POJO (e.g. due to an unsupported field type). - */ - public List toPOJO(final QueryResult queryResult, final Class clazz, final String measurementName) - throws InfluxDBMapperException { - return toPOJO(queryResult, clazz, measurementName, TimeUnit.MILLISECONDS); - } - /** *

* Process a {@link QueryResult} object returned by the InfluxDB client inspecting the internal diff --git a/src/test/java/org/influxdb/impl/InfluxDBResultMapperTest.java b/src/test/java/org/influxdb/impl/InfluxDBResultMapperTest.java index f4eee0ba2..e4a6cfc51 100644 --- a/src/test/java/org/influxdb/impl/InfluxDBResultMapperTest.java +++ b/src/test/java/org/influxdb/impl/InfluxDBResultMapperTest.java @@ -48,6 +48,7 @@ public class InfluxDBResultMapperTest { InfluxDBResultMapper mapper = new InfluxDBResultMapper(); + private InfluxDBMapper influxDBMapper; @Test public void testToPOJO_HappyPath() { @@ -404,7 +405,7 @@ void testToPOJO_SetMeasureName() { //When... List result = - mapper.toPOJO(queryResult, MyCustomMeasurement.class, "MySeriesName"); + influxDBMapper.toPOJO(queryResult, MyCustomMeasurement.class, "MySeriesName"); //Then... Assertions.assertTrue(result.size() == 1); @@ -434,7 +435,7 @@ void testToPOJOInheritance() { //When... List result = - mapper.toPOJO(queryResult, MySubMeasurement.class, "MySeriesName"); + influxDBMapper.toPOJO(queryResult, MySubMeasurement.class, "MySeriesName"); //Then... Assertions.assertTrue(result.size() == 1);