Skip to content

Commit b105a51

Browse files
committed
Implementing inline IF
1 parent e3a566a commit b105a51

20 files changed

+296
-377
lines changed

src/main/antlr4/dev/vepo/jsonata/functions/generated/JSONataGrammar.g4

Lines changed: 27 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,61 @@
11
grammar JSONataGrammar;
22

3-
expressions: expression+ EOF;
3+
expressions: (expression+ | object) EOF;
44

5-
// expressionGroup: expression+;
5+
object: OBJ_OPEN fieldList OBJ_CLOSE # objectBuilder
6+
;
67

78
expression:
8-
IDENTIFIER # identifier
9+
functionStatement # functionCall
10+
| ROOT # rootPath
11+
| IDENTIFIER # identifier
912
| '*' # fieldValues
1013
| DESCEND # allDescendantSearch
1114
| DOLLAR # contextReferece
12-
| ROOT # root_path
13-
| expression '.' expression # path
15+
| ARR_OPEN expressionList ARR_CLOSE # arrayConstructor
16+
| expression DOT OBJ_OPEN fieldList OBJ_CLOSE # objectMapper
17+
| expression OBJ_OPEN fieldList OBJ_CLOSE # objectConstructor
18+
| expression DOT expression # path
1419
| expression ARR_OPEN ARR_CLOSE # toArray
1520
| expression ARR_OPEN NUMBER ARR_CLOSE # arrayIndexQuery
1621
| expression ARR_OPEN expression ARR_CLOSE # arrayQuery
1722
| expression rangePredicate # rangeQuery
1823
| expression op=('<' | '<=' | '>' | '>=' | '!=' | '=' | 'in') expression # booleanCompare
24+
| expression op=('and' | 'or') expression # booleanExpression
25+
| expression op=('+' | '-' | '*' | '/' | '%' | '^') expression # algebraicExpression
26+
| expression '?' expression (':' expression)? # inlineIfExpression
1927
| expression '&' expression # concatValues
2028
| '(' expression ')' # contextValue
2129
| STRING # stringValue
2230
| NUMBER # numberValue
2331
| FLOAT # floatValue
2432
| EXP_NUMBER # expNumberValue
25-
// functionStatement # functionCall
26-
// | DOT? fieldPath # queryPath
27-
// | ROOT # rootPath
28-
// | fieldPredicate # fieldPredicateArray
29-
// | indexPredicate # indexPredicateArray
30-
// | rangePredicate # rangePredicateArray
31-
// | DOT? arrayConstructor # arrayConstructorMapping
32-
// | ARRAY_CAST # transformerArrayCast
33-
// | WILDCARD WILDCARD DOT fieldName DOT? # transformerDeepFindByField
34-
// | (DOT WILDCARD | WILDCARD DOT) # transformerWildcard
35-
// | stringConcat # transformerStringConcat
36-
// | DOT? '(' expressionGroup ')' # innerExpression
37-
// | booleanExpression # expressionBooleanSentence
38-
// | booleanCompare # expressionBooleanPredicate
39-
// | algebraicExpression # expressionAlgebraic
40-
// | DOT objectExpression # objectMapper
41-
// | objectExpression # objectBuilder
42-
// | expression '?' expression (':' expression)? # conditional
33+
| BOOLEAN # booleanValue
4334
;
4435

36+
functionStatement: IDENTIFIER '(' parameterStatement (',' parameterStatement)* ')' ;
37+
parameterStatement: expression | functionDeclaration;
38+
functionDeclaration:
39+
'function' '(' IDENTIFIER (',' IDENTIFIER)* ')' '{' expression+ '}' # functionDeclarationBuilder
40+
;
41+
expressionList: expression (',' expression)*;
42+
fieldList: expression ':' expOrObject (',' expression ':' expOrObject)*;
43+
expOrObject: expression | object;
4544

4645
rangePredicate: ARR_OPEN ARR_OPEN NUMBER '..' NUMBER ARR_CLOSE ARR_CLOSE;
47-
48-
IDENTIFIER: [\p{L}_] [\p{L}0-9_]*
49-
| BACK_QUOTE ~[`]* BACK_QUOTE;
46+
BOOLEAN: 'true' | 'false';
5047
ROOT : '$$' ;
5148
DOLLAR: '$';
5249
DESCEND: '**';
5350
ARR_OPEN: '[';
5451
ARR_CLOSE: ']';
52+
OBJ_OPEN: '{';
53+
OBJ_CLOSE: '}';
5554

55+
IDENTIFIER: [\p{L}_$] [\p{L}0-9_$]*
56+
| BACK_QUOTE ~[`]* BACK_QUOTE;
5657
fragment BACK_QUOTE : '`';
5758

