Skip to content

Commit d93e59c

Browse files
committed
rfc
1 parent 87ab604 commit d93e59c

File tree

2 files changed

+46
-23
lines changed

2 files changed

+46
-23
lines changed

src/main/java/com/redislabs/modules/rejson/Path.java

+17-10
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@
3232
* Path is a ReJSON path, representing a valid path into an object
3333
*/
3434
public class Path {
35-
36-
public static final Path ROOT_PATH = new Path(".");
37-
35+
36+
public static final Path ROOT_PATH = new Path(".");
37+
3838
private final String strPath;
3939

4040
public Path(final String strPath) {
@@ -77,20 +77,25 @@ public int hashCode() {
7777
return strPath.hashCode();
7878
}
7979

80+
private static String escape(String path) {
81+
StringBuilder builder = new StringBuilder();
82+
builder.append('"');
83+
builder.append(path);
84+
builder.append('"');
85+
return builder.toString();
86+
}
87+
8088
private static String parse(String path) {
8189
if (path == null) {
8290
throw new NullPointerException("Json Pointer Path cannot be null.");
8391
}
8492
if (path.isEmpty()) {
85-
throw new IllegalArgumentException("Json Pointer Path cannot be empty.");
93+
// ”“ means all document
94+
return ROOT_PATH.toString();
8695
}
8796
if (path.charAt(0) != '/') {
8897
throw new IllegalArgumentException("Json Pointer Path must start with '/'.");
8998
}
90-
if (path.length() == 1) {
91-
// only contains '/'
92-
return ROOT_PATH.toString();
93-
}
9499
char[] ary = path.toCharArray();
95100
StringBuilder r = new StringBuilder(ary.length);
96101
StringBuilder builder = new StringBuilder();
@@ -113,7 +118,7 @@ private static String parse(String path) {
113118
if (builder.length() > 0 && num) {
114119
r.append(".[" + builder.toString() + "]");
115120
} else {
116-
r.append("." + builder.toString());
121+
r.append(".[" + escape(builder.toString()) + "]");
117122
}
118123
num = true;
119124
builder.setLength(0);
@@ -155,8 +160,10 @@ private static String parse(String path) {
155160
if (num) {
156161
r.append(".[" + builder.toString() + "]");
157162
} else {
158-
r.append("." + builder.toString());
163+
r.append(".[" + escape(builder.toString()) + "]");
159164
}
165+
} else if (prev == '/') {
166+
r.append(".[" + escape(builder.toString()) + "]");
160167
}
161168
return r.toString();
162169
}

src/test/java/com/redislabs/modules/rejson/PathTest.java

+29-13
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,35 @@ public void testPathHashCode() {
3434

3535
@Test
3636
public void testJsonPointer() {
37-
assertEquals(Path.ofJsonPointer("/"), Path.ROOT_PATH);
38-
assertEquals(Path.ofJsonPointer("/a/b/c"), Path.of(".a.b.c"));
39-
assertEquals(Path.ofJsonPointer("/a/0/c"), Path.of(".a.[0].c"));
40-
assertEquals(Path.ofJsonPointer("/a/0b/c"), Path.of(".a.0b.c"));
41-
assertEquals(Path.ofJsonPointer("/ab/cd/1010"), Path.of(".ab.cd.[1010]"));
42-
assertEquals(Path.ofJsonPointer("/a/b/c").hashCode(), Path.of(".a.b.c").hashCode());
37+
assertEquals(Path.ofJsonPointer(""), Path.ROOT_PATH);
38+
assertEquals(Path.ofJsonPointer("/"), Path.of(".[\"\"]"));
39+
assertEquals(Path.ofJsonPointer("//0"), Path.of(".[\"\"].[0]"));
40+
assertEquals(Path.ofJsonPointer("//"), Path.of(".[\"\"].[\"\"]"));
41+
assertEquals(Path.ofJsonPointer("// "), Path.of(".[\"\"].[\" \"]"));
42+
assertEquals(Path.ofJsonPointer("/a/b/c"), Path.of(".[\"a\"].[\"b\"].[\"c\"]"));
43+
assertEquals(Path.ofJsonPointer("/a/0/c"), Path.of(".[\"a\"].[0].[\"c\"]"));
44+
assertEquals(Path.ofJsonPointer("/a/0b/c"), Path.of(".[\"a\"].[\"0b\"].[\"c\"]"));
45+
assertEquals(Path.ofJsonPointer("/ab/cd/1010"), Path.of(".[\"ab\"].[\"cd\"].[1010]"));
46+
assertEquals(Path.ofJsonPointer("/a/b/c").hashCode(), Path.of(".[\"a\"].[\"b\"].[\"c\"]").hashCode());
4347

44-
//escape test
45-
assertEquals(Path.ofJsonPointer("/a/~0/c"), Path.of(".a.~.c"));
46-
assertEquals(Path.ofJsonPointer("/a/~1/c"), Path.of(".a./.c"));
47-
assertEquals(Path.ofJsonPointer("/a/~~/c"), Path.of(".a.~~.c"));
48-
assertEquals(Path.ofJsonPointer("/~/~~~/~~"), Path.of(".~.~~~.~~"));
49-
assertEquals(Path.ofJsonPointer("/~/~~~0/~~"), Path.of(".~.~~~.~~"));
50-
assertEquals(Path.ofJsonPointer("/~/'.'/~~"), Path.of(".~.'.'.~~"));
48+
// escape test
49+
assertEquals(Path.ofJsonPointer("/a/~0"), Path.of(".[\"a\"].[\"~\"]"));
50+
assertEquals(Path.ofJsonPointer("/a/~1"), Path.of(".[\"a\"].[\"/\"]"));
51+
assertEquals(Path.ofJsonPointer("/a/~0/c"), Path.of(".[\"a\"].[\"~\"].[\"c\"]"));
52+
assertEquals(Path.ofJsonPointer("/a/~1/c"), Path.of(".[\"a\"].[\"/\"].[\"c\"]"));
53+
assertEquals(Path.ofJsonPointer("/a/~~/c"), Path.of(".[\"a\"].[\"~~\"].[\"c\"]"));
54+
assertEquals(Path.ofJsonPointer("/~/~~~/~"), Path.of(".[\"~\"].[\"~~~\"].[\"~\"]"));
55+
assertEquals(Path.ofJsonPointer("/~/~~~/~~"), Path.of(".[\"~\"].[\"~~~\"].[\"~~\"]"));
56+
assertEquals(Path.ofJsonPointer("/~/~~~0/~~"), Path.of(".[\"~\"].[\"~~~\"].[\"~~\"]"));
57+
assertEquals(Path.ofJsonPointer("/~/'.'/~~"), Path.of(".[\"~\"].[\"'.'\"].[\"~~\"]"));
58+
59+
// json path escape test
60+
assertEquals(Path.ofJsonPointer("/\t"), Path.of(".[\"\t\"]"));
61+
assertEquals(Path.ofJsonPointer("/\u0074"), Path.of(".[\"\u0074\"]"));
62+
assertEquals(Path.ofJsonPointer("/'"), Path.of(".[\"'\"]"));
63+
assertEquals(Path.ofJsonPointer("/\'"), Path.of(".[\"\'\"]"));
64+
assertEquals(Path.ofJsonPointer("/\""), Path.of(".[\"\"\"]"));
65+
assertEquals(Path.ofJsonPointer("/\n"), Path.of(".[\"\n\"]"));
66+
assertEquals(Path.ofJsonPointer("/\\"), Path.of(".[\"\\\"]"));
5167
}
5268
}

0 commit comments

Comments
 (0)