Skip to content

Commit 580a5d3

Browse files
authored
Fixed the issue of substring not working correctly when fieldname is put as <table>.<column> (#333)
* Fix substring issue * Deleted unnecessary lines
1 parent 080701b commit 580a5d3

File tree

2 files changed

+11
-18
lines changed

2 files changed

+11
-18
lines changed

src/main/java/com/amazon/opendistroforelasticsearch/sql/utils/SQLFunctions.java

+8-15
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,7 @@ public Tuple<String, String> function(String methodName, List<KVValue> paramers,
284284
case "substring":
285285
functionStr = substring((SQLExpr) paramers.get(0).value,
286286
Integer.parseInt(Util.expr2Object((SQLExpr) paramers.get(1).value).toString()),
287-
Integer.parseInt(Util.expr2Object((SQLExpr) paramers.get(2).value).toString())
288-
, name);
287+
Integer.parseInt(Util.expr2Object((SQLExpr) paramers.get(2).value).toString()));
289288
break;
290289

291290
case "degrees":
@@ -735,22 +734,16 @@ private Tuple<String, String> strSingleValueTemplate(String methodName, SQLExpr
735734
// query: substring(Column expr, int pos, int len)
736735
// painless script: substring(int begin, int end)
737736
// es behavior: 1-index, supports out-of-bound index
738-
public Tuple<String, String> substring(SQLExpr field, int pos, int len, String valueName) {
737+
public Tuple<String, String> substring(SQLExpr field, int pos, int len) {
739738
String name = nextId("substring");
740-
741739
// start and end are 0-indexes
742740
int start = pos < 1 ? 0 : pos - 1;
743-
int end = Math.min(start + len, getPropertyOrValue(field).length());
744-
if (valueName == null) {
745-
return new Tuple<>(name, def(name, getPropertyOrStringValue(field) + "."
746-
+ func("substring", false,
747-
Integer.toString(start), Integer.toString(end))));
748-
} else {
749-
return new Tuple<>(name, getPropertyOrStringValue(field) + "; "
750-
+ def(name, valueName + "."
751-
+ func("substring", false,
752-
Integer.toString(start), Integer.toString(end))));
753-
}
741+
return new Tuple<>(name, StringUtils.format(
742+
"def end = (int) Math.min(%s + %s, %s.length()); "
743+
+ def(name, getPropertyOrStringValue(field) + "."
744+
+ func("substring", false, Integer.toString(start), "end")),
745+
Integer.toString(start), Integer.toString(len), getPropertyOrStringValue(field)
746+
));
754747
}
755748

756749
private String lower(String property, String culture) {

src/test/java/com/amazon/opendistroforelasticsearch/sql/unittest/StringOperatorsTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ public void substringTest() {
4040
assertTrue(
4141
CheckScriptContents.scriptContainsString(
4242
scriptField,
43-
"doc['lastname'].value.substring(1, 2)"));
43+
"doc['lastname'].value.substring(1, end)"));
4444

4545
ScriptFilter scriptFilter = CheckScriptContents.getScriptFilterFromQuery(query, parser);
4646
assertTrue(
4747
CheckScriptContents.scriptContainsString(
4848
scriptFilter,
49-
"doc['lastname'].value.substring(1, 2)"
49+
"doc['lastname'].value.substring(1, end)"
5050
)
5151
);
5252
}
@@ -58,7 +58,7 @@ public void substringIndexOutOfBoundTest() {
5858
assertTrue(
5959
CheckScriptContents.scriptContainsString(
6060
scriptField,
61-
"'sampleName'.substring(0, 10)"
61+
"def end = (int) Math.min(0 + 20, 'sampleName'.length())"
6262
)
6363
);
6464
}

0 commit comments

Comments
 (0)