Dmitry Lychagin has submitted this change and it was merged. Change subject: [ASTERIXDB-2376][FUN] Negative offset for substring() ......................................................................
[ASTERIXDB-2376][FUN] Negative offset for substring() - user model changes: yes - storage format changes: no - interface changes: no Details: - Support negative offset as an argument to substring() (that means: count from the end of the string) Change-Id: I849c38819ea2df2c203fd1d794c6b0b3a0eca9d1 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2626 Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Till Westmann <ti...@apache.org> --- M asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql M asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-4/substring2-4.3.query.aql M asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp M asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-4/substring2-4.3.query.sqlpp M asterixdb/asterix-app/src/test/resources/runtimets/results/string/substr01/substr01.1.adm M asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring2-4/substring2-4.1.adm M asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring/substring.1.adm M asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring2/substring2.1.adm M asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast M asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-4/substring2-4.3.ast M asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java 13 files changed, 18 insertions(+), 17 deletions(-) Approvals: Anon. E. Moose #1000171: Till Westmann: Looks good to me, approved Jenkins: Verified; No violations found; ; Verified diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql index bc9e7f7..a45b24c 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql @@ -36,7 +36,7 @@ let $str8:=substring($str7,0) let $str9:="This is a test string" -let $str10:=substring($str9,-1) +let $str10:=substring($str9,-6) let $str11:="This is a test string" let $str12:="This is a another test string" diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-4/substring2-4.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-4/substring2-4.3.query.aql index 075af82..ecfcd94 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-4/substring2-4.3.query.aql +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-4/substring2-4.3.query.aql @@ -18,5 +18,5 @@ */ use dataverse test; -let $c1 := substring("HEllow",-1) +let $c1 := substring("HEllow",-3) return {"result1": $c1} diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp index b9c79d0..6abe9ff 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp @@ -23,4 +23,4 @@ * Date : 18th April 2012 */ -{'str2':substring('Hello World',9),'str4':substring('This is a test string',20),'str6':substring('This is a test string',21),'str8':substring('This is a test string',0),'str10':substring('This is a test string',-1),'str13':substring(`string-concat`(['This is a test string','This is a another test string']),20),'str14':substring('UC Irvine',(`string-length`('UC Irvine') / 2 - 1))}; +{'str2':substring('Hello World',9),'str4':substring('This is a test string',20),'str6':substring('This is a test string',21),'str8':substring('This is a test string',0),'str10':substring('This is a test string',-6),'str13':substring(`string-concat`(['This is a test string','This is a another test string']),20),'str14':substring('UC Irvine',(`string-length`('UC Irvine') / 2 - 1))}; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-4/substring2-4.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-4/substring2-4.3.query.sqlpp index 8ea572c..ae943d4 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-4/substring2-4.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-4/substring2-4.3.query.sqlpp @@ -20,4 +20,4 @@ use test; -{'result1':test.substring('HEllow',-1)}; +{'result1':test.substring('HEllow',-3)}; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substr01/substr01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substr01/substr01.1.adm index ac9dedd..326e22f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substr01/substr01.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substr01/substr01.1.adm @@ -1 +1 @@ -{ "str2": "ld", "str4": "g", "str6": "", "str8": "This is a test string", "str10": "This is a test string", "str13": "gThis is a another test string", "str14": "Irvine" } +{ "str2": "ld", "str4": "g", "str6": "", "str8": "This is a test string", "str10": "string", "str13": "gThis is a another test string", "str14": "Irvine" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring2-4/substring2-4.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring2-4/substring2-4.1.adm index 5b0c7b9..197a7af 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring2-4/substring2-4.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring2-4/substring2-4.1.adm @@ -1 +1 @@ -{ "result1": "HEllow" } +{ "result1": "low" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring/substring.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring/substring.1.adm index b92a705..a8e64f4 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring/substring.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring/substring.1.adm @@ -1 +1 @@ -[ "ab", "ab", "ab", "bc", "cd" ] \ No newline at end of file +[ "g", "ab", "ab", "bc", "cd" ] diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring2/substring2.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring2/substring2.1.adm index e341861..a11b25b 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring2/substring2.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring2/substring2.1.adm @@ -1 +1 @@ -[ "abcdefg", "abcdefg", "abcdefg", "bcdefg", "cdefg" ] \ No newline at end of file +[ "g", "abcdefg", "abcdefg", "bcdefg", "cdefg" ] diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast index a86d0a4..4b7138d 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast @@ -37,7 +37,7 @@ : FunctionCall null.substring@2[ LiteralExpr [STRING] [This is a test string] - - LiteralExpr [LONG] [1] + - LiteralExpr [LONG] [6] ] ) ( diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-4/substring2-4.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-4/substring2-4.3.ast index 414ad6e..8ff93d6 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-4/substring2-4.3.ast +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-4/substring2-4.3.ast @@ -6,7 +6,7 @@ : FunctionCall test.substring@2[ LiteralExpr [STRING] [HEllow] - - LiteralExpr [LONG] [1] + - LiteralExpr [LONG] [3] ] ) ] diff --git a/asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md b/asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md index a733a84..6599dc3 100644 --- a/asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md +++ b/asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md @@ -528,7 +528,7 @@ * Arguments: * `string` : a `string` to be extracted, * `offset` : an `tinyint`/`smallint`/`integer`/`bigint` value as the starting offset of the substring in `string` - (starting at 0), + (starting at 0). If negative then counted from the end of the string, * `length` : (Optional) an an `tinyint`/`smallint`/`integer`/`bigint` value as the length of the substring. * Return Value: * a `string` that represents the substring, @@ -548,6 +548,7 @@ "str" +The function has an alias `substring`. ### trim ### * Syntax: diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java index 53f73ae..854eb8e 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java @@ -86,8 +86,7 @@ byte[] bytes = argStart.getByteArray(); int offset = argStart.getStartOffset(); - int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 1, bytes, offset) - - baseOffset; + int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 1, bytes, offset); bytes = argString.getByteArray(); offset = argString.getStartOffset(); int len = argString.getLength(); @@ -98,7 +97,8 @@ string.set(bytes, offset + 1, len - 1); array.reset(); try { - UTF8StringPointable.substr(string, start, Integer.MAX_VALUE, builder, array); + int actualStart = start >= 0 ? start - baseOffset : string.getStringLength() + start; + UTF8StringPointable.substr(string, actualStart, Integer.MAX_VALUE, builder, array); } catch (StringIndexOutOfBoundsException e) { throw new RuntimeDataException(ErrorCode.OUT_OF_BOUND, getIdentifier(), 1, start); } catch (IOException e) { diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java index 148d0a4..526711c 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java @@ -93,8 +93,7 @@ byte[] bytes = argStart.getByteArray(); int offset = argStart.getStartOffset(); - int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0, bytes, offset) - - baseOffset; + int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0, bytes, offset); bytes = argLen.getByteArray(); offset = argLen.getStartOffset(); @@ -110,7 +109,8 @@ string.set(bytes, offset + 1, length - 1); array.reset(); try { - UTF8StringPointable.substr(string, start, len, builder, array); + int actualStart = start >= 0 ? start - baseOffset : string.getStringLength() + start; + UTF8StringPointable.substr(string, actualStart, len, builder, array); } catch (StringIndexOutOfBoundsException e) { throw new RuntimeDataException(ErrorCode.OUT_OF_BOUND, getIdentifier(), 1, start + len - 1); } catch (IOException e) { -- To view, visit https://asterix-gerrit.ics.uci.edu/2626 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I849c38819ea2df2c203fd1d794c6b0b3a0eca9d1 Gerrit-PatchSet: 3 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Dmitry Lychagin <dmitry.lycha...@couchbase.com> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Dmitry Lychagin <dmitry.lycha...@couchbase.com> Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Gerrit-Reviewer: Till Westmann <ti...@apache.org>