Skip to content

Commit 7714819

Browse files
authored
Fix truncate() function (#1197)
* Fix truncate() function (#188) Signed-off-by: Margarit Hakobyan <[email protected]> Signed-off-by: Margarit Hakobyan <[email protected]>
1 parent 2f4924a commit 7714819

File tree

3 files changed

+51
-24
lines changed

3 files changed

+51
-24
lines changed

core/src/main/java/org/opensearch/sql/expression/operator/arthmetic/MathematicalFunction.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -500,26 +500,26 @@ private static DefaultFunctionResolver truncate() {
500500
FunctionDSL.impl(
501501
FunctionDSL.nullMissingHandling(
502502
(x, y) -> new ExprLongValue(
503-
new BigDecimal(x.integerValue()).setScale(y.integerValue(),
504-
RoundingMode.DOWN).longValue())),
503+
BigDecimal.valueOf(x.integerValue()).setScale(y.integerValue(),
504+
RoundingMode.DOWN).longValue())),
505505
LONG, INTEGER, INTEGER),
506506
FunctionDSL.impl(
507507
FunctionDSL.nullMissingHandling(
508508
(x, y) -> new ExprLongValue(
509-
new BigDecimal(x.integerValue()).setScale(y.integerValue(),
510-
RoundingMode.DOWN).longValue())),
509+
BigDecimal.valueOf(x.longValue()).setScale(y.integerValue(),
510+
RoundingMode.DOWN).longValue())),
511511
LONG, LONG, INTEGER),
512512
FunctionDSL.impl(
513513
FunctionDSL.nullMissingHandling(
514514
(x, y) -> new ExprDoubleValue(
515-
new BigDecimal(x.floatValue()).setScale(y.integerValue(),
516-
RoundingMode.DOWN).doubleValue())),
515+
BigDecimal.valueOf(x.floatValue()).setScale(y.integerValue(),
516+
RoundingMode.DOWN).doubleValue())),
517517
DOUBLE, FLOAT, INTEGER),
518518
FunctionDSL.impl(
519519
FunctionDSL.nullMissingHandling(
520520
(x, y) -> new ExprDoubleValue(
521-
new BigDecimal(x.doubleValue()).setScale(y.integerValue(),
522-
RoundingMode.DOWN).doubleValue())),
521+
BigDecimal.valueOf(x.doubleValue()).setScale(y.integerValue(),
522+
RoundingMode.DOWN).doubleValue())),
523523
DOUBLE, DOUBLE, INTEGER));
524524
}
525525

core/src/test/java/org/opensearch/sql/expression/operator/arthmetic/MathematicalFunctionTest.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,12 @@ public void ceil_int_value(Integer value) {
192192
assertThat(
193193
ceil.valueOf(valueEnv()),
194194
allOf(hasType(INTEGER), hasValue((int) Math.ceil(value))));
195-
assertEquals(String.format("ceil(%s)", value.toString()), ceil.toString());
195+
assertEquals(String.format("ceil(%s)", value), ceil.toString());
196196

197197
FunctionExpression ceiling = DSL.ceiling(DSL.literal(value));
198198
assertThat(
199199
ceiling.valueOf(valueEnv()), allOf(hasType(INTEGER), hasValue((int) Math.ceil(value))));
200-
assertEquals(String.format("ceiling(%s)", value.toString()), ceiling.toString());
200+
assertEquals(String.format("ceiling(%s)", value), ceiling.toString());
201201
}
202202

