You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by sa...@apache.org on 2015/08/12 18:01:14 UTC
phoenix git commit: PHOENIX-2142 Implement octet_length build-in
function for BINARY and VARBINARY(Shuxiong Ye)
Repository: phoenix
Updated Branches:
refs/heads/master c435bba8f -> 274eb42d4
PHOENIX-2142 Implement octet_length build-in function for BINARY and VARBINARY(Shuxiong Ye)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/274eb42d
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/274eb42d
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/274eb42d
Branch: refs/heads/master
Commit: 274eb42d41c3c545f28491d845ec6e0b20bdbe5b
Parents: c435bba
Author: Samarth <sa...@salesforce.com>
Authored: Wed Aug 12 09:00:57 2015 -0700
Committer: Samarth <sa...@salesforce.com>
Committed: Wed Aug 12 09:00:57 2015 -0700
----------------------------------------------------------------------
.../end2end/OctetLengthFunctionEnd2EndIT.java | 73 ++++++++++++++++++++
.../phoenix/expression/ExpressionType.java | 4 +-
.../function/OctetLengthFunction.java | 66 ++++++++++++++++++
.../phoenix/schema/types/PBinaryBase.java | 12 ++++
.../expression/OctetLengthFunctionTest.java | 67 ++++++++++++++++++
5 files changed, 221 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/274eb42d/phoenix-core/src/it/java/org/apache/phoenix/end2end/OctetLengthFunctionEnd2EndIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/OctetLengthFunctionEnd2EndIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OctetLengthFunctionEnd2EndIT.java
new file mode 100644
index 0000000..1239e7a
--- /dev/null
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OctetLengthFunctionEnd2EndIT.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.end2end;
+
+import static org.apache.phoenix.util.TestUtil.closeStmtAndConn;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import org.apache.phoenix.expression.function.OctetLengthFunction;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * End to end tests for {@link OctetLengthFunction}
+ */
+public class OctetLengthFunctionEnd2EndIT extends BaseHBaseManagedTimeIT {
+
+ private static final String KEY = "key";
+
+ @Before
+ public void initTable() throws Exception {
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ try {
+ conn = DriverManager.getConnection(getUrl());
+ String ddl;
+ ddl = "CREATE TABLE ta (k VARCHAR NOT NULL PRIMARY KEY, b BINARY(4), vb VARBINARY)";
+ conn.createStatement().execute(ddl);
+ conn.commit();
+ } finally {
+ closeStmtAndConn(stmt, conn);
+ }
+ }
+
+ @Test
+ public void test() throws Exception {
+ Connection conn = DriverManager.getConnection(getUrl());
+ PreparedStatement stmt = conn.prepareStatement("UPSERT INTO ta VALUES (?, ?, ?)");
+ stmt.setString(1, KEY);
+ stmt.setBytes(2, new byte[] { 1, 2, 3, 4 });
+ stmt.setBytes(3, new byte[] { 1, 2, 3, 4 });
+ stmt.executeUpdate();
+ conn.commit();
+ ResultSet rs =
+ conn.createStatement()
+ .executeQuery(
+ "SELECT OCTET_LENGTH(vb), OCTET_LENGTH(b) FROM ta WHERE OCTET_LENGTH(vb)=4 and OCTET_LENGTH(b)=4");
+ assertTrue(rs.next());
+ assertEquals(4, rs.getInt(1));
+ assertEquals(4, rs.getInt(2));
+ assertTrue(!rs.next());
+ }
+}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/274eb42d/phoenix-core/src/main/java/org/apache/phoenix/expression/ExpressionType.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/ExpressionType.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/ExpressionType.java
index 5dbab69..dbe2509 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/expression/ExpressionType.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/ExpressionType.java
@@ -72,6 +72,7 @@ import org.apache.phoenix.expression.function.MinuteFunction;
import org.apache.phoenix.expression.function.MonthFunction;
import org.apache.phoenix.expression.function.NowFunction;
import org.apache.phoenix.expression.function.NthValueFunction;
+import org.apache.phoenix.expression.function.OctetLengthFunction;
import org.apache.phoenix.expression.function.PercentRankAggregateFunction;
import org.apache.phoenix.expression.function.PercentileContAggregateFunction;
import org.apache.phoenix.expression.function.PercentileDiscAggregateFunction;
@@ -261,7 +262,8 @@ public enum ExpressionType {
GetByteFunction(GetByteFunction.class),
SetByteFunction(SetByteFunction.class),
GetBitFunction(GetBitFunction.class),
- SetBitFunction(SetBitFunction.class)
+ SetBitFunction(SetBitFunction.class),
+ OctetLengthFunction(OctetLengthFunction.class),
;
ExpressionType(Class<? extends Expression> clazz) {
http://git-wip-us.apache.org/repos/asf/phoenix/blob/274eb42d/phoenix-core/src/main/java/org/apache/phoenix/expression/function/OctetLengthFunction.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/function/OctetLengthFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/OctetLengthFunction.java
new file mode 100644
index 0000000..ef20734
--- /dev/null
+++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/function/OctetLengthFunction.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.expression.function;
+
+import java.sql.SQLException;
+import java.util.List;
+
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.phoenix.expression.Expression;
+import org.apache.phoenix.parse.FunctionParseNode.Argument;
+import org.apache.phoenix.parse.FunctionParseNode.BuiltInFunction;
+import org.apache.phoenix.schema.tuple.Tuple;
+import org.apache.phoenix.schema.types.PBinary;
+import org.apache.phoenix.schema.types.PBinaryBase;
+import org.apache.phoenix.schema.types.PDataType;
+import org.apache.phoenix.schema.types.PInteger;
+import org.apache.phoenix.schema.types.PVarbinary;
+
+@BuiltInFunction(name = OctetLengthFunction.NAME, args = { @Argument(allowedTypes = {
+ PBinary.class, PVarbinary.class }), })
+public class OctetLengthFunction extends ScalarFunction {
+
+ public static final String NAME = "OCTET_LENGTH";
+
+ public OctetLengthFunction() {
+ }
+
+ public OctetLengthFunction(List<Expression> children) throws SQLException {
+ super(children);
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public boolean evaluate(Tuple tuple, ImmutableBytesWritable ptr) {
+ // get binary data parameter
+ Expression dataExpr = children.get(0);
+ if (!dataExpr.evaluate(tuple, ptr)) return false;
+ // set result
+ ((PBinaryBase) dataExpr.getDataType()).octetLength(ptr, dataExpr.getSortOrder(), ptr);
+ return true;
+ }
+
+ @Override
+ public PDataType getDataType() {
+ return PInteger.INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/274eb42d/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PBinaryBase.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PBinaryBase.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PBinaryBase.java
index ec0793e..0ad4ce1 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PBinaryBase.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/types/PBinaryBase.java
@@ -83,4 +83,16 @@ public abstract class PBinaryBase extends PDataType<byte[]> {
ret = (byte) ((ret & (~(1 << (off % Byte.SIZE)))) | (newValue << (off % Byte.SIZE)));
setByte(bytes, offset, length, sortOrder, off / Byte.SIZE, ret, outPtr);
}
+
+ public void octetLength(ImmutableBytesWritable ptr, SortOrder sortOrder,
+ ImmutableBytesWritable outPtr) {
+ octetLength(ptr.get(), ptr.getOffset(), ptr.getLength(), sortOrder, outPtr);
+ }
+
+ public void octetLength(byte[] bytes, int offset, int length, SortOrder sortOrder,
+ ImmutableBytesWritable outPtr) {
+ bytes = new byte[PInteger.INSTANCE.getByteSize()];
+ PInteger.INSTANCE.getCodec().encodeInt(length, bytes, 0);
+ outPtr.set(bytes);
+ }
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/274eb42d/phoenix-core/src/test/java/org/apache/phoenix/expression/OctetLengthFunctionTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/expression/OctetLengthFunctionTest.java b/phoenix-core/src/test/java/org/apache/phoenix/expression/OctetLengthFunctionTest.java
new file mode 100644
index 0000000..9211777
--- /dev/null
+++ b/phoenix-core/src/test/java/org/apache/phoenix/expression/OctetLengthFunctionTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.expression;
+
+import static org.junit.Assert.assertEquals;
+
+import java.sql.SQLException;
+import java.util.List;
+
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.phoenix.expression.function.OctetLengthFunction;
+import org.apache.phoenix.schema.SortOrder;
+import org.apache.phoenix.schema.types.PBinary;
+import org.apache.phoenix.schema.types.PBinaryBase;
+import org.apache.phoenix.schema.types.PVarbinary;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Unit tests for {@link OctetLengthFunction}
+ */
+public class OctetLengthFunctionTest {
+ private void testOctetLengthExpression(Expression data, int expected) throws SQLException {
+ List<Expression> expressions = Lists.newArrayList(data);
+ Expression octetLengthFunction = new OctetLengthFunction(expressions);
+ ImmutableBytesWritable ptr = new ImmutableBytesWritable();
+ octetLengthFunction.evaluate(null, ptr);
+ Integer result =
+ (Integer) octetLengthFunction.getDataType().toObject(ptr,
+ octetLengthFunction.getSortOrder());
+ assertEquals(expected, result.intValue());
+ }
+
+ private void testOctetLength(byte[] bytes, PBinaryBase dataType, int expected)
+ throws SQLException {
+ LiteralExpression dataExpr;
+ dataExpr = LiteralExpression.newConstant(bytes, dataType, SortOrder.ASC);
+ testOctetLengthExpression(dataExpr, expected);
+ dataExpr = LiteralExpression.newConstant(bytes, dataType, SortOrder.DESC);
+ testOctetLengthExpression(dataExpr, expected);
+ }
+
+ @Test
+ public void testByteBatch() throws SQLException {
+ for (int len = 0; len < 300; ++len) {
+ byte[] bytes = new byte[len];
+ testOctetLength(bytes, PBinary.INSTANCE, bytes.length);
+ testOctetLength(bytes, PVarbinary.INSTANCE, bytes.length);
+ }
+ }
+}