drill-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jacq...@apache.org
Subject [28/38] git commit: DRILL-366: While casting VarChar to BigInt make sure the getByte() method is invoked with the appropriate byte offset.
Date Tue, 04 Mar 2014 08:07:55 GMT
DRILL-366: While casting VarChar to BigInt make sure the getByte() method is invoked with the
appropriate byte offset.

CastFunctionsSrcVarLen.java:
Use in.start as starting index to invoke getBytes() instead of 0. We always end up with the
same row when we use 0

TestCastVarCharToBigInt.java, *.json
Added a test case to read varchar and convert it to BigInt.

Signed-off-by: Jacques Nadeau <jacques@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/ee9eaa13
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/ee9eaa13
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/ee9eaa13

Branch: refs/heads/master
Commit: ee9eaa13c31838be5e080e7915efbd25f0a1e310
Parents: ed9dec7
Author: Mehant Baid <mehantr@gmail.com>
Authored: Tue Feb 11 20:07:20 2014 -0800
Committer: Jacques Nadeau <jacques@apache.org>
Committed: Mon Mar 3 23:22:17 2014 -0800

----------------------------------------------------------------------
 .../templates/CastFunctionsSrcVarLen.java       |  18 ++--
 .../physical/impl/TestCastVarCharToBigInt.java  | 101 +++++++++++++++++++
 .../cast/test_cast_varchar_to_bigint.json       |  38 +++++++
 .../src/test/resources/scan_json_test_cast.json |   9 ++
 4 files changed, 157 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ee9eaa13/exec/java-exec/src/main/codegen/templates/CastFunctionsSrcVarLen.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/CastFunctionsSrcVarLen.java b/exec/java-exec/src/main/codegen/templates/CastFunctionsSrcVarLen.java
