Dmitry Lychagin has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/2626
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
---
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-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
9 files changed, 14 insertions(+), 13 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/26/2626/1
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-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..d135325 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 +
string.getStringLength() : start) - baseOffset;
+ 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..61b287d 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 +
string.getStringLength() : start) - baseOffset;
+ 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: newchange
Gerrit-Change-Id: I849c38819ea2df2c203fd1d794c6b0b3a0eca9d1
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Dmitry Lychagin <[email protected]>