Skip to content

Commit 53d1955

Browse files
committed
code cleanup
1 parent 8ee0809 commit 53d1955

9 files changed

Lines changed: 101 additions & 83 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ InNode
125125
```
126126
private final String field;
127127
128-
private final List<Pair<DataType, Object>> items;
128+
private final List<Node> items;
129129
```
130130

131131

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

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -72,34 +72,17 @@ private Object evaluateArithmeticFunctionToken(final ArithmeticFunctionNode arit
7272
.stream()
7373
.map(item -> evaluate(item, data))
7474
.collect(Collectors.toList());
75-
final List<EvaluatedNode> flattenedValues = new ArrayList<>();
76-
resolvedValues.forEach(value -> {
77-
if (value instanceof EvaluatedNode) {
78-
final EvaluatedNode node = (EvaluatedNode) value;
79-
if (node.getValue() instanceof Collection) {
80-
((Collection<?>) node.getValue()).forEach(
81-
v -> flattenedValues.add(EvaluatedNode.builder().value(v).dataType(ValueUtils.getDataType(v)).build()));
82-
} else {
83-
flattenedValues.add(node);
84-
}
85-
}
86-
if (value instanceof Collection) {
87-
((Collection<?>) value).forEach(
88-
v -> flattenedValues.add(EvaluatedNode.builder().value(v).dataType(ValueUtils.getDataType(v)).build()));
89-
} else {
90-
flattenedValues.add(EvaluatedNode.builder().value(value).dataType(ValueUtils.getDataType(value)).build());
91-
}
92-
});
75+
final List<EvaluatedNode> flattenedValues = ValueUtils.mapToEvaluatedNodes(resolvedValues);
9376
return functionEvaluatorService.evaluateArithmeticFunction(arithmeticFunctionNode.getFunctionType(), flattenedValues);
9477
}
9578

