Skip to content

Commit

Permalink
Fix $split issues. #29 #31
Browse files Browse the repository at this point in the history
- don't treat string separator as regexp. #29
- preserve trailing empty result strings. #31
- correctly $split("", "") and only split limit characters in first place. #31
- added new tests covering these cases
  • Loading branch information
uw4 committed Jan 18, 2024
1 parent 961edea commit c4eb78d
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 2 deletions.
14 changes: 12 additions & 2 deletions src/main/java/com/dashjoin/jsonata/Functions.java
Original file line number Diff line number Diff line change
Expand Up @@ -1061,9 +1061,19 @@ public static List<String> split(String str, Object pattern, Number limit) {
return result;

if (pattern instanceof String) {
result = Arrays.asList( str.split((String)pattern) );
String sep = (String)pattern;
if (sep.isEmpty()) {
// $split("str", ""): Split string into characters
int l = limit!=null ? limit.intValue() : Integer.MAX_VALUE;
for (int i=0; i<str.length() && i<l; i++) {
result.add( ""+str.charAt(i) );
}
} else {
// Quote separator string + preserve trailing empty strings (-1)
result = Arrays.asList( str.split( Pattern.quote(sep), -1) );
}
} else {
result = Arrays.asList( str.split(((Pattern)pattern).pattern() ) );
result = Arrays.asList( ((Pattern)pattern).split(str, -1) );
}
if (limit!=null && limit.intValue()<result.size()) {
result = result.subList(0, limit.intValue());
Expand Down
38 changes: 38 additions & 0 deletions src/test/java/com/dashjoin/jsonata/StringTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,42 @@ public void escapeTest() {
Assertions.assertEquals("{\"a\":\"</\"}",
jsonata("$string($)").evaluate(Map.of("a", "</")));
}

/**
* Additional $split tests
*/
@Test
public void splitTest() {
Object res;

// Splitting empty string with empty separator must return empty list
res = jsonata("$split('', '')").evaluate(null);
Assertions.assertEquals(Arrays.asList(), res);

// Split characters with limit
res = jsonata("$split('a1b2c3d4', '', 4)").evaluate(null);
Assertions.assertEquals(Arrays.asList("a", "1", "b", "2"), res);

// Check string is not treated as regexp
res = jsonata("$split('this..is.a.test', '.')").evaluate(null);
//System.out.println( Functions.string(res, false));
Assertions.assertEquals(Arrays.asList("this","","is","a","test"), res);

// Check trailing empty strings
res = jsonata("$split('this..is.a.test...', '.')").evaluate(null);
//System.out.println( Functions.string(res, false));
Assertions.assertEquals(Arrays.asList("this","","is","a","test","","",""), res);

// Check trailing empty strings
res = jsonata("$split('this..is.a.test...', /\\./)").evaluate(null);
Assertions.assertEquals(Arrays.asList("this","","is","a","test","","",""), res);

// Check string is not treated as regexp, trailing empty strings, and limit
res = jsonata("$split('this.*.*is.*a.*test.*.*.*.*.*.*', '.*', 8)").evaluate(null);
Assertions.assertEquals(Arrays.asList("this","","is","a","test","","",""), res);

// Escaped regexp, trailing empty strings, and limit
res = jsonata("$split('this.*.*is.*a.*test.*.*.*.*.*.*', /\\.\\*/, 8)").evaluate(null);
Assertions.assertEquals(Arrays.asList("this","","is","a","test","","",""), res);
}
}

0 comments on commit c4eb78d

Please sign in to comment.