Skip to content

Commit c5fca6b

Browse files
cursoragentsimbo1905
andcommitted
Issue #121 Implement JsonPath recursion brackets filters and scripts
Co-authored-by: simbo1905 <simbo1905@60hertz.com>
1 parent c0fa453 commit c5fca6b

File tree

5 files changed

+843
-25
lines changed

5 files changed

+843
-25
lines changed

json-java21-jsonpath/src/main/java/json/java21/jsonpath/JsonPathAst.java

Lines changed: 114 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,128 @@
33
import java.util.List;
44
import java.util.Objects;
55

6-
record JsonPathAst(List<Segment> segments) {
6+
record JsonPathAst(List<Step> steps) {
77
JsonPathAst {
8-
Objects.requireNonNull(segments, "segments must not be null");
9-
segments.forEach(s -> Objects.requireNonNull(s, "segment must not be null"));
8+
Objects.requireNonNull(steps, "steps must not be null");
9+
steps.forEach(s -> Objects.requireNonNull(s, "step must not be null"));
1010
}
1111

12-
sealed interface Segment permits Segment.Child, Segment.Wildcard {
13-
record Child(String name) implements Segment {
12+
sealed interface Step permits
13+
Step.Child,
14+
Step.Wildcard,
15+
Step.RecursiveDescent,
16+
Step.ArrayIndex,
17+
Step.ArraySlice,
18+
Step.Union,
19+
Step.Filter,
20+
Step.ScriptIndex {
21+
22+
record Child(String name) implements Step {
1423
public Child {
1524
Objects.requireNonNull(name, "name must not be null");
1625
}
1726
}
1827

19-
record Wildcard() implements Segment {}
28+
record Wildcard() implements Step {}
29+
30+
record RecursiveDescent(RecursiveSelector selector) implements Step {
31+
public RecursiveDescent {
32+
Objects.requireNonNull(selector, "selector must not be null");
33+
}
34+
}
35+
36+
sealed interface RecursiveSelector permits RecursiveSelector.Name, RecursiveSelector.Wildcard {
37+
record Name(String name) implements RecursiveSelector {
38+
public Name {
39+
Objects.requireNonNull(name, "name must not be null");
40+
}
41+
}
42+
43+
record Wildcard() implements RecursiveSelector {}
44+
}
45+
46+
record ArrayIndex(int index) implements Step {}
47+
48+
record ArraySlice(Integer startInclusive, Integer endExclusive) implements Step {}
49+
50+
record Union(List<Selector> selectors) implements Step {
51+
public Union {
52+
Objects.requireNonNull(selectors, "selectors must not be null");
53+
selectors.forEach(s -> Objects.requireNonNull(s, "selector must not be null"));
54+
}
55+
}
56+
57+
sealed interface Selector permits Selector.Name, Selector.Index {
58+
record Name(String name) implements Selector {
59+
public Name {
60+
Objects.requireNonNull(name, "name must not be null");
61+
}
62+
}
63+
64+
record Index(int index) implements Selector {}
65+
}
66+
67+
record Filter(BoolExpr predicate) implements Step {
68+
public Filter {
69+
Objects.requireNonNull(predicate, "predicate must not be null");
70+
}
71+
}
72+
73+
record ScriptIndex(ValueExpr expr) implements Step {
74+
public ScriptIndex {
75+
Objects.requireNonNull(expr, "expr must not be null");
76+
}
77+
}
78+
}
79+
}
80+
81+
sealed interface BoolExpr permits BoolExpr.Exists, BoolExpr.Compare {
82+
record Exists(ValueExpr.Path path) implements BoolExpr {
83+
public Exists {
84+
Objects.requireNonNull(path, "path must not be null");
85+
}
86+
}
87+
88+
enum CmpOp {
89+
LT, LE, GT, GE, EQ, NE
90+
}
91+
92+
record Compare(CmpOp op, ValueExpr left, ValueExpr right) implements BoolExpr {
93+
public Compare {
94+
Objects.requireNonNull(op, "op must not be null");
95+
Objects.requireNonNull(left, "left must not be null");
96+
Objects.requireNonNull(right, "right must not be null");
97+
}
98+
}
99+
}
100+
101+
sealed interface ValueExpr permits ValueExpr.Path, ValueExpr.Num, ValueExpr.Str, ValueExpr.Arith {
102+
103+
record Path(List<String> parts) implements ValueExpr {
104+
public Path {
105+
Objects.requireNonNull(parts, "parts must not be null");
106+
parts.forEach(p -> Objects.requireNonNull(p, "path part must not be null"));
107+
}
108+
}
109+
110+
record Num(double value) implements ValueExpr {}
111+
112+
record Str(String value) implements ValueExpr {
113+
public Str {
114+
Objects.requireNonNull(value, "value must not be null");
115+
}
116+
}
117+
118+
enum ArithOp {
119+
ADD, SUB
120+
}
121+
122+
record Arith(ArithOp op, ValueExpr left, ValueExpr right) implements ValueExpr {
123+
public Arith {
124+
Objects.requireNonNull(op, "op must not be null");
125+
Objects.requireNonNull(left, "left must not be null");
126+
Objects.requireNonNull(right, "right must not be null");
127+
}
20128
}
21129
}
22130

0 commit comments

Comments
 (0)