58-
// objectExpression:
59-
// '{' fieldPathOrString ':' fieldPathOrString ARRAY_CAST? (
60-
// ',' fieldPathOrString ':' fieldPathOrString ARRAY_CAST?
61-
// )* '}';
62-
// fieldPathOrString: fieldPath | STRING | NUMBER | FLOAT | EXP_NUMBER | BOOLEAN | objectExpression | ;
63-
// fieldName: IDENTIFIER | QUOTED_VALUE;
64-
// fieldPath: fieldName (DOT fieldName)*;
65-
// functionStatement: IDENTIFIER '(' parameterStatement (',' parameterStatement)* ')' ;
66-
// parameterStatement: fieldPath | functionDeclaration;
67-
// functionDeclaration:
68-
// 'function' '(' IDENTIFIER (',' IDENTIFIER)* ')' '{' expressionGroup '}' # functionDeclarationBuilder
69-
// ;
70-
// fieldPredicate: '[' IDENTIFIER '=' STRING ']';
71-
// indexPredicate: '[' NUMBER ']';
72-
// arrayConstructor: '[' fieldPath (',' fieldPath)* ']';
73-
// stringConcat: stringOrField ('&' stringOrField)+;
74-
// stringOrField: fieldPath | STRING | NUMBER | BOOLEAN;
75-
76-
// booleanCompare: op=('<' | '<=' | '>' | '>=' | '!=' | '=' | 'in') expressionGroup;
77-
// booleanExpression: op=('and' | 'or') expressionGroup;
78-
79-
// algebraicExpression: op=('+' | '-' | '*' | '/' | '%' | '^') expressionGroup;
80-
81-
// // BOOLEAN_OPERATOR: ;
82-
// ARRAY_CAST: '[]';
83-
// WILDCARD: '*';
84-
85-
// BOOLEAN: 'true' | 'false';
86-
8759
STRING:
8860
'\'' (ESC | ~['\\])* '\''
8961
| '"' (ESC | ~["\\])* '"'
@@ -92,8 +64,6 @@ STRING:
9264
NUMBER: '-'? [0-9]+;
9365
FLOAT: '-'? [0-9]+ '.' [0-9]+;
9466
EXP_NUMBER: '-'? [0-9]+ [eE] '-'? [0-9]+;
95-
// IDENTIFIER: [$A-Za-z_][$A-Za-z_0-9]*;
96-
// QUOTED_VALUE: '`' (~'`')* '`';
9767
9868
9969
fragment ESC : '\\' (["'\\/bfnrt] | UNICODE);

src/main/java/dev/vepo/jsonata/functions/AlgebraicJSONataFunction.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,18 @@
22

33
import static dev.vepo.jsonata.functions.json.JsonFactory.numberValue;
44

5-
import java.util.List;
65
import java.util.stream.IntStream;
76

87
import com.fasterxml.jackson.databind.JsonNode;
98

109
import dev.vepo.jsonata.functions.data.Data;
1110
import dev.vepo.jsonata.functions.data.GroupedData;
1211

13-
public record AlgebraicJSONataFunction(AlgebraicOperator operator, List<JSONataFunction> rightExpressions) implements JSONataFunction {
12+
public record AlgebraicJSONataFunction(JSONataFunction left, AlgebraicOperator operator, JSONataFunction right) implements JSONataFunction {
1413

1514
@Override
1615
public Data map(Data original, Data current) {
17-
var right = rightExpressions.stream()
18-
.reduce((f1, f2) -> (o, v) -> f2.map(o, f1.map(o, v)))
19-
.map(f -> f.map(original, original).toJson())
20-
.orElse(current.toJson());
21-
return execute(current.toJson(), right);
16+
return execute(left.map(original, current).toJson(), right.map(original, current).toJson());
2217
}
2318

2419
private Data execute(JsonNode left, JsonNode right) {

src/main/java/dev/vepo/jsonata/functions/ArrayConstructorJSONataFunction.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,22 @@
55

66
import java.util.ArrayList;
77
import java.util.List;
8-
import java.util.function.Function;
98

10-
import dev.vepo.jsonata.functions.data.GroupedData;
119
import dev.vepo.jsonata.functions.data.Data;
10+
import dev.vepo.jsonata.functions.data.GroupedData;
1211

13-
public record ArrayConstructorJSONataFunction(List<Function<Data, Data>> arrayBuilder) implements JSONataFunction {
12+
public record ArrayConstructorJSONataFunction(List<JSONataFunction> arrayBuilder) implements JSONataFunction {
1413

1514
@Override
1615
public Data map(Data original, Data current) {
1716
if (current.isArray() && arrayBuilder.size() == 1) {
1817
var elements = new ArrayList<Data>();
1918
for (int i = 0; i < current.length(); ++i) {
20-
elements.add(arrayBuilder.get(0).apply(current.at(i)));
19+
elements.add(arrayBuilder.get(0).map(original, current.at(i)));
2120
}
2221
return json2Value(new GroupedData(elements).toJson());
2322
} else {
24-
return json2Value(arrayNode(arrayBuilder.stream().map(fn -> fn.apply(current).toJson()).toList()));
23+
return json2Value(arrayNode(arrayBuilder.stream().map(fn -> fn.map(original, current).toJson()).toList()));
2524
}
2625
}
2726
}

src/main/java/dev/vepo/jsonata/functions/ArrayQueryJSONataFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public Data map(Data original, Data current) {
1616
var currData = mapped.at(i);
1717
var currResult = filterFunction.map(original, currData).toJson();
1818
if (currResult.isBoolean() && currResult.asBoolean()) {
19-
filteredData.add(current.at(i));
19+
filteredData.add(mapped.at(i));
2020
}
2121
}
2222
return new GroupedData(filteredData);

src/main/java/dev/vepo/jsonata/functions/BooleanCompareJSONataFunction.java renamed to src/main/java/dev/vepo/jsonata/functions/BooleanExpressionJSONataFunction.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77
import dev.vepo.jsonata.functions.data.Data;
88

9-
public record BooleanCompareJSONataFunction(BooleanOperator operator, JSONataFunction rightExpressions) implements JSONataFunction {
9+
public record BooleanExpressionJSONataFunction(JSONataFunction left, BooleanOperator operator, JSONataFunction right) implements JSONataFunction {
1010

1111
@Override
1212
public Data map(Data original, Data current) {
13-
return booleanValue(compare(current.toJson(),
14-
rightExpressions.map(original, current).toJson()));
13+
return booleanValue(compare(left.map(original, current).toJson(),
14+
right.map(original, current).toJson()));
1515
}
1616

1717
private boolean compare(JsonNode left, JsonNode right) {

src/main/java/dev/vepo/jsonata/functions/BuiltInSortJSONataFunction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
import dev.vepo.jsonata.functions.data.Data;
99
import dev.vepo.jsonata.functions.data.GroupedData;
1010

11-
public record BuiltInSortJSONataFunction(FieldPathJSONataFunction extractor, Optional<DeclaredFunction> function,
11+
public record BuiltInSortJSONataFunction(JSONataFunction extractor, Optional<DeclaredFunction> function,
1212
Comparator<Data> comparator)
1313
implements JSONataFunction {
14-
public BuiltInSortJSONataFunction(FieldPathJSONataFunction extractor, Optional<DeclaredFunction> function) {
14+
public BuiltInSortJSONataFunction(JSONataFunction extractor, Optional<DeclaredFunction> function) {
1515
this(extractor, function, buildComparator(function));
1616
}
1717

src/main/java/dev/vepo/jsonata/functions/BuiltInSumJSONataFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import dev.vepo.jsonata.functions.data.Data;
88
import dev.vepo.jsonata.functions.json.JsonFactory;
99

10-
public record BuiltInSumJSONataFunction(FieldPathJSONataFunction extractor) implements JSONataFunction {
10+
public record BuiltInSumJSONataFunction(JSONataFunction extractor) implements JSONataFunction {
1111

1212
@Override
1313
public Data map(Data original, Data current) {

src/main/java/dev/vepo/jsonata/functions/CompareValuesJSONataFunction.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@
99

1010
import dev.vepo.jsonata.functions.data.Data;
1111

12-
public record CompareValuesJSONataFunction(CompareOperator operator, JSONataFunction rightExpressions) implements JSONataFunction {
12+
public record CompareValuesJSONataFunction(JSONataFunction left, CompareOperator operator, JSONataFunction right) implements JSONataFunction {
1313

1414
@Override
1515
public Data map(Data original, Data current) {
16-
return booleanValue(compare(current.toJson(),
17-
rightExpressions.map(original, original)
18-
.toJson()));
16+
return booleanValue(compare(left.map(original, current).toJson(),
17+
right.map(original, original).toJson()));
1918
}
2019

2120
private boolean compare(JsonNode left, JsonNode right) {

src/main/java/dev/vepo/jsonata/functions/DeclaredFunction.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,13 @@
66
import dev.vepo.jsonata.functions.data.Data;
77
import dev.vepo.jsonata.functions.json.JsonFactory;
88

9-
public record DeclaredFunction(List<String> parameterNames, List<JSONataFunction> functions) {
9+
public record DeclaredFunction(List<String> parameterNames, JSONataFunction functions) {
1010
Data accept(Data... args) {
1111
var input = JsonFactory.objectBuilder();
1212
IntStream.range(0, parameterNames.size())
1313
.forEach(i -> input.set(parameterNames.get(i), args[i]));
1414
var inputData = input.build();
1515

16-
return functions.stream()
17-
.reduce((f1, f2) -> (o, v) -> f2.map(o, f1.map(o, v)))
18-
.map(f -> f.map(inputData, inputData))
19-
.orElse(inputData);
16+
return functions.map(inputData, inputData);
2017
}
2118
}
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
package dev.vepo.jsonata.functions;
22

3-
import java.util.function.Function;
4-
5-
import dev.vepo.jsonata.functions.data.Data;
6-
7-
public record FieldContent(Function<Data, Data> name, Function<Data, Data> value, boolean arrayCast) {
3+
public record FieldContent(JSONataFunction name, JSONataFunction value) {
84
}

0 commit comments

Comments
 (0)