9679
private Object evaluateArithmeticToken(final ArithmeticNode arithmeticNode, final Map<String, Object> data) {
9780
final Object leftValue = evaluateToken(arithmeticNode.getLeft(), data);
9881
if (arithmeticNode.getOperator().equals(Operator.UNARY)) {
9982
if (leftValue instanceof EvaluatedNode) {
100-
final EvaluatedNode leftPair = (EvaluatedNode) leftValue;
101-
return operatorService.evaluateArithmeticOperator(leftPair.getValue(), leftPair.getDataType(), null, null,
102-
arithmeticNode.getOperator(), ContainerDataType.PRIMITIVE);
83+
final EvaluatedNode left = (EvaluatedNode) leftValue;
84+
return operatorService.evaluateArithmeticOperator(left.getValue(), left.getDataType(), null, null, arithmeticNode.getOperator(),
85+
ContainerDataType.PRIMITIVE);
10386
} else {
10487
final DataType leftDataType = ValueUtils.getDataType(leftValue);
10588
return operatorService.evaluateArithmeticOperator(leftValue, leftDataType, null, null, arithmeticNode.getOperator(),
@@ -108,19 +91,19 @@ private Object evaluateArithmeticToken(final ArithmeticNode arithmeticNode, fina
10891
}
10992
final Object rightValue = evaluateToken(arithmeticNode.getRight(), data);
11093
if (leftValue instanceof EvaluatedNode && rightValue instanceof EvaluatedNode) {
111-
final EvaluatedNode leftPair = (EvaluatedNode) leftValue;
112-
final EvaluatedNode rightPair = (EvaluatedNode) rightValue;
113-
return operatorService.evaluateArithmeticOperator(leftPair.getValue(), leftPair.getDataType(), rightPair.getValue(),
114-
rightPair.getDataType(), arithmeticNode.getOperator(), ContainerDataType.PRIMITIVE);
94+
final EvaluatedNode left = (EvaluatedNode) leftValue;
95+
final EvaluatedNode right = (EvaluatedNode) rightValue;
96+
return operatorService.evaluateArithmeticOperator(left.getValue(), left.getDataType(), right.getValue(), right.getDataType(),
97+
arithmeticNode.getOperator(), ContainerDataType.PRIMITIVE);
11598
} else if (leftValue instanceof EvaluatedNode) {
116-
final EvaluatedNode leftPair = (EvaluatedNode) leftValue;
99+
final EvaluatedNode left = (EvaluatedNode) leftValue;
117100
final DataType rightDataType = ValueUtils.getDataType(rightValue);
118-
return operatorService.evaluateArithmeticOperator(leftPair.getValue(), leftPair.getDataType(), rightValue, rightDataType,
101+
return operatorService.evaluateArithmeticOperator(left.getValue(), left.getDataType(), rightValue, rightDataType,
119102
arithmeticNode.getOperator(), ContainerDataType.PRIMITIVE);
120103
} else if (rightValue instanceof EvaluatedNode) {
121-
final EvaluatedNode rightPair = (EvaluatedNode) rightValue;
104+
final EvaluatedNode right = (EvaluatedNode) rightValue;
122105
final DataType leftDataType = ValueUtils.getDataType(leftValue);
123-
return operatorService.evaluateArithmeticOperator(leftValue, leftDataType, rightPair.getValue(), rightPair.getDataType(),
106+
return operatorService.evaluateArithmeticOperator(leftValue, leftDataType, right.getValue(), right.getDataType(),
124107
arithmeticNode.getOperator(), ContainerDataType.PRIMITIVE);
125108
} else {
126109
final DataType leftDataType = ValueUtils.getDataType(leftValue);

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

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package com.github.sidhant92.boolparser.application;
22

3+
import java.util.ArrayList;
4+
import java.util.Collection;
5+
import java.util.List;
36
import java.util.Map;
4-
import org.apache.commons.lang3.tuple.Pair;
7+
import java.util.stream.Collectors;
58
import com.github.sidhant92.boolparser.constant.ContainerDataType;
69
import com.github.sidhant92.boolparser.constant.DataType;
710
import com.github.sidhant92.boolparser.constant.Operator;
811
import com.github.sidhant92.boolparser.domain.ArrayNode;
912
import com.github.sidhant92.boolparser.domain.BooleanNode;
13+
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
1014
import com.github.sidhant92.boolparser.domain.InNode;
1115
import com.github.sidhant92.boolparser.domain.NumericRangeNode;
1216
import com.github.sidhant92.boolparser.domain.ComparisonNode;
1317
import com.github.sidhant92.boolparser.domain.Node;
1418
import com.github.sidhant92.boolparser.domain.UnaryNode;
1519
import com.github.sidhant92.boolparser.domain.arithmetic.ArithmeticBaseNode;
20+
import com.github.sidhant92.boolparser.domain.arithmetic.ArithmeticNode;
1621
import com.github.sidhant92.boolparser.exception.DataNotFoundException;
1722
import com.github.sidhant92.boolparser.exception.HeterogeneousArrayException;
1823
import com.github.sidhant92.boolparser.exception.InvalidUnaryOperand;
@@ -85,24 +90,39 @@ private boolean evaluateNumericRangeToken(final NumericRangeNode numericRangeTok
8590

8691
private boolean evaluateInToken(final InNode inToken, final Map<String, Object> data) {
8792
final Object fieldData = ValueUtils.getValueFromMap(inToken.getField(), data).orElseThrow(DataNotFoundException::new);
93+
final List<EvaluatedNode> items = resolveArrayElements(inToken.getItems(), data);
8894
final DataType dataType = ValueUtils.getDataType(fieldData);
89-
final Object[] values = inToken.getItems()
95+
final Object[] values = items
9096
.stream()
91-
.map(Pair::getRight).toArray();
97+
.map(EvaluatedNode::getValue).toArray();
9298
return operatorService.evaluateLogicalOperator(Operator.IN, ContainerDataType.PRIMITIVE, dataType, fieldData, values);
9399
}
94100

101+
private List<EvaluatedNode> resolveArrayElements(final List<Node> items, final Map<String, Object> data) {
102+
final List<Object> resolvedValues = items
103+
.stream()
104+
.map(item -> {
105+
if (item instanceof ArithmeticBaseNode) {
106+
return arithmeticExpressionEvaluator.evaluate(item, data);
107+
}
108+
return evaluateToken(item, data);
109+
})
110+
.collect(Collectors.toList());
111+
return ValueUtils.mapToEvaluatedNodes(resolvedValues);
112+
}
113+
95114
private boolean evaluateArrayToken(final ArrayNode arrayNode, final Map<String, Object> data) {
96115
final Object fieldData = ValueUtils.getValueFromMap(arrayNode.getField(), data).orElseThrow(DataNotFoundException::new);
97-
if (arrayNode.getItems()
116+
final List<EvaluatedNode> items = resolveArrayElements(arrayNode.getItems(), data);
117+
if (items
98118
.stream()
99-
.map(Pair::getLeft).distinct().count() > 1) {
119+
.map(EvaluatedNode::getDataType).distinct().count() > 1) {
100120
throw new HeterogeneousArrayException();
101121
}
102-
final DataType dataType = arrayNode.getItems().get(0).getLeft();
103-
final Object[] values = arrayNode.getItems()
122+
final DataType dataType = items.get(0).getDataType();
123+
final Object[] values = items
104124
.stream()
105-
.map(Pair::getRight).toArray();
125+
.map(EvaluatedNode::getValue).toArray();
106126
return operatorService.evaluateLogicalOperator(arrayNode.getOperator(), ContainerDataType.LIST, dataType, fieldData, values);
107127
}
108128

src/main/java/com/github/sidhant92/boolparser/domain/ArrayNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class ArrayNode extends Node {
1919

2020
private final Operator operator;
2121

22-
private final List<Pair<DataType, Object>> items;
22+
private final List<Node> items;
2323
@Override
2424
public NodeType getTokenType() {
2525
return NodeType.ARRAY;

src/main/java/com/github/sidhant92/boolparser/domain/InNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
public class InNode extends Node {
1717
private final String field;
1818

19-
private final List<Pair<DataType, Object>> items;
19+
private final List<Node> items;
2020
@Override
2121
public NodeType getTokenType() {
2222
return NodeType.IN;

src/main/java/com/github/sidhant92/boolparser/domain/UnaryNode.java

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

33
import com.github.sidhant92.boolparser.constant.DataType;
44
import com.github.sidhant92.boolparser.constant.NodeType;
5+
import com.github.sidhant92.boolparser.domain.arithmetic.ArithmeticBaseNode;
56
import lombok.AllArgsConstructor;
67
import lombok.Builder;
78
import lombok.Getter;
@@ -11,7 +12,7 @@
1112
@Getter
1213
@Setter
1314
@Builder
14-
public class UnaryNode extends Node {
15+
public class UnaryNode extends ArithmeticBaseNode {
1516
private final DataType dataType;
1617

1718
private final Object value;

src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterListener.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public void exitToExpression(BooleanExpressionParser.ToExpressionContext ctx) {
132132
public void exitArrayExpression(BooleanExpressionParser.ArrayExpressionContext ctx) {
133133
validateField(ctx.field, ctx.getText());
134134
final String field = getField(ctx.field.getText());
135-
final List<Pair<DataType, Object>> items = getArrayElements(ctx.data.children);
135+
final List<Node> items = getArrayElements(ctx.data.children);
136136
final Operator operator = Operator.getOperatorFromSymbol(ctx.op.getText()).orElse(Operator.EQUALS);
137137
currentNodes.add(new ArrayNode(field, operator, items));
138138
super.exitArrayExpression(ctx);
@@ -148,7 +148,7 @@ public void exitArithmeticFunctionExpression(BooleanExpressionParser.ArithmeticF
148148
log.error("Error parsing expression for the string {}", ctx.getText());
149149
return new InvalidExpressionException();
150150
});
151-
final List<Node> items = getArithmeticArrayElements(ctx.data.children);
151+
final List<Node> items = getArrayElements(ctx.data.children);
152152
currentNodes.add(new ArithmeticFunctionNode(functionType, items));
153153
super.exitArithmeticFunctionExpression(ctx);
154154
}
@@ -157,7 +157,7 @@ public void exitArithmeticFunctionExpression(BooleanExpressionParser.ArithmeticF
157157
public void exitInExpression(BooleanExpressionParser.InExpressionContext ctx) {
158158
validateField(ctx.field, ctx.getText());
159159
final String field = getField(ctx.field.getText());
160-
final List<Pair<DataType, Object>> items = getArrayElements(ctx.data.children);
160+
final List<Node> items = getArrayElements(ctx.data.children);
161161
final InNode inNode = new InNode(field, items);
162162
if (Objects.isNull(ctx.not)) {
163163
currentNodes.add(inNode);
@@ -168,19 +168,7 @@ public void exitInExpression(BooleanExpressionParser.InExpressionContext ctx) {
168168
super.exitInExpression(ctx);
169169
}
170170

171-
private List<Pair<DataType, Object>> getArrayElements(final List<ParseTree> trees) {
172-
return trees
173-
.stream()
174-
.filter(child -> child instanceof BooleanExpressionParser.TypesExpressionContext)
175-
.map(child -> {
176-
final DataType dataType = getDataType(((BooleanExpressionParser.TypesExpressionContext) child).start);
177-
final Object value = ValueUtils.convertValue(child.getText(), dataType);
178-
return Pair.of(dataType, value);
179-
})
180-
.collect(Collectors.toList());
181-
}
182-
183-
private List<Node> getArithmeticArrayElements(final List<ParseTree> trees) {
171+
private List<Node> getArrayElements(final List<ParseTree> trees) {
184172
return trees
185173
.stream()
186174
.filter(child -> child instanceof BooleanExpressionParser.TypesExpressionContext)

src/main/java/com/github/sidhant92/boolparser/util/ValueUtils.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.github.sidhant92.boolparser.util;
22

3+
import java.util.ArrayList;
34
import java.util.Arrays;
5+
import java.util.Collection;
6+
import java.util.List;
47
import java.util.Map;
58
import java.util.Optional;
69
import java.util.stream.Collectors;
710
import org.apache.maven.artifact.versioning.ComparableVersion;
811
import com.github.sidhant92.boolparser.constant.DataType;
12+
import com.github.sidhant92.boolparser.domain.EvaluatedNode;
913
import lombok.extern.slf4j.Slf4j;
1014

1115
@Slf4j
@@ -31,6 +35,28 @@ public static Optional<Object> getValueFromMap(final String key, final Map<Strin
3135
return Optional.empty();
3236
}
3337

38+
public static List<EvaluatedNode> mapToEvaluatedNodes(final List<Object> items) {
39+
final List<EvaluatedNode> flattenedValues = new ArrayList<>();
40+
items.forEach(value -> {
41+
if (value instanceof EvaluatedNode) {
42+
final EvaluatedNode node = (EvaluatedNode) value;
43+
if (node.getValue() instanceof Collection) {
44+
((Collection<?>) node.getValue()).forEach(
45+
v -> flattenedValues.add(EvaluatedNode.builder().value(v).dataType(ValueUtils.getDataType(v)).build()));
46+
} else {
47+
flattenedValues.add(node);
48+
}
49+
}
50+
if (value instanceof Collection) {
51+
((Collection<?>) value).forEach(
52+
v -> flattenedValues.add(EvaluatedNode.builder().value(v).dataType(ValueUtils.getDataType(v)).build()));
53+
} else {
54+
flattenedValues.add(EvaluatedNode.builder().value(value).dataType(ValueUtils.getDataType(value)).build());
55+
}
56+
});
57+
return flattenedValues;
58+
}
59+
3460
public static Object convertValue(final String value, final DataType dataType) {
3561
switch (dataType) {
3662
case INTEGER:

src/test/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterBoolParserTest.java

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,10 @@ public void testIntegerList() {
253253
final InNode inToken = (InNode) nodeOptional.get();
254254
assertEquals(inToken.getItems().size(), 2);
255255
assertEquals(inToken.getField(), "age");
256-
assertEquals(inToken.getItems().get(0).getKey(), DataType.INTEGER);
257-
assertEquals(inToken.getItems().get(1).getKey(), DataType.INTEGER);
258-
assertEquals(inToken.getItems().get(0).getValue(), 12);
259-
assertEquals(inToken.getItems().get(1).getValue(), 45);
256+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getDataType(), DataType.INTEGER);
257+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getDataType(), DataType.INTEGER);
258+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getValue(), 12);
259+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getValue(), 45);
260260
}
261261

262262
@Test
@@ -270,10 +270,10 @@ public void testNotIntegerList() {
270270
final InNode inToken = (InNode) ((BooleanNode) nodeOptional.get()).getLeft();
271271
assertEquals(inToken.getItems().size(), 2);
272272
assertEquals(inToken.getField(), "age");
273-
assertEquals(inToken.getItems().get(0).getKey(), DataType.INTEGER);
274-
assertEquals(inToken.getItems().get(1).getKey(), DataType.INTEGER);
275-
assertEquals(inToken.getItems().get(0).getValue(), 12);
276-
assertEquals(inToken.getItems().get(1).getValue(), 45);
273+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getDataType(), DataType.INTEGER);
274+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getDataType(), DataType.INTEGER);
275+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getValue(), 12);
276+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getValue(), 45);
277277
}
278278

279279
@Test
@@ -284,12 +284,12 @@ public void testStringList() {
284284
final InNode inToken = (InNode) nodeOptional.get();
285285
assertEquals(inToken.getItems().size(), 3);
286286
assertEquals(inToken.getField(), "name");
287-
assertEquals(inToken.getItems().get(0).getKey(), DataType.STRING);
288-
assertEquals(inToken.getItems().get(1).getKey(), DataType.STRING);
289-
assertEquals(inToken.getItems().get(2).getKey(), DataType.STRING);
290-
assertEquals(inToken.getItems().get(0).getValue(), "abc");
291-
assertEquals(inToken.getItems().get(1).getValue(), "def");
292-
assertEquals(inToken.getItems().get(2).getValue(), "abc def");
287+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getDataType(), DataType.STRING);
288+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getDataType(), DataType.STRING);
289+
assertEquals(((UnaryNode)inToken.getItems().get(2)).getDataType(), DataType.STRING);
290+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getValue(), "abc");
291+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getValue(), "def");
292+
assertEquals(((UnaryNode)inToken.getItems().get(2)).getValue(), "abc def");
293293
}
294294

295295
@Test
@@ -300,12 +300,12 @@ public void testStringList1() {
300300
final InNode inToken = (InNode) nodeOptional.get();
301301
assertEquals(inToken.getItems().size(), 3);
302302
assertEquals(inToken.getField(), "name");
303-
assertEquals(inToken.getItems().get(0).getKey(), DataType.STRING);
304-
assertEquals(inToken.getItems().get(1).getKey(), DataType.STRING);
305-
assertEquals(inToken.getItems().get(2).getKey(), DataType.STRING);
306-
assertEquals(inToken.getItems().get(0).getValue(), "abc");
307-
assertEquals(inToken.getItems().get(1).getValue(), "def");
308-
assertEquals(inToken.getItems().get(2).getValue(), "abc, def");
303+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getDataType(), DataType.STRING);
304+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getDataType(), DataType.STRING);
305+
assertEquals(((UnaryNode)inToken.getItems().get(2)).getDataType(), DataType.STRING);
306+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getValue(), "abc");
307+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getValue(), "def");
308+
assertEquals(((UnaryNode)inToken.getItems().get(2)).getValue(), "abc, def");
309309
}
310310

311311
@Test
@@ -316,12 +316,12 @@ public void testStringList2() {
316316
final InNode inToken = (InNode) nodeOptional.get();
317317
assertEquals(inToken.getItems().size(), 3);
318318
assertEquals(inToken.getField(), "name");
319-
assertEquals(inToken.getItems().get(0).getKey(), DataType.STRING);
320-
assertEquals(inToken.getItems().get(1).getKey(), DataType.STRING);
321-
assertEquals(inToken.getItems().get(2).getKey(), DataType.STRING);
322-
assertEquals(inToken.getItems().get(0).getValue(), "abc");
323-
assertEquals(inToken.getItems().get(1).getValue(), "def");
324-
assertEquals(inToken.getItems().get(2).getValue(), "ab\"c");
319+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getDataType(), DataType.STRING);
320+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getDataType(), DataType.STRING);
321+
assertEquals(((UnaryNode)inToken.getItems().get(2)).getDataType(), DataType.STRING);
322+
assertEquals(((UnaryNode)inToken.getItems().get(0)).getValue(), "abc");
323+
assertEquals(((UnaryNode)inToken.getItems().get(1)).getValue(), "def");
324+
assertEquals(((UnaryNode)inToken.getItems().get(2)).getValue(), "ab\"c");
325325
}
326326

327327
@Test

0 commit comments

Comments
 (0)