Skip to content

Commit 11ae8af

Browse files
authored
Merge pull request #38 from sidhant92/array_math_functions
remove logging and add info to errors
2 parents 1890a67 + 2824651 commit 11ae8af

14 files changed

+51
-78
lines changed

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ repositories {
3131
}
3232

3333
dependencies {
34-
implementation 'ch.qos.logback:logback-classic:1.2.3'
3534
implementation 'org.apache.maven:maven-artifact:3.5.2'
3635
implementation 'org.antlr:antlr4-runtime:4.13.1'
3736
implementation 'io.vavr:vavr:0.10.4'

src/main/java/com/github/sidhant92/boolparser/application/ArithmeticExpressionEvaluator.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,11 @@
1919
import com.github.sidhant92.boolparser.parser.BoolExpressionParser;
2020
import com.github.sidhant92.boolparser.util.ValueUtils;
2121
import io.vavr.control.Try;
22-
import lombok.extern.slf4j.Slf4j;
2322

2423
/**
2524
* @author sidhant.aggarwal
2625
* @since 15/03/2024
2726
*/
28-
@Slf4j
2927
public class ArithmeticExpressionEvaluator {
3028
private final BoolExpressionParser boolExpressionParser;
3129

@@ -59,14 +57,13 @@ private Object evaluateToken(final Node node, final Map<String, Object> data) {
5957
case FIELD:
6058
return evaluateFieldToken((FieldNode) node, data);
6159
default:
62-
log.error("unsupported token {}", node.getTokenType());
63-
throw new UnsupportedToken();
60+
throw new UnsupportedToken(node.getTokenType().name());
6461
}
6562
}
6663

6764
private Object evaluateFieldToken(final FieldNode fieldNode, final Map<String, Object> data) {
6865
if (!data.containsKey(fieldNode.getField())) {
69-
throw new DataNotFoundException();
66+
throw new DataNotFoundException(fieldNode.getField());
7067
}
7168
return data.get(fieldNode.getField());
7269
}

src/main/java/com/github/sidhant92/boolparser/application/BooleanExpressionEvaluator.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,11 @@
2222
import com.github.sidhant92.boolparser.parser.BoolExpressionParser;
2323
import com.github.sidhant92.boolparser.util.ValueUtils;
2424
import io.vavr.control.Try;
25-
import lombok.extern.slf4j.Slf4j;
2625

2726
/**
2827
* @author sidhant.aggarwal
2928
* @since 07/02/2023
3029
*/
31-
@Slf4j
3230
public class BooleanExpressionEvaluator {
3331
private final BoolExpressionParser boolExpressionParser;
3432

@@ -71,22 +69,25 @@ private boolean evaluateToken(final Node node, final Map<String, Object> data) {
7169
}
7270

7371
private boolean evaluateComparisonToken(final ComparisonNode comparisonToken, final Map<String, Object> data) {
74-
final Object fieldData = ValueUtils.getValueFromMap(comparisonToken.getField(), data).orElseThrow(DataNotFoundException::new);
72+
final Object fieldData = ValueUtils.getValueFromMap(comparisonToken.getField(), data)
73+
.orElseThrow(() -> new DataNotFoundException(comparisonToken.getField()));
7574
final Object value = comparisonToken.getValue() instanceof ArithmeticBaseNode ? arithmeticExpressionEvaluator.evaluate(
7675
comparisonToken.getValue(), data) : comparisonToken.getValue();
7776
return operatorService.evaluateLogicalOperator(comparisonToken.getOperator(), ContainerDataType.PRIMITIVE, comparisonToken.getDataType(),
7877
fieldData, value);
7978
}
8079

8180
private boolean evaluateNumericRangeToken(final NumericRangeNode numericRangeToken, final Map<String, Object> data) {
82-
final Object fieldData = ValueUtils.getValueFromMap(numericRangeToken.getField(), data).orElseThrow(DataNotFoundException::new);
81+
final Object fieldData = ValueUtils.getValueFromMap(numericRangeToken.getField(), data)
82+
.orElseThrow(() -> new DataNotFoundException(numericRangeToken.getField()));
8383
return operatorService.evaluateLogicalOperator(Operator.GREATER_THAN_EQUAL, ContainerDataType.PRIMITIVE, numericRangeToken.getFromDataType(),
8484
fieldData, numericRangeToken.getFromValue()) && operatorService.evaluateLogicalOperator(
8585
Operator.LESS_THAN_EQUAL, ContainerDataType.PRIMITIVE, numericRangeToken.getToDataType(), fieldData, numericRangeToken.getToValue());
8686
}
8787

8888
private boolean evaluateInToken(final InNode inToken, final Map<String, Object> data) {
89-
final Object fieldData = ValueUtils.getValueFromMap(inToken.getField(), data).orElseThrow(DataNotFoundException::new);
89+
final Object fieldData = ValueUtils.getValueFromMap(inToken.getField(), data)
90+
.orElseThrow(() -> new DataNotFoundException(inToken.getField()));
9091
final List<EvaluatedNode> items = resolveArrayElements(inToken.getItems(), data);
9192
final DataType dataType = ValueUtils.getDataType(fieldData);
9293
final Object[] values = items
@@ -109,7 +110,8 @@ private List<EvaluatedNode> resolveArrayElements(final List<Node> items, final M
109110
}
110111

111112
private boolean evaluateArrayToken(final ArrayNode arrayNode, final Map<String, Object> data) {
112-
final Object fieldData = ValueUtils.getValueFromMap(arrayNode.getField(), data).orElseThrow(DataNotFoundException::new);
113+
final Object fieldData = ValueUtils.getValueFromMap(arrayNode.getField(), data)
114+
.orElseThrow(() -> new DataNotFoundException(arrayNode.getField()));
113115
final List<EvaluatedNode> items = resolveArrayElements(arrayNode.getItems(), data);
114116
if (items
115117
.stream()
@@ -127,7 +129,8 @@ private boolean evaluateUnaryToken(final UnaryNode unaryToken, final Map<String,
127129
if (unaryToken.getDataType().equals(DataType.BOOLEAN)) {
128130
return (boolean) unaryToken.getValue();
129131
}
130-
final Object fieldData = ValueUtils.getValueFromMap(unaryToken.getValue().toString(), data).orElseThrow(DataNotFoundException::new);
132+
final Object fieldData = ValueUtils.getValueFromMap(unaryToken.getValue().toString(), data)
133+
.orElseThrow(() -> new DataNotFoundException(unaryToken.getValue().toString()));
131134
if (!(fieldData instanceof Boolean)) {
132135
throw new InvalidUnaryOperand();
133136
}

src/main/java/com/github/sidhant92/boolparser/constant/ContainerDataType.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,19 @@
1010
import com.github.sidhant92.boolparser.exception.InvalidDataType;
1111
import lombok.AllArgsConstructor;
1212
import lombok.Getter;
13-
import lombok.extern.slf4j.Slf4j;
1413

1514
/**
1615
* @author sidhant.aggarwal
1716
* @since 05/02/2023
1817
*/
1918
@Getter
2019
@AllArgsConstructor
21-
@Slf4j
2220
public enum ContainerDataType {
2321
PRIMITIVE() {
2422
@Override
2523
public <T> Optional<T> getValue(final DataType dataType, final Object value) {
2624
final Optional<T> result = DataTypeFactory.getDataType(dataType).getValue(value);
2725
if (!result.isPresent()) {
28-
log.error("Invalid data type for value {} for data type {}", value.toString(), dataType.name());
2926
throw new InvalidDataType(String.format("Invalid data type for value %s for data type %s", value, dataType.name()));
3027
}
3128
return result;

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
import java.util.Optional;
44
import com.github.sidhant92.boolparser.constant.DataType;
5-
import lombok.extern.slf4j.Slf4j;
65

76
/**
87
* @author sidhant.aggarwal
98
* @since 05/03/2023
109
*/
11-
@Slf4j
1210
public abstract class AbstractDataType<T extends Comparable<? super T>> {
1311
private final Class<T> clazz;
1412

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package com.github.sidhant92.boolparser.exception;
22

33
public class DataNotFoundException extends RuntimeException {
4+
private static final String MESSAGE = "Data not found";
5+
6+
public DataNotFoundException(final String key) {
7+
super(String.format(MESSAGE + " for the key %s", key));
8+
}
9+
410
@Override
511
public String getMessage() {
6-
return "Data not found";
12+
return MESSAGE;
713
}
814
}

src/main/java/com/github/sidhant92/boolparser/exception/InvalidExpressionException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package com.github.sidhant92.boolparser.exception;
22

33
public class InvalidExpressionException extends RuntimeException {
4+
public InvalidExpressionException(final String message) {
5+
super(message);
6+
}
7+
48
@Override
59
public String getMessage() {
610
return "Invalid Expression";
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.github.sidhant92.boolparser.exception;
22

33
public class UnsupportedToken extends RuntimeException {
4-
public UnsupportedToken(final String message) {
5-
super(message);
4+
private static final String MESSAGE = "Unsupported Token";
5+
6+
public UnsupportedToken(final String token) {
7+
super(String.format(MESSAGE + " %s", token));
68
}
79

810
public UnsupportedToken() {
@@ -11,6 +13,6 @@ public UnsupportedToken() {
1113

1214
@Override
1315
public String getMessage() {
14-
return "Unsupported Token";
16+
return MESSAGE;
1517
}
1618
}

src/main/java/com/github/sidhant92/boolparser/function/FunctionEvaluatorService.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@
1010
import com.github.sidhant92.boolparser.exception.InvalidDataType;
1111
import com.github.sidhant92.boolparser.exception.InvalidExpressionException;
1212
import com.github.sidhant92.boolparser.function.arithmetic.AbstractFunction;
13-
import lombok.extern.slf4j.Slf4j;
1413

1514
/**
1615
* @author sidhant.aggarwal
1716
* @since 21/05/2024
1817
*/
19-
@Slf4j
2018
public class FunctionEvaluatorService {
2119
public FunctionEvaluatorService() {
2220
FunctionFactory.initialize();
@@ -25,25 +23,23 @@ public FunctionEvaluatorService() {
2523
public Object evaluateArithmeticFunction(final FunctionType functionType, final List<EvaluatedNode> items) {
2624
final AbstractFunction abstractFunction = FunctionFactory.getArithmeticFunction(functionType);
2725
if (items.isEmpty()) {
28-
log.error("Empty items not allowed");
29-
throw new InvalidExpressionException();
26+
throw new InvalidExpressionException("Empty items not allowed");
3027
}
3128
final ContainerDataType containerDataType = items.size() > 1 ? ContainerDataType.LIST : ContainerDataType.PRIMITIVE;
3229
if (!abstractFunction.getAllowedContainerTypes().contains(containerDataType)) {
33-
log.error("Invalid container type {} for function {}", containerDataType, functionType.name());
34-
throw new InvalidContainerTypeException();
30+
throw new InvalidContainerTypeException(
31+
String.format("Invalid container type %s for function %s", containerDataType, functionType.name()));
3532
}
3633
final boolean validDataType = items
3734
.stream().allMatch(item -> abstractFunction.getAllowedDataTypes().contains(item.getDataType()));
3835
if (!validDataType) {
39-
log.error("Invalid data type {} for function {}", items, functionType.name());
40-
throw new InvalidDataType();
36+
throw new InvalidDataType(String.format("Invalid data type for function %s", functionType.name()));
4137
}
4238

4339
items.forEach(item -> {
4440
if (!ContainerDataType.PRIMITIVE.isValid(item.getDataType(), item.getValue())) {
45-
log.error("Validation failed for the function {} for the operand {}", functionType.name(), item.getValue());
46-
throw new InvalidDataType();
41+
throw new InvalidDataType(
42+
String.format("Validation failed for the function %s for the operand %s", functionType.name(), item.getValue()));
4743
}
4844
});
4945
return abstractFunction.evaluate(items);

src/main/java/com/github/sidhant92/boolparser/operator/OperatorService.java

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@
88
import com.github.sidhant92.boolparser.exception.InvalidContainerTypeException;
99
import com.github.sidhant92.boolparser.exception.InvalidDataType;
1010
import com.github.sidhant92.boolparser.operator.logical.AbstractOperator;
11-
import lombok.extern.slf4j.Slf4j;
1211

1312
/**
1413
* @author sidhant.aggarwal
1514
* @since 05/03/2023
1615
*/
17-
@Slf4j
1816
public class OperatorService {
1917
public OperatorService() {
2018
DataTypeFactory.initialize();
@@ -25,16 +23,13 @@ public boolean evaluateLogicalOperator(final Operator operator, final ContainerD
2523
final Object leftOperand, final Object... rightOperands) {
2624
final AbstractOperator abstractOperator = OperatorFactory.getLogicalOperator(operator);
2725
if (!abstractOperator.getAllowedContainerTypes().contains(containerDataType)) {
28-
log.error("Invalid left container type {} for operator {}", containerDataType, operator);
29-
throw new InvalidContainerTypeException();
26+
throw new InvalidContainerTypeException(String.format("Invalid left container type %s for operator %s", containerDataType, operator));
3027
}
3128
if (!abstractOperator.getAllowedDataTypes().contains(dataType)) {
32-
log.error("Invalid left operand data type {} for operator {}", dataType, operator);
33-
throw new InvalidDataType();
29+
throw new InvalidDataType(String.format("Invalid left operand data type %s for operator %s", dataType, operator));
3430
}
3531
if (!containerDataType.isValid(dataType, leftOperand)) {
36-
log.error("Validation failed for the operator {} for the operand {}", operator, leftOperand);
37-
throw new InvalidDataType();
32+
throw new InvalidDataType(String.format("Validation failed for the operator %s for the operand %s", operator, leftOperand));
3833
}
3934
return OperatorFactory.getLogicalOperator(operator).evaluate(containerDataType, dataType, leftOperand, rightOperands);
4035
}
@@ -43,24 +38,19 @@ public Object evaluateArithmeticOperator(final Object leftOperand, final DataTyp
4338
final DataType rightDataType, final Operator operator, final ContainerDataType containerDataType) {
4439
final com.github.sidhant92.boolparser.operator.arithmetic.AbstractOperator abstractOperator = OperatorFactory.getArithmeticOperator(operator);
4540
if (!abstractOperator.getAllowedContainerTypes().contains(containerDataType)) {
46-
log.error("Invalid left container type {} for operator {}", containerDataType, operator);
47-
throw new InvalidContainerTypeException();
41+
throw new InvalidContainerTypeException(String.format("Invalid left container type %s for operator %s", containerDataType, operator));
4842
}
4943
if (!abstractOperator.getAllowedDataTypes().contains(leftDataType)) {
50-
log.error("Invalid left operand data type {} for operator {}", leftDataType, operator);
51-
throw new InvalidDataType();
44+
throw new InvalidDataType(String.format("Invalid left operand data type %s for operator %s", leftDataType, operator));
5245
}
5346
if (!containerDataType.isValid(leftDataType, leftOperand)) {
54-
log.error("Validation failed for the operator {} for the operand {}", operator, leftOperand);
55-
throw new InvalidDataType();
47+
throw new InvalidDataType(String.format("Validation failed for the operator %s for the operand %s", operator, leftOperand));
5648
}
5749
if (Objects.nonNull(rightDataType) && !abstractOperator.getAllowedDataTypes().contains(rightDataType)) {
58-
log.error("Invalid left operand data type {} for operator {}", rightDataType, operator);
59-
throw new InvalidDataType();
50+
throw new InvalidDataType(String.format("Invalid left operand data type %s for operator %s", rightDataType, operator));
6051
}
6152
if (Objects.nonNull(rightOperand) && !containerDataType.isValid(rightDataType, rightOperand)) {
62-
log.error("Validation failed for the operator {} for the operand {}", operator, rightDataType);
63-
throw new InvalidDataType();
53+
throw new InvalidDataType(String.format("Validation failed for the operator %s for the operand %s", operator, rightDataType));
6454
}
6555
return OperatorFactory.getArithmeticOperator(operator).evaluate(leftOperand, leftDataType, rightOperand, rightDataType);
6656
}

src/main/java/com/github/sidhant92/boolparser/operator/logical/ContainsAllOperator.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,15 @@
77
import com.github.sidhant92.boolparser.constant.DataType;
88
import com.github.sidhant92.boolparser.constant.Operator;
99
import lombok.AllArgsConstructor;
10-
import lombok.extern.slf4j.Slf4j;
1110

1211
@AllArgsConstructor
13-
@Slf4j
1412
public class ContainsAllOperator extends AbstractOperator {
1513
private final InOperator inOperator;
1614

1715
@Override
1816
public <T extends Comparable<? super T>> boolean evaluate(final ContainerDataType containerDataType, final DataType dataType,
1917
final Object leftOperand, final Object... rightOperands) {
2018
if (!containerDataType.isValid(dataType, leftOperand)) {
21-
log.error("Validation failed for any operator for the operand {}", leftOperand);
2219
return false;
2320
}
2421
final Object[] leftOperandArray = ((List<?>) leftOperand).toArray();

src/main/java/com/github/sidhant92/boolparser/operator/logical/ContainsAnyOperator.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,15 @@
77
import com.github.sidhant92.boolparser.constant.DataType;
88
import com.github.sidhant92.boolparser.constant.Operator;
99
import lombok.AllArgsConstructor;
10-
import lombok.extern.slf4j.Slf4j;
1110

1211
@AllArgsConstructor
13-
@Slf4j
1412
public class ContainsAnyOperator extends AbstractOperator {
1513
private final InOperator inOperator;
1614

1715
@Override
1816
public <T extends Comparable<? super T>> boolean evaluate(final ContainerDataType containerDataType, final DataType dataType,
1917
final Object leftOperand, final Object... rightOperands) {
2018
if (!containerDataType.isValid(dataType, leftOperand)) {
21-
log.error("Validation failed for any operator for the operand {}", leftOperand);
2219
return false;
2320
}
2421
final Object[] leftOperandArray = ((List<?>) leftOperand).toArray();

0 commit comments

Comments
 (0)