You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2013/11/30 15:16:13 UTC

[1/7] git commit: TAJO-279: Improving the query_executor page of web UI. (Wan Heo via jihoon)

Updated Branches:
  refs/heads/DAG-execplan 6532324b0 -> 0cbd968ca


TAJO-279: Improving the query_executor page of web UI. (Wan Heo via jihoon)


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

Branch: refs/heads/DAG-execplan
Commit: 87437f1718e5e55ca4eb4517fcb3a00707cbc5a9
Parents: 1f80cd2
Author: Jihoon Son <ji...@apache.org>
Authored: Thu Nov 28 21:27:33 2013 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Thu Nov 28 21:27:33 2013 +0900

----------------------------------------------------------------------
 .../tajo/webapp/QueryExecutorServlet.java       |  19 ++-
 .../webapps/admin/WEB-INF/jetty-web.xml         |  23 ++++
 .../src/main/resources/webapps/admin/getCSV.jsp |  31 +++++
 .../resources/webapps/admin/query_executor.jsp  | 131 +++++++++++++++++--
 4 files changed, 194 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/87437f17/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
index c95ff14..d1670c4 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
@@ -6,6 +6,7 @@ import org.apache.hadoop.util.StringUtils;
 import org.apache.tajo.QueryId;
 import org.apache.tajo.TajoProtos;
 import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.client.QueryStatus;
 import org.apache.tajo.client.TajoClient;
 import org.apache.tajo.conf.TajoConf;
@@ -114,6 +115,11 @@ public class QueryExecutorServlet extends HttpServlet {
           }
         }
         QueryRunner queryRunner = new QueryRunner(queryRunnerId, query);
+        try {
+          queryRunner.sizeLimit = Integer.parseInt(request.getParameter("limitSize"));
+        } catch (java.lang.NumberFormatException nfe) {
+          queryRunner.sizeLimit = 1048576;
+        }
         synchronized(queryRunners) {
           queryRunners.put(queryRunnerId, queryRunner);
         }
@@ -150,6 +156,8 @@ public class QueryExecutorServlet extends HttpServlet {
             errorResponse(response, queryRunner.error);
             return;
           }
+          returnValue.put("numOfRows", queryRunner.numOfRows);
+          returnValue.put("resultSize", queryRunner.resultSize);
           returnValue.put("resultData", queryRunner.queryResult);
           returnValue.put("resultColumns", queryRunner.columnNames);
           returnValue.put("runningTime", JSPUtil.getElapsedTime(queryRunner.startTime, queryRunner.finishTime));