index 370597d..5855381 100644
--- a/exec/java-exec/src/main/codegen/templates/CastFunctionsSrcVarLen.java
+++ b/exec/java-exec/src/main/codegen/templates/CastFunctionsSrcVarLen.java
@@ -61,19 +61,19 @@ public class Cast${type.from}${type.to} implements DrillSimpleFunc{
       out.value = ${type.javaType}.parse${type.parse}(new String(buf));
       
     <#elseif type.to=="Int" || type.to == "BigInt">
-      int i = 0;
-      int length = in.end - in.start;    
-      
-      if (length==0) {
+
+      if ((in.end - in.start) ==0) {
         //empty, not a valid number
         byte[] buf = new byte[in.end - in.start];
         in.buffer.getBytes(in.start, buf, 0, in.end - in.start);  
         throw new NumberFormatException(new String(buf));  
       }
+
+      int readIndex = in.start;
+
+      boolean negative = in.buffer.getByte(readIndex) == '-';
       
-      boolean negative = in.buffer.getByte(0)=='-';
-      
-      if (negative && ++i == length ) {
+      if (negative && ++readIndex == in.end) {
         //only one single '-'
         byte[] buf = new byte[in.end - in.start];
         in.buffer.getBytes(in.start, buf, 0, in.end - in.start);  
@@ -85,8 +85,8 @@ public class Cast${type.from}${type.to} implements DrillSimpleFunc{
       ${type.primeType} result = 0;
       int digit;
       
-      while (i < length) {
-        digit = Character.digit(in.buffer.getByte(i++),radix);
+      while (readIndex < in.end) {
+        digit = Character.digit(in.buffer.getByte(readIndex++),radix);
         //not valid digit.
         if (digit == -1) {
           byte[] buf = new byte[in.end - in.start];

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ee9eaa13/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestCastVarCharToBigInt.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestCastVarCharToBigInt.java
b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestCastVarCharToBigInt.java
new file mode 100644
index 0000000..ba8b9da
--- /dev/null
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestCastVarCharToBigInt.java
@@ -0,0 +1,101 @@
+/**
+ * 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.drill.exec.physical.impl;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+
+import mockit.Injectable;
+import mockit.NonStrictExpectations;
+
+import org.apache.drill.common.config.DrillConfig;
+import org.apache.drill.common.expression.ExpressionPosition;
+import org.apache.drill.common.expression.SchemaPath;
+import org.apache.drill.common.util.FileUtils;
+import org.apache.drill.exec.client.DrillClient;
+import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry;
+import org.apache.drill.exec.memory.BufferAllocator;
+import org.apache.drill.exec.memory.TopLevelAllocator;
+import org.apache.drill.exec.ops.FragmentContext;
+import org.apache.drill.exec.physical.PhysicalPlan;
+import org.apache.drill.exec.physical.base.FragmentRoot;
+import org.apache.drill.exec.physical.impl.OperatorCreatorRegistry;
+import org.apache.drill.exec.physical.impl.ImplCreator;
+import org.apache.drill.exec.physical.impl.SimpleRootExec;
+import org.apache.drill.exec.planner.PhysicalPlanReader;
+import org.apache.drill.exec.pop.PopUnitTestBase;
+import org.apache.drill.exec.proto.BitControl;
+import org.apache.drill.exec.proto.CoordinationProtos;
+import org.apache.drill.exec.proto.ExecProtos.FragmentHandle;
+import org.apache.drill.exec.proto.UserProtos;
+import org.apache.drill.exec.record.RecordBatchLoader;
+import org.apache.drill.exec.record.VectorWrapper;
+import org.apache.drill.exec.rpc.user.QueryResultBatch;
+import org.apache.drill.exec.rpc.user.UserServer.UserClientConnection;
+import org.apache.drill.exec.server.Drillbit;
+import org.apache.drill.exec.server.DrillbitContext;
+import org.apache.drill.exec.server.RemoteServiceSet;
+import org.apache.drill.exec.vector.BigIntVector;
+import org.apache.drill.exec.vector.Float8Vector;
+
+import org.apache.drill.exec.vector.ValueVector;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
+import com.codahale.metrics.MetricRegistry;
+
+import java.util.List;
+
+
+public class TestCastVarCharToBigInt extends PopUnitTestBase {
+    static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestCastVarCharToBigInt.class);
+
+    @Test
+    public void testCastToBigInt() throws Exception {
+        try (RemoteServiceSet serviceSet = RemoteServiceSet.getLocalServiceSet();
+             Drillbit bit = new Drillbit(CONFIG, serviceSet);
+             DrillClient client = new DrillClient(CONFIG, serviceSet.getCoordinator())) {
+
+            // run query.
+            bit.run();
+            client.connect();
+            List<QueryResultBatch> results = client.runQuery(UserProtos.QueryType.PHYSICAL,
+                    Files.toString(FileUtils.getResourceAsFile("/functions/cast/test_cast_varchar_to_bigint.json"),
Charsets.UTF_8)
+                            .replace("#{TEST_FILE}", FileUtils.getResourceAsFile("/scan_json_test_cast.json").toURI().toString())
+            );
+
+            RecordBatchLoader batchLoader = new RecordBatchLoader(bit.getContext().getAllocator());
+
+            QueryResultBatch batch = results.get(0);
+            assertTrue(batchLoader.load(batch.getHeader().getDef(), batch.getData()));
+
+            batchLoader.getValueAccessorById(0, BigIntVector.class);
+
+            for (VectorWrapper<?> v : batchLoader) {
+
+                ValueVector.Accessor accessor = v.getValueVector().getAccessor();
+
+                assertEquals(accessor.getObject(0), 2008L);
+                assertEquals(accessor.getObject(1), 2007L);
+                assertEquals(accessor.getObject(2), 2006L);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ee9eaa13/exec/java-exec/src/test/resources/functions/cast/test_cast_varchar_to_bigint.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/functions/cast/test_cast_varchar_to_bigint.json
b/exec/java-exec/src/test/resources/functions/cast/test_cast_varchar_to_bigint.json
new file mode 100644
index 0000000..36439c5
--- /dev/null
+++ b/exec/java-exec/src/test/resources/functions/cast/test_cast_varchar_to_bigint.json
@@ -0,0 +1,38 @@
+{
+    head:{
+        type:"APACHE_DRILL_PHYSICAL",
+        version:"1",
+        generator:{
+            type:"manual"
+        }
+    },
+        graph:[
+        {
+            @id:1,
+            pop:"json-scan",
+            entries: [
+                {
+                    path : "#{TEST_FILE}"
+                }
+            ],
+            storageengine: {
+                "type": "json",
+                "dfsName": "file:///"
+            }
+        },
+        {
+            pop:"project",
+            @id:2,
+            child: 1,
+            exprs: [ {
+              ref: "INTEGER",
+              expr: "cast(integer as bigint)"
+            } ]
+        },
+        {
+            @id: 3,
+            child: 2,
+            pop: "screen"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ee9eaa13/exec/java-exec/src/test/resources/scan_json_test_cast.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/scan_json_test_cast.json b/exec/java-exec/src/test/resources/scan_json_test_cast.json
new file mode 100644
index 0000000..dd9119a
--- /dev/null
+++ b/exec/java-exec/src/test/resources/scan_json_test_cast.json
@@ -0,0 +1,9 @@
+{
+  "integer" : "2008"
+}
+{
+  "integer" : "2007"
+}
+{
+  "integer" : "2006"
+}
\ No newline at end of file


Mime
View raw message