Skip to content

Commit 1d62964

Browse files
authored
Merge pull request #46 from sidhant92/bigdecimal
For Decimal Use BigDecimal
2 parents 0aea20b + a2fe377 commit 1d62964

File tree

22 files changed

+235
-121
lines changed

22 files changed

+235
-121
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,13 @@ The following Data Types are supported:
151151
5. Boolean
152152
6. Semantic Version
153153

154+
---
155+
**NOTE**
156+
157+
Decimal will internally use BigDecimal for storage.
158+
159+
---
160+
154161
Usage examples:
155162

156163
Simple Numerical Comparison

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ dependencies {
3636
implementation 'io.vavr:vavr:0.10.4'
3737
implementation 'com.github.ben-manes.caffeine:caffeine:2.9.3'
3838
implementation 'org.projectlombok:lombok:1.18.26'
39-
implementation 'org.apache.commons:commons-math3:3.6.1'
4039

4140
annotationProcessor 'org.projectlombok:lombok:1.18.26'
4241
testAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.36'

src/main/java/com/github/sidhant92/boolparser/datatype/DecimalDataType.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package com.github.sidhant92.boolparser.datatype;
22

3+
import java.math.BigDecimal;
34
import java.util.Optional;
45
import com.github.sidhant92.boolparser.constant.DataType;
56

67
/**
78
* @author sidhant.aggarwal
89
* @since 05/03/2023
910
*/
10-
public class DecimalDataType extends AbstractDataType<Double> {
11+
public class DecimalDataType extends AbstractDataType<BigDecimal> {
1112
public DecimalDataType() {
12-
super(Double.class);
13+
super(BigDecimal.class);
1314
}
1415

1516
@Override
@@ -22,7 +23,7 @@ public boolean isValid(final Object value) {
2223
boolean isValid = super.defaultIsValid(value);
2324
if (!isValid) {
2425
try {
25-
Double.parseDouble(value.toString());
26+
new BigDecimal(value.toString());
2627
return true;
2728
} catch (Exception ex) {
2829
return false;
@@ -40,13 +41,13 @@ public boolean isValid(final Object value, final boolean useStrictValidation) {
4041
}
4142

4243
@Override
43-
public Optional<Double> getValue(Object value) {
44-
final Optional<Double> result = defaultGetValue(value);
44+
public Optional<BigDecimal> getValue(Object value) {
45+
final Optional<BigDecimal> result = defaultGetValue(value);
4546
if (result.isPresent()) {
4647
return result;
4748
}
4849
try {
49-
return Optional.of(Double.parseDouble(value.toString()));
50+
return Optional.of(new BigDecimal(value.toString()));
5051
} catch (final Exception ignored) {
5152
}
5253
return Optional.empty();

src/main/java/com/github/sidhant92/boolparser/function/arithmetic/AvgFunction.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package com.github.sidhant92.boolparser.function.arithmetic;
22

3+
import java.math.BigDecimal;
4+
import java.math.RoundingMode;
35
import java.util.Arrays;
46
import java.util.Collections;
57
import java.util.List;
6-
import org.apache.commons.lang3.tuple.Pair;
8+
import java.util.Optional;
9+
import java.util.stream.Collectors;
710
import com.github.sidhant92.boolparser.constant.ContainerDataType;
811
import com.github.sidhant92.boolparser.constant.DataType;
912
import com.github.sidhant92.boolparser.constant.FunctionType;
13+
import com.github.sidhant92.boolparser.datatype.DataTypeFactory;
14+
import com.github.sidhant92.boolparser.datatype.DecimalDataType;
15+
import com.github.sidhant92.boolparser.datatype.LongDataType;
1016
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
1117
import com.github.sidhant92.boolparser.util.ValueUtils;
1218

@@ -19,16 +25,20 @@ public class AvgFunction extends AbstractFunction {
1925
public Object evaluate(final List<EvaluatedNode> items) {
2026
if (items
2127
.stream().anyMatch(a -> a.getDataType().equals(DataType.DECIMAL))) {
22-
return ValueUtils.caseDouble(items
23-
.stream().mapToDouble(a -> Double.parseDouble(a.getValue().toString())).average().getAsDouble());
28+
final DecimalDataType decimalDataType = (DecimalDataType) DataTypeFactory.getDataType(DataType.DECIMAL);
29+
final List<BigDecimal> itemsConverted = items
30+
.stream()
31+
.map(item -> decimalDataType.getValue(item.getValue()))
32+
.map(Optional::get)
33+
.collect(Collectors.toList());
34+
final BigDecimal sum = itemsConverted
35+
.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
36+
return ValueUtils.castDecimal(sum.divide(new BigDecimal(itemsConverted.size()), 3, RoundingMode.DOWN));
2437
}
25-
if (items
26-
.stream().anyMatch(a -> a.getDataType().equals(DataType.LONG))) {
27-
return ValueUtils.caseDouble(items
28-
.stream().mapToLong(a -> Long.parseLong(a.getValue().toString())).average().getAsDouble());
29-
}
30-
return ValueUtils.caseDouble(items
31-
.stream().mapToInt(a -> Integer.parseInt(a.getValue().toString())).average().getAsDouble());
38+
final LongDataType longDataType = (LongDataType) DataTypeFactory.getDataType(DataType.LONG);
39+
final long sum = items
40+
.stream().mapToLong(a -> longDataType.getValue(a.getValue()).get()).sum();
41+
return ValueUtils.castDecimal(new BigDecimal(sum).divide(new BigDecimal(items.size()), 2, RoundingMode.UNNECESSARY));
3242
}
3343

3444
@Override

src/main/java/com/github/sidhant92/boolparser/function/arithmetic/IntFunction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.github.sidhant92.boolparser.function.arithmetic;
22

3+
import java.math.BigDecimal;
34
import java.util.Arrays;
45
import java.util.Collections;
56
import java.util.List;
6-
import org.apache.commons.lang3.tuple.Pair;
77
import com.github.sidhant92.boolparser.constant.ContainerDataType;
88
import com.github.sidhant92.boolparser.constant.DataType;
99
import com.github.sidhant92.boolparser.constant.FunctionType;
10+
import com.github.sidhant92.boolparser.datatype.DataTypeFactory;
1011
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
1112

1213
/**
@@ -18,7 +19,7 @@ public class IntFunction extends AbstractFunction {
1819
public Object evaluate(final List<EvaluatedNode> items) {
1920
final EvaluatedNode item = items.get(0);
2021
if (item.getDataType() == DataType.DECIMAL) {
21-
return ((Double) item.getValue()).intValue();
22+
return ((BigDecimal) DataTypeFactory.getDataType(DataType.DECIMAL).getValue(item.getValue()).get()).intValue();
2223
}
2324
if (item.getDataType() == DataType.LONG) {
2425
return ((Long) item.getValue()).intValue();

src/main/java/com/github/sidhant92/boolparser/function/arithmetic/LenFunction.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.Arrays;
44
import java.util.List;
5-
import org.apache.commons.lang3.tuple.Pair;
65
import com.github.sidhant92.boolparser.constant.ContainerDataType;
76
import com.github.sidhant92.boolparser.constant.DataType;
87
import com.github.sidhant92.boolparser.constant.FunctionType;

src/main/java/com/github/sidhant92/boolparser/function/arithmetic/MaxFunction.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
package com.github.sidhant92.boolparser.function.arithmetic;
22

3+
import java.math.BigDecimal;
34
import java.util.Arrays;
45
import java.util.Collections;
6+
import java.util.Comparator;
57
import java.util.List;
6-
import org.apache.commons.lang3.tuple.Pair;
8+
import java.util.Optional;
9+
import java.util.stream.Collectors;
710
import com.github.sidhant92.boolparser.constant.ContainerDataType;
811
import com.github.sidhant92.boolparser.constant.DataType;
912
import com.github.sidhant92.boolparser.constant.FunctionType;
13+
import com.github.sidhant92.boolparser.datatype.DataTypeFactory;
14+
import com.github.sidhant92.boolparser.datatype.DecimalDataType;
15+
import com.github.sidhant92.boolparser.datatype.IntegerDataType;
16+
import com.github.sidhant92.boolparser.datatype.LongDataType;
1017
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
1118
import com.github.sidhant92.boolparser.util.ValueUtils;
1219

@@ -19,16 +26,25 @@ public class MaxFunction extends AbstractFunction {
1926
public Object evaluate(final List<EvaluatedNode> items) {
2027
if (items
2128
.stream().anyMatch(a -> a.getDataType().equals(DataType.DECIMAL))) {
22-
return ValueUtils.caseDouble(items
23-
.stream().mapToDouble(a -> Double.parseDouble(a.getValue().toString())).max().getAsDouble());
29+
final DecimalDataType decimalDataType = (DecimalDataType) DataTypeFactory.getDataType(DataType.DECIMAL);
30+
final List<BigDecimal> itemsConverted = items
31+
.stream()
32+
.map(item -> decimalDataType.getValue(item.getValue()))
33+
.map(Optional::get)
34+
.collect(Collectors.toList());
35+
final BigDecimal max = itemsConverted
36+
.stream().max(Comparator.naturalOrder()).get();
37+
return ValueUtils.castDecimal(max);
2438
}
2539
if (items
2640
.stream().anyMatch(a -> a.getDataType().equals(DataType.LONG))) {
27-
return ValueUtils.caseDouble(items
28-
.stream().mapToLong(a -> Long.parseLong(a.getValue().toString())).max().getAsLong());
41+
final LongDataType longDataType = (LongDataType) DataTypeFactory.getDataType(DataType.LONG);
42+
return ValueUtils.castDecimal(items
43+
.stream().mapToLong(a -> longDataType.getValue(a.getValue()).get()).max().getAsLong());
2944
}
30-
return ValueUtils.caseDouble(items
31-
.stream().mapToInt(a -> Integer.parseInt(a.getValue().toString())).max().getAsInt());
45+
final IntegerDataType integerDataType = (IntegerDataType) DataTypeFactory.getDataType(DataType.INTEGER);
46+
return ValueUtils.castDecimal(items
47+
.stream().mapToInt(a -> integerDataType.getValue(a.getValue()).get()).max().getAsInt());
3248
}
3349

3450
@Override

src/main/java/com/github/sidhant92/boolparser/function/arithmetic/MeanFunction.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,11 @@
33
import java.util.Arrays;
44
import java.util.Collections;
55
import java.util.List;
6-
import org.apache.commons.lang3.tuple.Pair;
7-
import org.apache.commons.math3.stat.StatUtils;
8-
import org.apache.commons.math3.stat.descriptive.moment.Mean;
96
import com.github.sidhant92.boolparser.constant.ContainerDataType;
107
import com.github.sidhant92.boolparser.constant.DataType;
118
import com.github.sidhant92.boolparser.constant.FunctionType;
129
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
13-
import com.github.sidhant92.boolparser.util.ValueUtils;
10+
import com.github.sidhant92.boolparser.function.FunctionFactory;
1411

1512
/**
1613
* @author sidhant.aggarwal
@@ -19,9 +16,7 @@
1916
public class MeanFunction extends AbstractFunction {
2017
@Override
2118
public Object evaluate(final List<EvaluatedNode> items) {
22-
final double mean = StatUtils.mean(items
23-
.stream().mapToDouble(a -> Double.parseDouble(a.getValue().toString())).toArray());
24-
return ValueUtils.caseDouble(mean);
19+
return FunctionFactory.getArithmeticFunction(FunctionType.AVG).evaluate(items);
2520
}
2621

2722
@Override

src/main/java/com/github/sidhant92/boolparser/function/arithmetic/MedianFunction.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.github.sidhant92.boolparser.function.arithmetic;
22

3+
import java.math.BigDecimal;
34
import java.util.Arrays;
45
import java.util.Collections;
56
import java.util.List;
6-
import org.apache.commons.lang3.tuple.Pair;
7-
import org.apache.commons.math3.stat.descriptive.rank.Median;
7+
import java.util.Optional;
8+
import java.util.stream.Collectors;
89
import com.github.sidhant92.boolparser.constant.ContainerDataType;
910
import com.github.sidhant92.boolparser.constant.DataType;
1011
import com.github.sidhant92.boolparser.constant.FunctionType;
12+
import com.github.sidhant92.boolparser.datatype.DataTypeFactory;
13+
import com.github.sidhant92.boolparser.datatype.DecimalDataType;
1114
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
1215
import com.github.sidhant92.boolparser.util.ValueUtils;
1316

@@ -16,17 +19,25 @@
1619
* @since 21/05/2024
1720
*/
1821
public class MedianFunction extends AbstractFunction {
19-
private final Median median;
20-
2122
public MedianFunction() {
22-
this.median = new Median();
2323
}
2424

2525
@Override
2626
public Object evaluate(final List<EvaluatedNode> items) {
27-
final double res = median.evaluate(items
28-
.stream().mapToDouble(a -> Double.parseDouble(a.getValue().toString())).toArray());
29-
return ValueUtils.caseDouble(res);
27+
final DecimalDataType decimalDataType = (DecimalDataType) DataTypeFactory.getDataType(DataType.DECIMAL);
28+
final List<BigDecimal> itemsConverted = items
29+
.stream()
30+
.map(item -> decimalDataType.getValue(item.getValue()))
31+
.map(Optional::get)
32+
.collect(Collectors.toList());
33+
Collections.sort(itemsConverted);
34+
if (items.size() % 2 == 0) {
35+
final BigDecimal res = itemsConverted.get(items.size() / 2).add(itemsConverted.get(items.size() / 2 - 1))
36+
.divide(new BigDecimal("2"), 2, BigDecimal.ROUND_DOWN);
37+
return ValueUtils.castDecimal(res);
38+
} else {
39+
return ValueUtils.castDecimal(itemsConverted.get(items.size() / 2));
40+
}
3041
}
3142

3243
@Override

src/main/java/com/github/sidhant92/boolparser/function/arithmetic/MinFunction.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
package com.github.sidhant92.boolparser.function.arithmetic;
22

3+
import java.math.BigDecimal;
34
import java.util.Arrays;
45
import java.util.Collections;
6+
import java.util.Comparator;
57
import java.util.List;
6-
import org.apache.commons.lang3.tuple.Pair;
8+
import java.util.Optional;
9+
import java.util.stream.Collectors;
710
import com.github.sidhant92.boolparser.constant.ContainerDataType;
811
import com.github.sidhant92.boolparser.constant.DataType;
912
import com.github.sidhant92.boolparser.constant.FunctionType;
13+
import com.github.sidhant92.boolparser.datatype.DataTypeFactory;
14+
import com.github.sidhant92.boolparser.datatype.DecimalDataType;
15+
import com.github.sidhant92.boolparser.datatype.IntegerDataType;
16+
import com.github.sidhant92.boolparser.datatype.LongDataType;
1017
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
1118
import com.github.sidhant92.boolparser.util.ValueUtils;
1219

@@ -19,16 +26,25 @@ public class MinFunction extends AbstractFunction {
1926
public Object evaluate(final List<EvaluatedNode> items) {
2027
if (items
2128
.stream().anyMatch(a -> a.getDataType().equals(DataType.DECIMAL))) {
22-
return ValueUtils.caseDouble(items
23-
.stream().mapToDouble(a -> Double.parseDouble(a.getValue().toString())).min().getAsDouble());
29+
final DecimalDataType decimalDataType = (DecimalDataType) DataTypeFactory.getDataType(DataType.DECIMAL);
30+
final List<BigDecimal> itemsConverted = items
31+
.stream()
32+
.map(item -> decimalDataType.getValue(item.getValue()))
33+
.map(Optional::get)
34+
.collect(Collectors.toList());
35+
final BigDecimal min = itemsConverted
36+
.stream().min(Comparator.naturalOrder()).get();
37+
return ValueUtils.castDecimal(min);
2438
}
2539
if (items
2640
.stream().anyMatch(a -> a.getDataType().equals(DataType.LONG))) {
27-
return ValueUtils.caseDouble(items
28-
.stream().mapToLong(a -> Long.parseLong(a.getValue().toString())).min().getAsLong());
41+
final LongDataType longDataType = (LongDataType) DataTypeFactory.getDataType(DataType.LONG);
42+
return ValueUtils.castDecimal(items
43+
.stream().mapToLong(a -> longDataType.getValue(a.getValue()).get()).min().getAsLong());
2944
}
30-
return ValueUtils.caseDouble(items
31-
.stream().mapToInt(a -> Integer.parseInt(a.getValue().toString())).min().getAsInt());
45+
final IntegerDataType integerDataType = (IntegerDataType) DataTypeFactory.getDataType(DataType.INTEGER);
46+
return ValueUtils.castDecimal(items
47+
.stream().mapToInt(a -> integerDataType.getValue(a.getValue()).get()).min().getAsInt());
3248
}
3349

3450
@Override

0 commit comments

Comments
 (0)