@@ -217,6 +225,9 @@ public class QueryExecutorServlet extends HttpServlet {
     AtomicBoolean stop = new AtomicBoolean(false);
     QueryId queryId;
     String query;
+    long resultSize;
+    int sizeLimit;
+    long numOfRows;
     Exception error;
 
     AtomicInteger progress = new AtomicInteger(0);
@@ -311,6 +322,7 @@ public class QueryExecutorServlet extends HttpServlet {
               try {
                 ResultSetMetaData rsmd = res.getMetaData();
                 TableDesc desc = tajoClient.getResultDesc(tajoQueryId);
+                resultSize = desc.getStats().getNumBytes();
                 LOG.info("Tajo Query Result: " + desc.getPath() + "\n");
 
                 int numOfColumns = rsmd.getColumnCount();
@@ -319,10 +331,15 @@ public class QueryExecutorServlet extends HttpServlet {
                 }
                 queryResult = new ArrayList<List<Object>>();
 
+                if(sizeLimit < resultSize) {
+                    numOfRows = (long)((float)(desc.getStats().getNumRows()) * ((float)sizeLimit / (float)resultSize));
+                } else {
+                    numOfRows = desc.getStats().getNumRows();
+                }
                 int rowCount = 0;
                 boolean hasMoreData = false;
                 while (res.next()) {
-                  if(rowCount > 1000) {
+                  if(rowCount > numOfRows) {
                     hasMoreData = true;
                     break;
                   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/87437f17/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/WEB-INF/jetty-web.xml
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/WEB-INF/jetty-web.xml b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/WEB-INF/jetty-web.xml
new file mode 100644
index 0000000..7221fbc
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/WEB-INF/jetty-web.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
+  "http://jetty.mortbay.org/configure.dtd">
+<Configure id="WebAppContext" class="org.mortbay.jetty.webapp.WebAppContext">
+  <Set name="maxFormContentSize" type="int">2147483647</Set>
+</Configure>

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/87437f17/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/getCSV.jsp
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/getCSV.jsp b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/getCSV.jsp
new file mode 100644
index 0000000..f398304
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/getCSV.jsp
@@ -0,0 +1,31 @@
+<%
+  /*
+  * 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.
+  */
+%>
+<%@ page language = "java" contentType = "charset=utf-8" %>
+<%
+  response.setHeader("Content-Type", "application/octet-stream;");
+  response.setHeader("Content-Disposition", "attachment; filename=\"result.csv\";");
+  response.setHeader("Content-Description", "JSP Generated Data");
+  response.setHeader("cache-control", "no-cache");
+  response.setHeader("expires", "0");
+  response.setHeader("pragma", "no-cache");
+  out.print(request.getParameter("csvData"));
+  out.flush();
+%>
+

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/87437f17/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/query_executor.jsp
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/query_executor.jsp b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/query_executor.jsp
index 21e0309..9e5fa99 100644
--- a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/query_executor.jsp
+++ b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/query_executor.jsp
@@ -18,7 +18,6 @@
   */
 %>
 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
 <%@ page import="java.util.*" %>
 <%@ page import="org.apache.tajo.webapp.StaticHttpServer" %>
 <%@ page import="org.apache.tajo.master.*" %>
@@ -35,7 +34,6 @@
 <link rel="stylesheet" type = "text/css" href = "/static/style.css" />
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Tajo</title>
-
 <style type="text/css">
   #progress_bar {
     border:1px solid #000000;
@@ -45,13 +43,16 @@
     border-radius: 16px;
   }
   #progress_status {background:#fbcb46; width:0%; height:16px; border-radius: 10px; }
-
 </style>
 <script src="/static/js/jquery.js" type="text/javascript"></script>
 <script type="text/javascript">
 var progressInterval = 1000;
 var progressTimer = null;
 var queryRunnerId = null;
+var PRINT_LIMIT = 25;
+var SIZE_LIMIT = 104857600; // Limit size of displayed results.(Bytes)
+var pageNum = 0;
+var pageCount, storedColumns, storedData;
 
 $(document).ready(function() {
   $('#btnSubmit').click(function() {
@@ -66,7 +67,16 @@ function init() {
   $("#queryResult").html("");
   queryRunnerId = null;
 }
+
 function runQuery() {
+  if(Math.ceil(Number($("#sizeLimit").val())) >= 2048) {
+    SIZE_LIMIT = 2048 * 1024 * 1024 - 1;
+  } else if(Math.ceil(Number($("#sizeLimit").val())) > 0) {
+    SIZE_LIMIT = Number($("#sizeLimit").val()) * 1024 * 1024;
+  }
+  if(Math.ceil(Number($("#printLimit").val())) > 0) {
+    PRINT_LIMIT = Number($("#printLimit").val());
+  }
   if(progressTimer != null) {
     alert("Already query running.");
     return;
@@ -77,7 +87,7 @@ function runQuery() {
   $.ajax({
     type: "POST",
     url: "query_exec",
-    data: { action: "runQuery", query: query}
+    data: { action: "runQuery", query: query, limitSize:SIZE_LIMIT }
   })
   .done(function(msg) {
     var resultJson = $.parseJSON(msg);
@@ -139,17 +149,21 @@ function getResult() {
     data: { action: "getQueryResult", queryRunnerId: queryRunnerId }
   })
   .done(function(msg) {
+    var printedLine = 0;
     var resultJson = $.parseJSON(msg);
     if(resultJson.success == "false") {
       alert(resultJson.errorMessage);
       $("#queryStatus").html(getQueryStatusHtml(resultJson));
       return;
     }
-    console.log(resultJson);
     $("#queryResult").html("");
     var resultColumns = resultJson.resultColumns;
     var resultData = resultJson.resultData;
-
+	
+    storedColumns = resultColumns;
+    storedData = resultData; 
+    pageCount = Math.ceil((storedData.length / PRINT_LIMIT)) - 1 ;
+	
     var resultTable = "<table width='100%' class='border_table'><tr>";
     for(var i = 0; i < resultColumns.length; i++) {
       resultTable += "<th>" + resultColumns[i] + "</th>";
@@ -160,11 +174,102 @@ function getResult() {
       for(var j = 0; j < resultData[i].length; j++) {
         resultTable += "<td>" + resultData[i][j] + "</td>";
       }
-      resultTable += "</tr>";
+      resultTable += "</tr>";	  
+      if(++printedLine >= PRINT_LIMIT) break;
     }
     resultTable += "</table>";
     $("#queryResult").html(resultTable);
-  });
+    $("#queryResultTools").html("");
+    $("#queryResultTools").append("<input type='button' value='Download to CSV' onclick='getCSV();'/> ");
+    $("#queryResultTools").append("<input type='button' value='Prev' onclick='getPrev();'/> ");
+    $("#queryResultTools").append("<input type='button' value='Next' onclick='getNext();'/> ");
+    var selectPage = "<select id='selectPage'>";
+    for(var i = 0; i <= pageCount; i++) {
+      selectPage += "<option value="+i+">"+(i+1)+"</option>";
+    }
+    selectPage += "</select>";
+    $("#queryResultTools").append(selectPage);
+    $("#selectPage").change(getSelectedPage);
+  })
+}
+
+function getCSV() {
+  var csvData = "";
+  var rowCount = storedData.length;
+  var colCount = storedColumns.length;
+  for(var colIndex = 0; colIndex < colCount; colIndex++) {
+    if(colIndex == 0) {
+      csvData += storedColumns[colIndex];  
+    } else {
+      csvData += "," + storedColumns[colIndex];
+    }
+  }
+  csvData += "\n";
+  for(var rowIndex=0; rowIndex < rowCount; rowIndex++) {
+    for(var colIndex = 0; colIndex < colCount; colIndex++){
+      if(colIndex == 0) {
+        csvData += storedData[rowIndex][colIndex];
+      } else {
+        csvData += "," + storedData[rowIndex][colIndex];
+      }
+    }   
+    csvData += "\n";
+  }
+  $("#csvData").val(csvData);
+  $("#dataForm").submit();  
+}
+
+function getNext() {
+	var printedLine = 0;	
+	if(pageCount > pageNum) {
+		pageNum++;
+		document.getElementById("selectPage").options.selectedIndex = pageNum;
+	}else {
+		alert("There's no next page.");
+		return;
+	}
+	getPage();
+}
+
+function getPrev() {
+	if(pageNum > 0  ) {
+		pageNum--;
+		document.getElementById("selectPage").options.selectedIndex = pageNum;
+	} else {
+		alert("There's no previous page.");
+		return;
+	}
+	getPage();
+}
+
+function getSelectedPage() {
+  if(pageNum >= 0 &&  pageNum <= pageCount ) {
+    pageNum = $("#selectPage option:selected").val();
+  } else {
+    alert("Out of range.");
+    return;
+  }
+  getPage();
+}
+
+function getPage() {
+  var printedLine = 0;
+  $("#queryResult").html("");
+  var resultTable = "<table width='100%' class='border_table'><tr>";
+  for(var i = 0; i < storedColumns.length; i++) {
+    resultTable += "<th>" + storedColumns[i] + "</th>";
+  }
+  resultTable += "</tr>";
+  for(var i = pageNum * PRINT_LIMIT; i < storedData.length; i++) {
+    resultTable += "<tr>";
+    for(var j = 0; j < storedData[i].length; j++) {
+      resultTable += "<td>" + storedData[i][j] + "</td>";
+    }
+    resultTable += "</tr>";
+    if(++printedLine >= PRINT_LIMIT) break;
+  }
+  resultTable += "</table>";
+  $("#queryResult").html(resultTable);
 }
 
 </script>
@@ -177,7 +282,11 @@ function getResult() {
   <hr/>
   <h3>Query</h3>
   <textarea id="query" style="width:800px; height:250px; font-family:Tahoma; font-size:12px;"></textarea>
-  <p/>
+  <p />
+  Limit : <input id="sizeLimit" type="text" value="10" style="width:30px; text-align:center;" /> MB
+  <p />
+  Rows/Page : <input id="printLimit" type="text" value="25" style="width:30px; text-align:center;" />
+  <hr />
   <input id="btnSubmit" type="submit" value="Submit">
   <hr/>
   <div>
@@ -197,6 +306,10 @@ function getResult() {
   <hr/>
   <h3>Query Result</h3>
   <div id="queryResult"></div>
+  <hr/>
+  <div id="queryResultTools"></div>
+  <hr/>
+  <div style="dispaly:none;"><form name="dataForm" id="dataForm" method="post" action="getCSV.jsp"><input type="hidden" id="csvData" name="csvData" value="" /></div>
 </div>
 </body>
 </html>


[3/7] git commit: TAJO-341: Implement substr function. (hyoungjunkim via hyunsik)

Posted by ji...@apache.org.
TAJO-341: Implement substr function. (hyoungjunkim via hyunsik)


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

Branch: refs/heads/DAG-execplan
Commit: f9a6e9ca3dbfc7c518ad6f0d3b1c9fe3196b654e
Parents: 2e27a02
Author: Hyunsik Choi <hy...@apache.org>
Authored: Sat Nov 30 14:49:53 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Sat Nov 30 14:49:53 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 .../tajo/engine/function/string/Substr.java     | 75 ++++++++++++++++++++
 .../java/org/apache/tajo/master/TajoMaster.java |  5 ++
 .../TestStringOperatorsAndFunctions.java        | 32 +++++++++
 4 files changed, 114 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/f9a6e9ca/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 3cee24e..0242e99 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,8 @@ Release 0.8.0 - unreleased
 
   NEW FEATURES
 
+    TAJO-341: Implement substr function. (hyoungjunkim via hyunsik)
+
     TAJO-308: Implement length(string) function. (hyoungjunkim via hyunsik)
 
     TAJO-200: RCFile compatible to apache hive. (jinho)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/f9a6e9ca/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java
new file mode 100644
index 0000000..cb42e3c
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java
@@ -0,0 +1,75 @@
+/**
+ * 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.tajo.engine.function.string;
+
+import org.apache.tajo.catalog.Column;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.storage.Tuple;
+
+/**
+ * Function definition
+ *
+ * text substr(string text, from int4 [, length int4])
+ */
+public class Substr extends GeneralFunction {
+  public Substr() {
+    super(new Column[] {
+        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("from", TajoDataTypes.Type.INT4),
+        new Column("length", TajoDataTypes.Type.INT4)    //optional
+    });
+  }
+
+  @Override
+  public Datum eval(Tuple params) {
+    Datum valueDatum = params.get(0);
+    if(valueDatum instanceof NullDatum) {
+      return NullDatum.get();
+    }
+    Datum fromDatum = params.get(1);
+    Datum lengthDatum = params.size() > 2 ? params.get(2) : null;
+
+    String value = valueDatum.asChars();
+    int valueLength = value.length();
+
+    int from = fromDatum.asInt4() - 1;
+    if (from >= valueLength) {
+      return DatumFactory.createText("");
+    }
+
+    int length = (lengthDatum == null) ? valueLength : lengthDatum.asInt4();
+
+    if (from < 0) {
+      from = 0;
+      length = (lengthDatum == null) ? value.length() : length - 1;
+    }
+
+    int to = from + length;
+
+    if (to > valueLength) {
+      to = valueLength;
+    }
+
+    return DatumFactory.createText(value.substring(from, to));
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/f9a6e9ca/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
index b634f25..f91cc0b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
@@ -399,6 +399,11 @@ public class TajoMaster extends CompositeService {
             CatalogUtil.newSimpleDataType(Type.INT4),
             CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
 
+    sqlFuncs.add(
+        new FunctionDesc("substr", Substr.class, FunctionType.GENERAL,
+            CatalogUtil.newSimpleDataType(Type.TEXT),
+            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.INT4, Type.INT4)));
+
     return sqlFuncs;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/f9a6e9ca/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
index 5124173..5e73f88 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
@@ -190,4 +190,36 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testEval(schema, "table1", "ABC,DEF,3.14", "select length(lower(col1) || lower(col2)) from table1",
         new String[]{"6"});
   }
+
+  @Test
+  public void testSubstr() throws IOException {
+    testSimpleEval("select substr('abcdef', 3, 2) as col1 ", new String[]{"cd"});
+    testSimpleEval("select substr('abcdef', 3) as col1 ", new String[]{"cdef"});
+    testSimpleEval("select substr('abcdef', 1, 1) as col1 ", new String[]{"a"});
+    testSimpleEval("select substr('abcdef', 0, 1) as col1 ", new String[]{""});
+    testSimpleEval("select substr('abcdef', 0, 2) as col1 ", new String[]{"a"});
+    testSimpleEval("select substr('abcdef', 0) as col1 ", new String[]{"abcdef"});
+    testSimpleEval("select substr('abcdef', 1, 100) as col1 ", new String[]{"abcdef"});
+    testSimpleEval("select substr('abcdef', 0, 100) as col1 ", new String[]{"abcdef"});
+    testSimpleEval("select substr('일이삼사오', 2, 2) as col1 ", new String[]{"이삼"});
+    testSimpleEval("select substr('일이삼사오', 3) as col1 ", new String[]{"삼사오"});
+
+    //TODO If there is a minus value in function argument, next error occurred.
+    //org.apache.tajo.engine.parser.SQLSyntaxError: ERROR: syntax error at or near 'substr'
+    //LINE 1:7 select substr('abcdef', -1, 100) as col1
+    //               ^^^^^^
+    //at org.apache.tajo.engine.parser.SQLAnalyzer.parse(SQLAnalyzer.java:64)
+
+//    testSimpleEval("select substr('abcdef', -1) as col1 ", new String[]{"abcdef"});
+//    testSimpleEval("select substr('abcdef', -1, 100) as col1 ", new String[]{"abcdef"});
+//    testSimpleEval("select substr('abcdef', -1, 3) as col1 ", new String[]{"a"});
+//    testSimpleEval("select substr('abcdef', -1, 1) as col1 ", new String[]{""});
+
+    Schema schema = new Schema();
+    schema.addColumn("col1", TEXT);
+    schema.addColumn("col2", TEXT);
+    schema.addColumn("col3", TEXT);
+    testEval(schema, "table1", ",abcdef,3.14", "select substr(lower(col2), 2, 3) from table1",
+        new String[]{"bcd"});
+  }
 }


[5/7] git commit: TAJO-345: MergeScanner should support projectable storages. (jihoon)

Posted by ji...@apache.org.
TAJO-345: MergeScanner should support projectable storages. (jihoon)


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

Branch: refs/heads/DAG-execplan
Commit: 1191003ef2f20acdfa84490eb314a0e8c5d510de
Parents: a26c588
Author: Jihoon Son <ji...@apache.org>
Authored: Sat Nov 30 23:02:00 2013 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Sat Nov 30 23:02:00 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 .../engine/planner/physical/SeqScanExec.java    |  2 +-
 .../org/apache/tajo/storage/MergeScanner.java   | 49 ++++++++++++++------
 .../apache/tajo/storage/TestMergeScanner.java   | 33 +++++++++++--
 4 files changed, 66 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1191003e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 0242e99..e647794 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -50,6 +50,8 @@ Release 0.8.0 - unreleased
 
   BUG FIXES
 
+    TAJO-345: MergeScanner should support projectable storages. (jihoon)
+
     TAJO-290: TajoDataType.Type.NULL should be NULL_TYPE. (DaeMyung Kang via jinho)
 
     TAJO-332: Invalid row count of CSVScanner. (jinho)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1191003e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
index 22af472..5783080 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
@@ -92,7 +92,7 @@ public class SeqScanExec extends PhysicalExec {
     if (fragments.length > 1) {
       this.scanner = new MergeScanner(context.getConf(), plan.getTableSchema(), plan.getTableDesc().getMeta(),
           FragmentConvertor.<FileFragment>convert(context.getConf(), plan.getTableDesc().getMeta().getStoreType(),
-              fragments));
+              fragments), projected);
     } else {
       this.scanner = StorageManagerFactory.getStorageManager(
           context.getConf()).getScanner(plan.getTableDesc().getMeta(), plan.getTableSchema(), fragments[0], projected);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1191003e/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/MergeScanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/MergeScanner.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/MergeScanner.java
index 2caa737..7082005 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/MergeScanner.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/MergeScanner.java
@@ -23,11 +23,9 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableMeta;
-import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.storage.fragment.FileFragment;
 import org.apache.tajo.storage.fragment.Fragment;
-import org.apache.tajo.storage.fragment.FragmentConvertor;
 
 import java.io.IOException;
 import java.util.Collection;
@@ -43,9 +41,18 @@ public class MergeScanner implements Scanner {
   private FileFragment currentFragment;
   private Scanner currentScanner;
   private Tuple tuple;
+  private boolean projectable = false;
+  private boolean selectable = false;
+  private Schema target;
 
   public MergeScanner(Configuration conf, Schema schema, TableMeta meta, Collection<FileFragment> rawFragmentList)
       throws IOException {
+    this(conf, schema, meta, rawFragmentList, schema);
+  }
+
+  public MergeScanner(Configuration conf, Schema schema, TableMeta meta, Collection<FileFragment> rawFragmentList,
+                      Schema target)
+      throws IOException {
     this.conf = conf;
     this.schema = schema;
     this.meta = meta;
@@ -54,7 +61,12 @@ public class MergeScanner implements Scanner {
       fragments.add((FileFragment) f);
     }
 
-    iterator = this.fragments.iterator();
+    this.target = target;
+    this.reset();
+    if (currentScanner != null) {
+      this.projectable = currentScanner.isProjectable();
+      this.selectable = currentScanner.isSelectable();
+    }
   }
 
   @Override
@@ -68,27 +80,33 @@ public class MergeScanner implements Scanner {
 
     if (tuple != null) {
       return tuple;
-    } else if (iterator.hasNext()) {
+    } else {
       if (currentScanner != null) {
         currentScanner.close();
       }
-      currentFragment = iterator.next();
-      currentScanner = StorageManagerFactory.getStorageManager((TajoConf)conf).getScanner(meta, schema,
-          currentFragment);
-      currentScanner.init();
-      return currentScanner.next();
-    } else {
-      return null;
+      currentScanner = getNextScanner();
+      if (currentScanner != null) {
+        tuple = currentScanner.next();
+      }
     }
+    return tuple;
   }
 
   @Override
   public void reset() throws IOException {
-    iterator = fragments.iterator();
+    this.iterator = fragments.iterator();
+    this.currentScanner = getNextScanner();
+  }
+
+  private Scanner getNextScanner() throws IOException {
     if (iterator.hasNext()) {
       currentFragment = iterator.next();
       currentScanner = StorageManagerFactory.getStorageManager((TajoConf)conf).getScanner(meta, schema,
-          currentFragment);
+          currentFragment, target);
+      currentScanner.init();
+      return currentScanner;
+    } else {
+      return null;
     }
   }
 
@@ -105,16 +123,17 @@ public class MergeScanner implements Scanner {
 
   @Override
   public boolean isProjectable() {
-    return false;
+    return projectable;
   }
 
   @Override
   public void setTarget(Column[] targets) {
+    this.target = new Schema(targets);
   }
 
   @Override
   public boolean isSelectable() {
-    return false;
+    return selectable;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/1191003e/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestMergeScanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestMergeScanner.java b/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestMergeScanner.java
index 18dcb2e..f2a66d9 100644
--- a/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestMergeScanner.java
+++ b/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestMergeScanner.java
@@ -44,7 +44,7 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 @RunWith(Parameterized.class)
 public class TestMergeScanner {
@@ -76,6 +76,7 @@ public class TestMergeScanner {
   public void setup() throws Exception {
     conf = new TajoConf();
     conf.setVar(ConfVars.ROOT_DIR, TEST_PATH);
+    conf.setStrings("tajo.storage.projectable-scanner", "rcfile", "trevni");
     testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     fs = testDir.getFileSystem(conf);
     sm = StorageManagerFactory.getStorageManager(conf, testDir);
@@ -140,15 +141,39 @@ public class TestMergeScanner {
     FileFragment[] fragment = new FileFragment[2];
     fragment[0] = new FileFragment("tablet1", table1Path, 0, status1.getLen());
     fragment[1] = new FileFragment("tablet1", table2Path, 0, status2.getLen());
-    
-    Scanner scanner = new MergeScanner(conf, schema, meta, TUtil.<FileFragment>newList(fragment));
+
+    Schema targetSchema = new Schema();
+    targetSchema.addColumn(schema.getColumn(0));
+    targetSchema.addColumn(schema.getColumn(2));
+
+    Scanner scanner = new MergeScanner(conf, schema, meta, TUtil.<FileFragment>newList(fragment), targetSchema);
+    assertEquals(isProjectableStorage(meta.getStoreType()), scanner.isProjectable());
+
     scanner.init();
     int totalCounts = 0;
-    while (scanner.next() != null) {
+    Tuple tuple;
+    while ((tuple=scanner.next()) != null) {
       totalCounts++;
+      if (isProjectableStorage(meta.getStoreType())) {
+        assertNotNull(tuple.get(0));
+        assertNull(tuple.get(1));
+        assertNotNull(tuple.get(2));
+        assertNull(tuple.get(3));
+      }
     }
     scanner.close();
     
     assertEquals(tupleNum * 2, totalCounts);
 	}
+
+  private static boolean isProjectableStorage(StoreType type) {
+    switch (type) {
+      case RCFILE:
+      case TREVNI:
+      case CSV:
+        return true;
+      default:
+        return false;
+    }
+  }
 }
\ No newline at end of file


[2/7] git commit: TAJO-290: TajoDataType.Type.NULL should be NULL_TYPE. (DaeMyung Kang via jinho)

Posted by ji...@apache.org.
TAJO-290: TajoDataType.Type.NULL should be NULL_TYPE. (DaeMyung Kang via jinho)


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

Branch: refs/heads/DAG-execplan
Commit: 2e27a0232ac1bf48fe277a22a818d282866216c7
Parents: 87437f1
Author: jinossy <ji...@gmail.com>
Authored: Fri Nov 29 11:29:18 2013 +0900
Committer: jinossy <ji...@gmail.com>
Committed: Fri Nov 29 11:29:18 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 ++
 .../java/org/apache/tajo/datum/CharDatum.java   |  4 ++--
 .../org/apache/tajo/datum/DatumFactory.java     |  2 +-
 .../java/org/apache/tajo/datum/Float4Datum.java | 14 +++++++-------
 .../java/org/apache/tajo/datum/Float8Datum.java | 14 +++++++-------
 .../java/org/apache/tajo/datum/Int2Datum.java   | 20 +++++++++-----------
 .../java/org/apache/tajo/datum/Int4Datum.java   | 14 +++++++-------
 .../java/org/apache/tajo/datum/Int8Datum.java   | 14 +++++++-------
 .../java/org/apache/tajo/datum/NullDatum.java   |  2 +-
 .../java/org/apache/tajo/datum/TextDatum.java   |  4 ++--
 tajo-common/src/main/proto/DataTypes.proto      |  4 ++--
 .../apache/tajo/engine/eval/FunctionEval.java   |  2 +-
 .../org/apache/tajo/engine/eval/IsNullEval.java |  4 +---
 .../storage/BinarySerializeDeserialize.java     |  2 +-
 .../java/org/apache/tajo/storage/RawFile.java   |  4 ++--
 .../java/org/apache/tajo/storage/RowFile.java   |  2 +-
 .../tajo/storage/TextSerializeDeserialize.java  |  2 +-
 .../tajo/storage/trevni/TrevniAppender.java     |  4 ++--
 .../tajo/storage/trevni/TrevniScanner.java      |  2 +-
 .../org/apache/tajo/storage/TestLazyTuple.java  |  2 +-
 .../org/apache/tajo/storage/TestStorages.java   |  6 +++---
 .../apache/tajo/storage/v2/TestStorages.java    |  2 +-
 22 files changed, 62 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 0a7dd47..3cee24e 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -48,6 +48,8 @@ Release 0.8.0 - unreleased
 
   BUG FIXES
 
+    TAJO-290: TajoDataType.Type.NULL should be NULL_TYPE. (DaeMyung Kang via jinho)
+
     TAJO-332: Invalid row count of CSVScanner. (jinho)
 
     TAJO-326: In ExecutionBlock, isRoot() and isLeafBlock() return invalid values. (jihoon)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java
index 651b00b..94bafb1 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/CharDatum.java
@@ -139,7 +139,7 @@ public class CharDatum extends Datum {
       case CHAR:
         return DatumFactory.createBool(this.equals(datum));
 
-      case NULL:
+      case NULL_TYPE:
         return DatumFactory.createBool(false);
 
       default:
@@ -154,7 +154,7 @@ public class CharDatum extends Datum {
         CharDatum other = (CharDatum) datum;
         return UnsignedBytes.lexicographicalComparator().compare(bytes, other.bytes);
 
-      case NULL:
+      case NULL_TYPE:
         return -1;
 
       default:

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
index b0aa9ca..2ce02d4 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
@@ -54,7 +54,7 @@ public class DatumFactory {
         return Inet4Datum.class;
       case ANY:
         return NullDatum.class;
-      case NULL:
+      case NULL_TYPE:
         return NullDatum.class;
       default:
         throw new UnsupportedOperationException(type.name());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
index 8de20ee..990b6a4 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
@@ -134,7 +134,7 @@ public class Float4Datum extends Datum implements NumericDatum {
         return DatumFactory.createBool(val == datum.asFloat4());
       case FLOAT8:
         return DatumFactory.createBool(val == datum.asFloat8());
-      case NULL:
+      case NULL_TYPE:
         return DatumFactory.createBool(false);
       default:
         throw new InvalidOperationException();
@@ -194,7 +194,7 @@ public class Float4Datum extends Datum implements NumericDatum {
           return 0;
         }
       }
-      case NULL:
+      case NULL_TYPE:
         return -1;
       default:
         throw new InvalidOperationException();
@@ -214,7 +214,7 @@ public class Float4Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val + datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -234,7 +234,7 @@ public class Float4Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val - datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -254,7 +254,7 @@ public class Float4Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val * datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val * datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException();
@@ -274,7 +274,7 @@ public class Float4Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val / datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val / datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -294,7 +294,7 @@ public class Float4Datum extends Datum implements NumericDatum {
         return DatumFactory.createFloat4(val / datum.asFloat4());
       case FLOAT8:
         return DatumFactory.createFloat8(val / datum.asFloat8());
-      case NULL:
+      case NULL_TYPE:
         return datum;
       default:
         throw new InvalidOperationException(datum.type());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
index 1857929..bb49e28 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
@@ -132,7 +132,7 @@ public class Float8Datum extends Datum implements NumericDatum {
       return DatumFactory.createBool(val == datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createBool(val == datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return DatumFactory.createBool(false);
     default:
       throw new InvalidOperationException();
@@ -192,7 +192,7 @@ public class Float8Datum extends Datum implements NumericDatum {
           return 0;
         }
       }
-      case NULL:
+      case NULL_TYPE:
         return -1;
       default:
         throw new InvalidOperationException();
@@ -212,7 +212,7 @@ public class Float8Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val + datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -232,7 +232,7 @@ public class Float8Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val - datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -252,7 +252,7 @@ public class Float8Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val * datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val * datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException();
@@ -272,7 +272,7 @@ public class Float8Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val / datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val / datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -292,7 +292,7 @@ public class Float8Datum extends Datum implements NumericDatum {
         return DatumFactory.createFloat8(val % datum.asFloat4());
       case FLOAT8:
         return DatumFactory.createFloat8(val % datum.asFloat8());
-      case NULL:
+      case NULL_TYPE:
         return datum;
       default:
         throw new InvalidOperationException(datum.type());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
index 000a107..bee8c47 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
@@ -19,6 +19,8 @@
 package org.apache.tajo.datum;
 
 import com.google.gson.annotations.Expose;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.exception.InvalidOperationException;
 import org.apache.tajo.util.NumberUtil;
@@ -26,10 +28,6 @@ import org.apache.tajo.util.NumberUtil;
 import java.nio.ByteBuffer;
 
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-
 public class Int2Datum extends Datum implements NumericDatum {
   private static final int size = 2;  
   @Expose private short val;
@@ -131,7 +129,7 @@ public class Int2Datum extends Datum implements NumericDatum {
       return DatumFactory.createBool(val == datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createBool(val == datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return DatumFactory.createBool(false);
     default:
       throw new InvalidOperationException();
@@ -191,7 +189,7 @@ public class Int2Datum extends Datum implements NumericDatum {
           return 0;
         }
       }
-      case NULL:
+      case NULL_TYPE:
         return -1;
       default:
         throw new InvalidOperationException();
@@ -211,7 +209,7 @@ public class Int2Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat4(val + datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -231,7 +229,7 @@ public class Int2Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat4(val - datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -251,7 +249,7 @@ public class Int2Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat4(val * datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val * datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -271,7 +269,7 @@ public class Int2Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat4(val / datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val / datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -291,7 +289,7 @@ public class Int2Datum extends Datum implements NumericDatum {
         return DatumFactory.createFloat4(val % datum.asFloat4());
       case FLOAT8:
         return DatumFactory.createFloat8(val % datum.asFloat8());
-      case NULL:
+      case NULL_TYPE:
         return datum;
       default:
         throw new InvalidOperationException(datum.type());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
index a68a5f1..ee66700 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
@@ -129,7 +129,7 @@ public class Int4Datum extends Datum implements NumericDatum {
       return DatumFactory.createBool(val == datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createBool(val == datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return DatumFactory.createBool(false);
     default:
       throw new InvalidOperationException();
@@ -189,7 +189,7 @@ public class Int4Datum extends Datum implements NumericDatum {
           return 0;
         }
       }
-      case NULL:
+      case NULL_TYPE:
         return -1;
       default:
         throw new InvalidOperationException();
@@ -209,7 +209,7 @@ public class Int4Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat4(val + datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -229,7 +229,7 @@ public class Int4Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat4(val - datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -249,7 +249,7 @@ public class Int4Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat4(val * datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val * datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException();
@@ -269,7 +269,7 @@ public class Int4Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat4(val / datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val / datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -289,7 +289,7 @@ public class Int4Datum extends Datum implements NumericDatum {
         return DatumFactory.createFloat4(val % datum.asFloat4());
       case FLOAT8:
         return DatumFactory.createFloat8(val % datum.asFloat8());
-      case NULL:
+      case NULL_TYPE:
         return datum;
       default:
         throw new InvalidOperationException(datum.type());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
index 985ecd6..a1664c5 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
@@ -136,7 +136,7 @@ public class Int8Datum extends Datum implements NumericDatum {
         return DatumFactory.createBool(val == datum.asFloat4());
       case FLOAT8:
         return DatumFactory.createBool(val == datum.asFloat8());
-      case NULL:
+      case NULL_TYPE:
         return DatumFactory.createBool(false);
       default:
         throw new InvalidOperationException();
@@ -196,7 +196,7 @@ public class Int8Datum extends Datum implements NumericDatum {
           return 0;
         }
       }
-      case NULL:
+      case NULL_TYPE:
         return -1;
       default:
         throw new InvalidOperationException();
@@ -216,7 +216,7 @@ public class Int8Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val + datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -236,7 +236,7 @@ public class Int8Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val - datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -256,7 +256,7 @@ public class Int8Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val * datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val * datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -276,7 +276,7 @@ public class Int8Datum extends Datum implements NumericDatum {
       return DatumFactory.createFloat8(val / datum.asFloat4());
     case FLOAT8:
       return DatumFactory.createFloat8(val / datum.asFloat8());
-    case NULL:
+    case NULL_TYPE:
       return datum;
     default:
       throw new InvalidOperationException(datum.type());
@@ -296,7 +296,7 @@ public class Int8Datum extends Datum implements NumericDatum {
         return DatumFactory.createFloat8(val % datum.asFloat4());
       case FLOAT8:
         return DatumFactory.createFloat8(val % datum.asFloat8());
-      case NULL:
+      case NULL_TYPE:
         return datum;
       default:
         throw new InvalidOperationException(datum.type());

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java
index 2cce626..6a18ef3 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/NullDatum.java
@@ -28,7 +28,7 @@ public class NullDatum extends Datum {
   }
 
   private NullDatum() {
-    super(Type.NULL);
+    super(Type.NULL_TYPE);
   }
 
   public static NullDatum get() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
index 76cdc57..779d5ea 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TextDatum.java
@@ -106,7 +106,7 @@ public class TextDatum extends Datum {
       case BLOB:
         return UnsignedBytes.lexicographicalComparator().compare(bytes, datum.asByteArray());
 
-      case NULL:
+      case NULL_TYPE:
         return -1;
       default:
         throw new InvalidOperationException();
@@ -131,7 +131,7 @@ public class TextDatum extends Datum {
       case BLOB:
         return DatumFactory.createBool(UnsignedBytes.lexicographicalComparator()
             .compare(bytes, datum.asByteArray()) == 0);
-      case NULL:
+      case NULL_TYPE:
         return DatumFactory.createBool(false);
       default:
         throw new InvalidOperationException();

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-common/src/main/proto/DataTypes.proto
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/proto/DataTypes.proto b/tajo-common/src/main/proto/DataTypes.proto
index 0eacdd6..9b5b98f 100644
--- a/tajo-common/src/main/proto/DataTypes.proto
+++ b/tajo-common/src/main/proto/DataTypes.proto
@@ -23,7 +23,7 @@ option java_generic_services = false;
 option java_generate_equals_and_hash = true;
 
 enum Type {
-  NULL = 0; // NULL type
+  NULL_TYPE = 0; // NULL type
 
   BOOLEAN = 1; // state of true of false [1 byte]
 
@@ -102,4 +102,4 @@ message DataType {
   required Type type = 1;
   optional int32 length = 2;
   optional string code = 3;
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java
index df26692..c4906d7 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/FunctionEval.java
@@ -49,7 +49,7 @@ public abstract class FunctionEval extends EvalNode implements Cloneable {
     ParamType [] paramTypes = new ParamType[argEvals.length];
     for (int i = 0; i < argEvals.length; i++) {
       if (argEvals[i].getType() == EvalType.CONST) {
-        if (argEvals[i].getValueType().getType() == TajoDataTypes.Type.NULL) {
+        if (argEvals[i].getValueType().getType() == TajoDataTypes.Type.NULL_TYPE) {
           paramTypes[i] = ParamType.NULL;
         } else {
           paramTypes[i] = ParamType.CONSTANT;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java
index 3923a4f..029f4f4 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/eval/IsNullEval.java
@@ -20,14 +20,12 @@ package org.apache.tajo.engine.eval;
 
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.BooleanDatum;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.storage.Tuple;
 
 public class IsNullEval extends BinaryEval {
@@ -65,7 +63,7 @@ public class IsNullEval extends BinaryEval {
     IsNullEvalCtx isNullCtx = (IsNullEvalCtx) ctx;
     leftExpr.eval(isNullCtx.predicandContext, schema, tuple);
     Datum result = leftExpr.terminate(((IsNullEvalCtx)ctx).predicandContext);
-    ((IsNullEvalCtx) ctx).result = DatumFactory.createBool(isNot ^ (result.type() == TajoDataTypes.Type.NULL));
+    ((IsNullEvalCtx) ctx).result = DatumFactory.createBool(isNot ^ (result.type() == TajoDataTypes.Type.NULL_TYPE));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/BinarySerializeDeserialize.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/BinarySerializeDeserialize.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/BinarySerializeDeserialize.java
index f1da79b..4c3b6ff 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/BinarySerializeDeserialize.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/BinarySerializeDeserialize.java
@@ -86,7 +86,7 @@ public class BinarySerializeDeserialize implements SerializeDeserialize {
         length = bytes.length;
         out.write(bytes, 0, length);
         break;
-      case NULL:
+      case NULL_TYPE:
       default:
         break;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RawFile.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RawFile.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RawFile.java
index a484643..88a4005 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RawFile.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RawFile.java
@@ -231,7 +231,7 @@ public class RawFile {
             tuple.put(i, DatumFactory.createInet4(ipv4Bytes));
             break;
 
-          case NULL:
+          case NULL_TYPE:
             tuple.put(i, NullDatum.get());
             break;
 
@@ -402,7 +402,7 @@ public class RawFile {
         }
 
         switch(columnTypes[i].getType()) {
-          case NULL:
+          case NULL_TYPE:
             nullFlags.set(i);
             continue;
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RowFile.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RowFile.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RowFile.java
index d805080..bbe0529 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RowFile.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/RowFile.java
@@ -436,7 +436,7 @@ public class RowFile {
               break;
             case INET6:
               buffer.put(t.getIPv6Bytes(i));
-            case NULL:
+            case NULL_TYPE:
               nullFlags.set(i);
               break;
             default:

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TextSerializeDeserialize.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TextSerializeDeserialize.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TextSerializeDeserialize.java
index 64b078c..67fb8b8 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TextSerializeDeserialize.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/TextSerializeDeserialize.java
@@ -92,7 +92,7 @@ public class TextSerializeDeserialize implements SerializeDeserialize {
         length = protoBytes.length;
         out.write(protoBytes, 0, protoBytes.length);
         break;
-      case NULL:
+      case NULL_TYPE:
       default:
         break;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniAppender.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniAppender.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniAppender.java
index 9de3397..3209469 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniAppender.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniAppender.java
@@ -111,7 +111,7 @@ public class TrevniAppender extends FileAppender {
         return ValueType.BYTES;
       case PROTOBUF:
         return ValueType.BYTES;
-      case NULL:
+      case NULL_TYPE:
         return ValueType.NULL;
       default:
         return null;
@@ -135,7 +135,7 @@ public class TrevniAppender extends FileAppender {
       if (!t.isNull(i)) {
         col = schema.getColumn(i);
         switch (col.getDataType().getType()) {
-          case NULL:
+          case NULL_TYPE:
             break;
           case BOOLEAN:
           case BIT:

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniScanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniScanner.java b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniScanner.java
index d1980e4..4165afe 100644
--- a/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniScanner.java
+++ b/tajo-core/tajo-core-storage/src/main/java/org/apache/tajo/storage/trevni/TrevniScanner.java
@@ -152,7 +152,7 @@ public class TrevniScanner extends FileScanner {
               new BlobDatum(((ByteBuffer) columns[i].nextValue())));
           break;
 
-        case NULL:
+        case NULL_TYPE:
           tuple.put(tid, NullDatum.get());
           break;
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestLazyTuple.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestLazyTuple.java b/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestLazyTuple.java
index b67ea92..4cb0b34 100644
--- a/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestLazyTuple.java
+++ b/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestLazyTuple.java
@@ -52,7 +52,7 @@ public class TestLazyTuple {
     schema.addColumn("col10", TajoDataTypes.Type.BLOB);
     schema.addColumn("col11", TajoDataTypes.Type.INET4);
     schema.addColumn("col12", TajoDataTypes.Type.INT4);
-    schema.addColumn("col13", TajoDataTypes.Type.NULL);
+    schema.addColumn("col13", TajoDataTypes.Type.NULL_TYPE);
 
     StringBuilder sb = new StringBuilder();
     sb.append(DatumFactory.createBool(true)).append('|');

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestStorages.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestStorages.java b/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestStorages.java
index 5c2cd8f..2faae7f 100644
--- a/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestStorages.java
+++ b/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/TestStorages.java
@@ -201,7 +201,7 @@ public class TestStorages {
     schema.addColumn("col9", Type.TEXT);
     schema.addColumn("col10", Type.BLOB);
     schema.addColumn("col11", Type.INET4);
-    schema.addColumn("col12", Type.NULL);
+    schema.addColumn("col12", Type.NULL_TYPE);
     schema.addColumn("col13", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
 
     Options options = new Options();
@@ -263,7 +263,7 @@ public class TestStorages {
     schema.addColumn("col9", Type.TEXT);
     schema.addColumn("col10", Type.BLOB);
     schema.addColumn("col11", Type.INET4);
-    schema.addColumn("col12", Type.NULL);
+    schema.addColumn("col12", Type.NULL_TYPE);
     schema.addColumn("col13", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
 
     Options options = new Options();
@@ -326,7 +326,7 @@ public class TestStorages {
     schema.addColumn("col9", Type.TEXT);
     schema.addColumn("col10", Type.BLOB);
     schema.addColumn("col11", Type.INET4);
-    schema.addColumn("col12", Type.NULL);
+    schema.addColumn("col12", Type.NULL_TYPE);
     schema.addColumn("col13", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
 
     Options options = new Options();

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2e27a023/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/v2/TestStorages.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/v2/TestStorages.java b/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/v2/TestStorages.java
index 34781bf..a3d3133 100644
--- a/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/v2/TestStorages.java
+++ b/tajo-core/tajo-core-storage/src/test/java/org/apache/tajo/storage/v2/TestStorages.java
@@ -199,7 +199,7 @@ public class TestStorages {
     schema.addColumn("col9", Type.TEXT);
     schema.addColumn("col10", Type.BLOB);
     schema.addColumn("col11", Type.INET4);
-    schema.addColumn("col12", Type.NULL);
+    schema.addColumn("col12", Type.NULL_TYPE);
 
     Options options = new Options();
     TableMeta meta = CatalogUtil.newTableMeta(storeType, options);


[4/7] git commit: TAJO-207: Implement bit_length(string) function. (DaeMyung Kang via jihoon)

Posted by ji...@apache.org.
TAJO-207: Implement bit_length(string) function. (DaeMyung Kang via jihoon)


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

Branch: refs/heads/DAG-execplan
Commit: a26c588e31c54e791cbb45f7d5bf1336d0c72da6
Parents: f9a6e9c
Author: Jihoon Son <ji...@apache.org>
Authored: Sat Nov 30 20:56:05 2013 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Sat Nov 30 20:56:05 2013 +0900

----------------------------------------------------------------------
 .../tajo/engine/function/string/BitLength.java  | 48 ++++++++++++++++++++
 .../java/org/apache/tajo/master/TajoMaster.java |  7 ++-
 .../TestStringOperatorsAndFunctions.java        | 12 +++++
 3 files changed, 65 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/a26c588e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
new file mode 100644
index 0000000..3a84f5b
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
@@ -0,0 +1,48 @@
+/**
+ * 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.tajo.engine.function.string;
+
+import org.apache.tajo.catalog.Column;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.storage.Tuple;
+
+/**
+ * Function definition
+ *
+ * INT4 bit_length(string text)
+ */
+public class BitLength extends GeneralFunction {
+  public BitLength() {
+    super(new Column[] {
+        new Column("text", TajoDataTypes.Type.TEXT)
+    });
+  }
+
+  @Override
+  public Datum eval(Tuple params) {
+    Datum datum = params.get(0);
+    if(datum instanceof NullDatum) return NullDatum.get();
+
+    return DatumFactory.createInt4(datum.asByteArray().length*8);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/a26c588e/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
index f91cc0b..1c823d3 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
@@ -352,7 +352,10 @@ public class TajoMaster extends CompositeService {
         new FunctionDesc("character_length", CharLength.class, FunctionType.GENERAL,
             CatalogUtil.newSimpleDataType(Type.TEXT),
             CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
+    sqlFuncs.add(
+        new FunctionDesc("bit_length", BitLength.class, FunctionType.GENERAL,
+            CatalogUtil.newSimpleDataType(Type.TEXT),
+            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
     sqlFuncs.add(
         new FunctionDesc("split_part", SplitPart.class, FunctionType.GENERAL,
             CatalogUtil.newSimpleDataType(Type.TEXT),
@@ -617,4 +620,4 @@ public class TajoMaster extends CompositeService {
       System.exit(-1);
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/a26c588e/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
index 5e73f88..27b9355 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
@@ -222,4 +222,16 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testEval(schema, "table1", ",abcdef,3.14", "select substr(lower(col2), 2, 3) from table1",
         new String[]{"bcd"});
   }
+
+  @Test
+  public void testBitLength() throws IOException {
+    testSimpleEval("select bit_length('123456') as col1 ", new String[]{"48"});
+
+    Schema schema = new Schema();
+    schema.addColumn("col1", TEXT);
+    schema.addColumn("col2", TEXT);
+    schema.addColumn("col3", TEXT);
+    testEval(schema, "table1", "ABC,DEF,3.14", "select bit_length(lower(col1) || lower(col2)) from table1",
+        new String[]{"48"});
+  }
 }


[6/7] git commit: TAJO-207: Implement bit_length(string) function. (fixed a missing log in CHANGES.txt)

Posted by ji...@apache.org.
TAJO-207: Implement bit_length(string) function. (fixed a missing log in CHANGES.txt)


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

Branch: refs/heads/DAG-execplan
Commit: 02fd6cb9ab7664760d5549c8e59def0759118e6c
Parents: 1191003
Author: Jihoon Son <ji...@apache.org>
Authored: Sat Nov 30 23:12:57 2013 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Sat Nov 30 23:12:57 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/02fd6cb9/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e647794..cd6e9f8 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,8 @@ Release 0.8.0 - unreleased
 
   NEW FEATURES
 
+    TAJO-207: Implement bit_length(string) function. (DaeMyung Kang via jihoon)
+
     TAJO-341: Implement substr function. (hyoungjunkim via hyunsik)
 
     TAJO-308: Implement length(string) function. (hyoungjunkim via hyunsik)


[7/7] git commit: Merge branch 'master' of http://git-wip-us.apache.org/repos/asf/incubator-tajo into DAG-execplan

Posted by ji...@apache.org.
Merge branch 'master' of http://git-wip-us.apache.org/repos/asf/incubator-tajo into DAG-execplan


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

Branch: refs/heads/DAG-execplan
Commit: 0cbd968ca50c1c91efa1fce9be5ddc927b02b3b7
Parents: 6532324 02fd6cb
Author: Jihoon Son <ji...@apache.org>
Authored: Sat Nov 30 23:15:25 2013 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Sat Nov 30 23:15:25 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |   8 ++
 .../java/org/apache/tajo/datum/CharDatum.java   |   4 +-
 .../org/apache/tajo/datum/DatumFactory.java     |   2 +-
 .../java/org/apache/tajo/datum/Float4Datum.java |  14 +-
 .../java/org/apache/tajo/datum/Float8Datum.java |  14 +-
 .../java/org/apache/tajo/datum/Int2Datum.java   |  20 ++-
 .../java/org/apache/tajo/datum/Int4Datum.java   |  14 +-
 .../java/org/apache/tajo/datum/Int8Datum.java   |  14 +-
 .../java/org/apache/tajo/datum/NullDatum.java   |   2 +-
 .../java/org/apache/tajo/datum/TextDatum.java   |   4 +-
 tajo-common/src/main/proto/DataTypes.proto      |   4 +-
 .../apache/tajo/engine/eval/FunctionEval.java   |   2 +-
 .../org/apache/tajo/engine/eval/IsNullEval.java |   4 +-
 .../tajo/engine/function/string/BitLength.java  |  48 +++++++
 .../tajo/engine/function/string/Substr.java     |  75 +++++++++++
 .../engine/planner/physical/SeqScanExec.java    |   2 +-
 .../java/org/apache/tajo/master/TajoMaster.java |  12 +-
 .../tajo/webapp/QueryExecutorServlet.java       |  19 ++-
 .../webapps/admin/WEB-INF/jetty-web.xml         |  23 ++++
 .../src/main/resources/webapps/admin/getCSV.jsp |  31 +++++
 .../resources/webapps/admin/query_executor.jsp  | 131 +++++++++++++++++--
 .../TestStringOperatorsAndFunctions.java        |  44 +++++++
 .../storage/BinarySerializeDeserialize.java     |   2 +-
 .../org/apache/tajo/storage/MergeScanner.java   |  49 ++++---
 .../java/org/apache/tajo/storage/RawFile.java   |   4 +-
 .../java/org/apache/tajo/storage/RowFile.java   |   2 +-
 .../tajo/storage/TextSerializeDeserialize.java  |   2 +-
 .../tajo/storage/trevni/TrevniAppender.java     |   4 +-
 .../tajo/storage/trevni/TrevniScanner.java      |   2 +-
 .../org/apache/tajo/storage/TestLazyTuple.java  |   2 +-
 .../apache/tajo/storage/TestMergeScanner.java   |  33 ++++-
 .../org/apache/tajo/storage/TestStorages.java   |   6 +-
 .../apache/tajo/storage/v2/TestStorages.java    |   2 +-
 33 files changed, 503 insertions(+), 96 deletions(-)
----------------------------------------------------------------------