203203
/**
@@ -209,12 +209,12 @@ public void ceil_long_value(Long value) {
209209
FunctionExpression ceil = DSL.ceil(DSL.literal(value));
210210
assertThat(
211211
ceil.valueOf(valueEnv()), allOf(hasType(INTEGER), hasValue((int) Math.ceil(value))));
212-
assertEquals(String.format("ceil(%s)", value.toString()), ceil.toString());
212+
assertEquals(String.format("ceil(%s)", value), ceil.toString());
213213

214214
FunctionExpression ceiling = DSL.ceiling(DSL.literal(value));
215215
assertThat(
216216
ceiling.valueOf(valueEnv()), allOf(hasType(INTEGER), hasValue((int) Math.ceil(value))));
217-
assertEquals(String.format("ceiling(%s)", value.toString()), ceiling.toString());
217+
assertEquals(String.format("ceiling(%s)", value), ceiling.toString());
218218
}
219219

220220
/**
@@ -226,12 +226,12 @@ public void ceil_float_value(Float value) {
226226
FunctionExpression ceil = DSL.ceil(DSL.literal(value));
227227
assertThat(
228228
ceil.valueOf(valueEnv()), allOf(hasType(INTEGER), hasValue((int) Math.ceil(value))));
229-
assertEquals(String.format("ceil(%s)", value.toString()), ceil.toString());
229+
assertEquals(String.format("ceil(%s)", value), ceil.toString());
230230

231231
FunctionExpression ceiling = DSL.ceiling(DSL.literal(value));
232232
assertThat(
233233
ceiling.valueOf(valueEnv()), allOf(hasType(INTEGER), hasValue((int) Math.ceil(value))));
234-
assertEquals(String.format("ceiling(%s)", value.toString()), ceiling.toString());
234+
assertEquals(String.format("ceiling(%s)", value), ceiling.toString());
235235
}
236236

237237
/**
@@ -243,12 +243,12 @@ public void ceil_double_value(Double value) {
243243
FunctionExpression ceil = DSL.ceil(DSL.literal(value));
244244
assertThat(
245245
ceil.valueOf(valueEnv()), allOf(hasType(INTEGER), hasValue((int) Math.ceil(value))));
246-
assertEquals(String.format("ceil(%s)", value.toString()), ceil.toString());
246+
assertEquals(String.format("ceil(%s)", value), ceil.toString());
247247

248248
FunctionExpression ceiling = DSL.ceiling(DSL.literal(value));
249249
assertThat(
250250
ceiling.valueOf(valueEnv()), allOf(hasType(INTEGER), hasValue((int) Math.ceil(value))));
251-
assertEquals(String.format("ceiling(%s)", value.toString()), ceiling.toString());
251+
assertEquals(String.format("ceiling(%s)", value), ceiling.toString());
252252
}
253253

254254
/**
@@ -1721,51 +1721,54 @@ public void sqrt_missing_value() {
17211721
* Test truncate with integer value.
17221722
*/
17231723
@ParameterizedTest(name = "truncate({0}, {1})")
1724-
@ValueSource(ints = {2, -2})
1724+
@ValueSource(ints = {2, -2, Integer.MAX_VALUE, Integer.MIN_VALUE})
17251725
public void truncate_int_value(Integer value) {
17261726
FunctionExpression truncate = DSL.truncate(DSL.literal(value), DSL.literal(1));
17271727
assertThat(
17281728
truncate.valueOf(valueEnv()), allOf(hasType(LONG),
1729-
hasValue(new BigDecimal(value).setScale(1, RoundingMode.DOWN).longValue())));
1729+
hasValue(BigDecimal.valueOf(value).setScale(1, RoundingMode.DOWN).longValue())));
17301730
assertEquals(String.format("truncate(%s, 1)", value), truncate.toString());
17311731
}
17321732

17331733
/**
17341734
* Test truncate with long value.
17351735
*/
17361736
@ParameterizedTest(name = "truncate({0}, {1})")
1737-
@ValueSource(longs = {2L, -2L})
1737+
@ValueSource(longs = {2L, -2L, Long.MAX_VALUE, Long.MIN_VALUE})
17381738
public void truncate_long_value(Long value) {
17391739
FunctionExpression truncate = DSL.truncate(DSL.literal(value), DSL.literal(1));
17401740
assertThat(
17411741
truncate.valueOf(valueEnv()), allOf(hasType(LONG),
1742-
hasValue(new BigDecimal(value).setScale(1, RoundingMode.DOWN).longValue())));
1742+
hasValue(BigDecimal.valueOf(value).setScale(1, RoundingMode.DOWN).longValue())));
17431743
assertEquals(String.format("truncate(%s, 1)", value), truncate.toString());
17441744
}
17451745

