aboutsummaryrefslogtreecommitdiff
path: root/unsafe
diff options
context:
space:
mode:
authorTarek Auel <tarek.auel@googlemail.com>2015-07-20 22:43:30 -0700
committerDavies Liu <davies.liu@gmail.com>2015-07-20 22:44:21 -0700
commit560b355ccd038ca044726c9c9fcffd14d02e6696 (patch)
treeaeb1e8031bc3ca57a410c3d8c5d5f27cdc82e6a7 /unsafe
parentc032b0bf92130dc4facb003f0deaeb1228aefded (diff)
downloadspark-560b355ccd038ca044726c9c9fcffd14d02e6696.tar.gz
spark-560b355ccd038ca044726c9c9fcffd14d02e6696.tar.bz2
spark-560b355ccd038ca044726c9c9fcffd14d02e6696.zip
[SPARK-9157] [SQL] codegen substring
https://issues.apache.org/jira/browse/SPARK-9157 Author: Tarek Auel <tarek.auel@googlemail.com> Closes #7534 from tarekauel/SPARK-9157 and squashes the following commits: e65e3e9 [Tarek Auel] [SPARK-9157] indent fix 44e89f8 [Tarek Auel] [SPARK-9157] use EMPTY_UTF8 37d54c4 [Tarek Auel] Merge branch 'master' into SPARK-9157 60732ea [Tarek Auel] [SPARK-9157] created substringSQL in UTF8String 18c3576 [Tarek Auel] [SPARK-9157][SQL] remove slice pos 1a2e611 [Tarek Auel] [SPARK-9157][SQL] codegen substring
Diffstat (limited to 'unsafe')
-rw-r--r--unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java12
-rw-r--r--unsafe/src/test/java/org/apache/spark/unsafe/types/UTF8StringSuite.java19
2 files changed, 31 insertions, 0 deletions
diff --git a/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java b/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java
index ed354f7f87..946d355f1f 100644
--- a/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java
+++ b/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java
@@ -165,6 +165,18 @@ public final class UTF8String implements Comparable<UTF8String>, Serializable {
return fromBytes(bytes);
}
+ public UTF8String substringSQL(int pos, int length) {
+ // Information regarding the pos calculation:
+ // Hive and SQL use one-based indexing for SUBSTR arguments but also accept zero and
+ // negative indices for start positions. If a start index i is greater than 0, it
+ // refers to element i-1 in the sequence. If a start index i is less than 0, it refers
+ // to the -ith element before the end of the sequence. If a start index i is 0, it
+ // refers to the first element.
+ int start = (pos > 0) ? pos -1 : ((pos < 0) ? numChars() + pos : 0);
+ int end = (length == Integer.MAX_VALUE) ? Integer.MAX_VALUE : start + length;
+ return substring(start, end);
+ }
+
/**
* Returns whether this contains `substring` or not.
*/
diff --git a/unsafe/src/test/java/org/apache/spark/unsafe/types/UTF8StringSuite.java b/unsafe/src/test/java/org/apache/spark/unsafe/types/UTF8StringSuite.java
index 1f5572c509..e2a5628ff4 100644
--- a/unsafe/src/test/java/org/apache/spark/unsafe/types/UTF8StringSuite.java
+++ b/unsafe/src/test/java/org/apache/spark/unsafe/types/UTF8StringSuite.java
@@ -273,6 +273,25 @@ public class UTF8StringSuite {
}
@Test
+ public void substringSQL() {
+ UTF8String e = fromString("example");
+ assertEquals(e.substringSQL(0, 2), fromString("ex"));
+ assertEquals(e.substringSQL(1, 2), fromString("ex"));
+ assertEquals(e.substringSQL(0, 7), fromString("example"));
+ assertEquals(e.substringSQL(1, 2), fromString("ex"));
+ assertEquals(e.substringSQL(0, 100), fromString("example"));
+ assertEquals(e.substringSQL(1, 100), fromString("example"));
+ assertEquals(e.substringSQL(2, 2), fromString("xa"));
+ assertEquals(e.substringSQL(1, 6), fromString("exampl"));
+ assertEquals(e.substringSQL(2, 100), fromString("xample"));
+ assertEquals(e.substringSQL(0, 0), fromString(""));
+ assertEquals(e.substringSQL(100, 4), EMPTY_UTF8);
+ assertEquals(e.substringSQL(0, Integer.MAX_VALUE), fromString("example"));
+ assertEquals(e.substringSQL(1, Integer.MAX_VALUE), fromString("example"));
+ assertEquals(e.substringSQL(2, Integer.MAX_VALUE), fromString("xample"));
+ }
+
+ @Test
public void split() {
assertTrue(Arrays.equals(fromString("ab,def,ghi").split(fromString(","), -1),
new UTF8String[]{fromString("ab"), fromString("def"), fromString("ghi")}));