17461746
/**
17471747
* Test truncate with float value.
17481748
*/
17491749
@ParameterizedTest(name = "truncate({0}, {1})")
1750-
@ValueSource(floats = {2F, -2F})
1750+
@ValueSource(floats = {2F, -2F, Float.MAX_VALUE, Float.MIN_VALUE})
17511751
public void truncate_float_value(Float value) {
17521752
FunctionExpression truncate = DSL.truncate(DSL.literal(value), DSL.literal(1));
17531753
assertThat(
17541754
truncate.valueOf(valueEnv()), allOf(hasType(DOUBLE),
1755-
hasValue(new BigDecimal(value).setScale(1, RoundingMode.DOWN).doubleValue())));
1755+
hasValue(BigDecimal.valueOf(value).setScale(1, RoundingMode.DOWN).doubleValue())));
17561756
assertEquals(String.format("truncate(%s, 1)", value), truncate.toString());
17571757
}
17581758

17591759
/**
17601760
* Test truncate with double value.
17611761
*/
17621762
@ParameterizedTest(name = "truncate({0}, {1})")
1763-
@ValueSource(doubles = {2D, -2D})
1763+
@ValueSource(doubles = {2D, -9.223372036854776e+18D, -2147483649.0D, -2147483648.0D,
1764+
-32769.0D, -32768.0D, -34.84D, -2.0D, -1.2D, -1.0D, 0.0D, 1.0D,
1765+
1.3D, 2.0D, 1004.3D, 32767.0D, 32768.0D, 2147483647.0D, 2147483648.0D,
1766+
9.223372036854776e+18D, Double.MAX_VALUE, Double.MIN_VALUE})
17641767
public void truncate_double_value(Double value) {
17651768
FunctionExpression truncate = DSL.truncate(DSL.literal(value), DSL.literal(1));
17661769
assertThat(
17671770
truncate.valueOf(valueEnv()), allOf(hasType(DOUBLE),
1768-
hasValue(new BigDecimal(value).setScale(1, RoundingMode.DOWN).doubleValue())));
1771+
hasValue(BigDecimal.valueOf(value).setScale(1, RoundingMode.DOWN).doubleValue())));
17691772
assertEquals(String.format("truncate(%s, 1)", value), truncate.toString());
17701773
}
17711774

integ-test/src/test/java/org/opensearch/sql/sql/MathematicalFunctionIT.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,30 @@ public void testTruncate() throws IOException {
142142
result = executeQuery("select truncate(-56, -1)");
143143
verifySchema(result, schema("truncate(-56, -1)", null, "long"));
144144
verifyDataRows(result, rows(-50));
145+
146+
result = executeQuery("select truncate(33.33344, -1)");
147+
verifySchema(result, schema("truncate(33.33344, -1)", null, "double"));
148+
verifyDataRows(result, rows(30.0));
149+
150+
result = executeQuery("select truncate(33.33344, 2)");
151+
verifySchema(result, schema("truncate(33.33344, 2)", null, "double"));
152+
verifyDataRows(result, rows(33.33));
153+
154+
result = executeQuery("select truncate(33.33344, 100)");
155+
verifySchema(result, schema("truncate(33.33344, 100)", null, "double"));
156+
verifyDataRows(result, rows(33.33344));
157+
158+
result = executeQuery("select truncate(33.33344, 0)");
159+
verifySchema(result, schema("truncate(33.33344, 0)", null, "double"));
160+
verifyDataRows(result, rows(33.0));
161+
162+
result = executeQuery("select truncate(33.33344, 4)");
163+
verifySchema(result, schema("truncate(33.33344, 4)", null, "double"));
164+
verifyDataRows(result, rows(33.3334));
165+
166+
result = executeQuery(String.format("select truncate(%s, 6)", Math.PI));
167+
verifySchema(result, schema(String.format("truncate(%s, 6)", Math.PI), null, "double"));
168+
verifyDataRows(result, rows(3.141592));
145169
}
146170

147171
@Test

0 commit comments

Comments
 (0)