Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/tajo into 
hbase_storage

Conflicts:
        CHANGES
        
tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
        
tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalPlanUtil.java
        
tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java
        
tajo-core/src/main/java/org/apache/tajo/engine/query/QueryUnitRequest.java
        
tajo-core/src/main/java/org/apache/tajo/engine/query/QueryUnitRequestImpl.java
        tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java


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

Branch: refs/heads/hbase_storage
Commit: 85627a520aa80c0339e88f450f3d5d84297bef4d
Parents: cc46aea 514ed84
Author: HyoungJun Kim <[email protected]>
Authored: Wed Nov 5 18:47:35 2014 +0900
Committer: HyoungJun Kim <[email protected]>
Committed: Wed Nov 5 18:47:35 2014 +0900

----------------------------------------------------------------------
 .travis.yml                                     |    2 +-
 CHANGES                                         |   29 +-
 .../org/apache/tajo/catalog/SchemaUtil.java     |  103 ++
 .../apache/tajo/cli/ConnectDatabaseCommand.java |   71 --
 .../org/apache/tajo/cli/CopyrightCommand.java   |   63 --
 .../tajo/cli/DefaultTajoCliOutputFormatter.java |  210 ----
 .../apache/tajo/cli/DescFunctionCommand.java    |  135 ---
 .../org/apache/tajo/cli/DescTableCommand.java   |  135 ---
 .../tajo/cli/ExecExternalShellCommand.java      |  122 ---
 .../java/org/apache/tajo/cli/ExitCommand.java   |   47 -
 .../java/org/apache/tajo/cli/HdfsCommand.java   |   57 -
 .../java/org/apache/tajo/cli/HelpCommand.java   |  132 ---
 .../tajo/cli/InvalidClientSessionException.java |   27 -
 .../tajo/cli/InvalidStatementException.java     |   25 -
 .../apache/tajo/cli/ListDatabaseCommand.java    |   48 -
 .../java/org/apache/tajo/cli/ParsedResult.java  |   53 -
 .../java/org/apache/tajo/cli/SetCommand.java    |  126 ---
 .../java/org/apache/tajo/cli/SimpleParser.java  |  388 -------
 .../org/apache/tajo/cli/TajoAdminCommand.java   |   57 -
 .../main/java/org/apache/tajo/cli/TajoCli.java  |  694 ------------
 .../apache/tajo/cli/TajoCliOutputFormatter.java |   97 --
 .../org/apache/tajo/cli/TajoFileHistory.java    |   39 -
 .../org/apache/tajo/cli/TajoGetConfCommand.java |   57 -
 .../org/apache/tajo/cli/TajoHAAdminCommand.java |   57 -
 .../org/apache/tajo/cli/TajoShellCommand.java   |  128 ---
 .../java/org/apache/tajo/cli/UnsetCommand.java  |   52 -
 .../org/apache/tajo/cli/VersionCommand.java     |   48 -
 .../org/apache/tajo/cli/tools/TajoAdmin.java    |  457 ++++++++
 .../org/apache/tajo/cli/tools/TajoDump.java     |  188 ++++
 .../org/apache/tajo/cli/tools/TajoGetConf.java  |  161 +++
 .../org/apache/tajo/cli/tools/TajoHAAdmin.java  |  211 ++++
 .../cli/tsql/DefaultTajoCliOutputFormatter.java |  211 ++++
 .../cli/tsql/InvalidStatementException.java     |   25 +
 .../org/apache/tajo/cli/tsql/ParsedResult.java  |   53 +
 .../org/apache/tajo/cli/tsql/SimpleParser.java  |  388 +++++++
 .../java/org/apache/tajo/cli/tsql/TajoCli.java  |  691 ++++++++++++
 .../tajo/cli/tsql/TajoCliOutputFormatter.java   |   98 ++
 .../apache/tajo/cli/tsql/TajoFileHistory.java   |   39 +
 .../tsql/commands/ConnectDatabaseCommand.java   |   72 ++
 .../cli/tsql/commands/CopyrightCommand.java     |   65 ++
 .../cli/tsql/commands/DescFunctionCommand.java  |  136 +++
 .../cli/tsql/commands/DescTableCommand.java     |  137 +++
 .../tsql/commands/ExecExternalShellCommand.java |  124 +++
 .../tajo/cli/tsql/commands/ExitCommand.java     |   49 +
 .../tajo/cli/tsql/commands/HdfsCommand.java     |   58 +
 .../tajo/cli/tsql/commands/HelpCommand.java     |  133 +++
 .../cli/tsql/commands/ListDatabaseCommand.java  |   50 +
 .../tajo/cli/tsql/commands/SetCommand.java      |  127 +++
 .../cli/tsql/commands/TajoAdminCommand.java     |   58 +
 .../cli/tsql/commands/TajoGetConfCommand.java   |   58 +
 .../cli/tsql/commands/TajoHAAdminCommand.java   |   58 +
 .../cli/tsql/commands/TajoShellCommand.java     |  129 +++
 .../tajo/cli/tsql/commands/UnsetCommand.java    |   53 +
 .../tajo/cli/tsql/commands/VersionCommand.java  |   49 +
 .../apache/tajo/client/CatalogAdminClient.java  |  137 +++
 .../tajo/client/CatalogAdminClientImpl.java     |  266 +++++
 .../client/InvalidClientSessionException.java   |   27 +
 .../org/apache/tajo/client/QueryClient.java     |  114 ++
 .../org/apache/tajo/client/QueryClientImpl.java |  621 +++++++++++
 .../apache/tajo/client/SessionConnection.java   |  326 ++++++
 .../java/org/apache/tajo/client/TajoAdmin.java  |  456 --------
 .../java/org/apache/tajo/client/TajoClient.java | 1023 +-----------------
 .../org/apache/tajo/client/TajoClientImpl.java  |  215 ++++
 .../org/apache/tajo/client/TajoClientUtil.java  |   94 ++
 .../java/org/apache/tajo/client/TajoDump.java   |  186 ----
 .../org/apache/tajo/client/TajoGetConf.java     |  159 ---
 .../org/apache/tajo/client/TajoHAAdmin.java     |  210 ----
 .../apache/tajo/client/TajoHAClientUtil.java    |    4 +-
 .../org/apache/tajo/jdbc/FetchResultSet.java    |    5 +-
 .../org/apache/tajo/jdbc/TajoResultSet.java     |    7 +-
 tajo-common/pom.xml                             |    5 +
 .../main/java/org/apache/tajo/ConfigKey.java    |    6 +
 .../java/org/apache/tajo/OverridableConf.java   |    2 +-
 .../main/java/org/apache/tajo/SessionVars.java  |   63 +-
 .../java/org/apache/tajo/conf/TajoConf.java     |  157 ++-
 .../java/org/apache/tajo/datum/TextDatum.java   |    6 +-
 .../java/org/apache/tajo/storage/Tuple.java     |   12 +-
 .../java/org/apache/tajo/storage/VTuple.java    |   55 +-
 .../org/apache/tajo/util/Deallocatable.java     |   23 +
 .../java/org/apache/tajo/util/NumberUtil.java   |   21 +
 .../main/java/org/apache/tajo/util/SizeOf.java  |  159 +++
 .../org/apache/tajo/util/UnsafeComparer.java    |  160 +++
 .../java/org/apache/tajo/util/UnsafeUtil.java   |  115 ++
 .../java/org/apache/tajo/util/VersionInfo.java  |   28 +-
 .../tajo/validation/AbstractValidator.java      |   60 +
 .../tajo/validation/BooleanValidator.java       |   57 +
 .../apache/tajo/validation/ClassValidator.java  |   57 +
 .../tajo/validation/ConstraintViolation.java    |   47 +
 .../ConstraintViolationException.java           |   56 +
 .../apache/tajo/validation/GroupValidator.java  |   49 +
 .../tajo/validation/JavaStringValidator.java    |   32 +
 .../apache/tajo/validation/LengthValidator.java |   57 +
 .../apache/tajo/validation/MaxValidator.java    |   83 ++
 .../apache/tajo/validation/MinValidator.java    |   84 ++
 .../validation/NetworkAddressValidator.java     |  103 ++
 .../tajo/validation/NotNullValidator.java       |   47 +
 .../apache/tajo/validation/PathValidator.java   |   32 +
 .../tajo/validation/PatternValidator.java       |   63 ++
 .../apache/tajo/validation/RangeValidator.java  |   53 +
 .../tajo/validation/ShellVariableValidator.java |   32 +
 .../org/apache/tajo/validation/Validator.java   |   29 +
 .../org/apache/tajo/validation/Validators.java  |   77 ++
 .../apache/tajo/validation/TestValidators.java  |  544 ++++++++++
 .../org/apache/tajo/benchmark/BenchmarkSet.java |    5 +-
 .../engine/planner/PhysicalPlannerImpl.java     |    5 +-
 .../tajo/engine/planner/global/DataChannel.java |    2 +-
 .../planner/physical/ExternalSortExec.java      |  130 ++-
 .../planner/physical/HashFullOuterJoinExec.java |    2 +-
 .../engine/planner/physical/HashJoinExec.java   |    2 +-
 .../planner/physical/HashLeftOuterJoinExec.java |    2 +-
 .../engine/planner/physical/MergeJoinExec.java  |    2 +-
 .../engine/planner/physical/PhysicalExec.java   |    3 +-
 .../planner/physical/PhysicalPlanUtil.java      |    9 +-
 .../physical/RangeShuffleFileWriteExec.java     |    4 +-
 .../physical/RightOuterMergeJoinExec.java       |    2 +-
 .../engine/planner/physical/SeqScanExec.java    |    2 +-
 .../tajo/engine/planner/physical/SortExec.java  |    7 +-
 .../engine/planner/physical/WindowAggExec.java  |    5 +-
 .../apache/tajo/engine/query/QueryContext.java  |   11 +
 .../tajo/engine/query/QueryUnitRequest.java     |    2 +-
 .../tajo/engine/query/QueryUnitRequestImpl.java |    4 +-
 .../org/apache/tajo/master/GlobalEngine.java    |    2 -
 .../java/org/apache/tajo/master/TajoMaster.java |    2 +-
 .../tajo/webapp/QueryExecutorServlet.java       |   19 +-
 .../tajo/worker/RangeRetrieverHandler.java      |    6 +-
 .../main/java/org/apache/tajo/worker/Task.java  |    3 +-
 .../apache/tajo/LocalTajoTestingUtility.java    |    3 +-
 .../java/org/apache/tajo/QueryTestCaseBase.java |    7 +-
 .../org/apache/tajo/TajoTestingCluster.java     |   26 +-
 .../tajo/cli/TestDefaultCliOutputFormatter.java |  178 ---
 .../tajo/cli/TestExecExternalShellCommand.java  |   44 -
 .../org/apache/tajo/cli/TestHdfsCommand.java    |   46 -
 .../org/apache/tajo/cli/TestSimpleParser.java   |  271 -----
 .../java/org/apache/tajo/cli/TestTajoCli.java   |  354 ------
 .../apache/tajo/cli/tools/TestDDLBuilder.java   |  133 +++
 .../org/apache/tajo/cli/tools/TestTajoDump.java |   47 +
 .../cli/tsql/TestDefaultCliOutputFormatter.java |  180 +++
 .../apache/tajo/cli/tsql/TestSimpleParser.java  |  274 +++++
 .../org/apache/tajo/cli/tsql/TestTajoCli.java   |  356 ++++++
 .../commands/TestExecExternalShellCommand.java  |   45 +
 .../tajo/cli/tsql/commands/TestHdfsCommand.java |   47 +
 .../org/apache/tajo/client/TestDDLBuilder.java  |  133 ---
 .../org/apache/tajo/client/TestTajoClient.java  |    4 +-
 .../org/apache/tajo/client/TestTajoDump.java    |   46 -
 .../apache/tajo/engine/eval/ExprTestBase.java   |    8 +-
 .../tajo/engine/planner/TestPlannerUtil.java    |    4 +-
 .../planner/TestUniformRangePartition.java      |    4 +-
 .../planner/physical/TestBSTIndexExec.java      |    4 +-
 .../planner/physical/TestExternalSortExec.java  |    2 +-
 .../planner/physical/TestPhysicalPlanner.java   |    2 +-
 .../physical/TestProgressExternalSortExec.java  |    2 +-
 .../apache/tajo/engine/util/TestTupleUtil.java  |    2 +-
 .../java/org/apache/tajo/jdbc/TestTajoJdbc.java |    6 +-
 .../tajo/master/ha/TestHAServiceHDFSImpl.java   |    3 +-
 .../master/querymaster/TestQueryProgress.java   |    6 +-
 .../tajo/scheduler/TestFifoScheduler.java       |    8 +-
 .../org/apache/tajo/worker/TestHistory.java     |    3 +-
 .../tajo/worker/TestRangeRetrieverHandler.java  |    4 +-
 tajo-dist/src/main/bin/tajo                     |   28 +-
 .../org/apache/tajo/jdbc/JdbcConnection.java    |  444 ++++++++
 .../org/apache/tajo/jdbc/MetaDataTuple.java     |   17 +-
 .../org/apache/tajo/jdbc/TajoConnection.java    |  437 --------
 .../apache/tajo/jdbc/TajoDatabaseMetaData.java  |   27 +-
 .../java/org/apache/tajo/jdbc/TajoDriver.java   |    2 +-
 .../apache/tajo/jdbc/TajoPreparedStatement.java |    4 +-
 .../org/apache/tajo/jdbc/TajoStatement.java     |    5 +-
 .../tajo/plan/LogicalPlanPreprocessor.java      |    2 +-
 .../org/apache/tajo/plan/LogicalPlanner.java    |    2 +-
 .../org/apache/tajo/plan/expr/EvalTreeUtil.java |   97 +-
 .../GreedyHeuristicJoinOrderAlgorithm.java      |    2 +-
 .../apache/tajo/plan/joinorder/JoinGraph.java   |    5 +-
 .../org/apache/tajo/plan/logical/ScanNode.java  |    2 +-
 .../tajo/plan/logical/TableSubQueryNode.java    |    2 +-
 .../plan/rewrite/rules/FilterPushDownRule.java  |   10 +-
 .../rewrite/rules/ProjectionPushDownRule.java   |    2 +-
 .../org/apache/tajo/plan/util/PlannerUtil.java  |    3 +-
 .../org/apache/tajo/plan/util/SchemaUtil.java   |   88 --
 .../tajo/storage/BaseTupleComparator.java       |  206 ++++
 .../org/apache/tajo/storage/FrameTuple.java     |   14 +-
 .../java/org/apache/tajo/storage/LazyTuple.java |   13 +-
 .../org/apache/tajo/storage/RowStoreUtil.java   |  202 +++-
 .../apache/tajo/storage/TupleComparator.java    |  159 +--
 .../org/apache/tajo/storage/TupleRange.java     |    2 +-
 .../apache/tajo/storage/index/IndexMethod.java  |    1 +
 .../apache/tajo/storage/index/bst/BSTIndex.java |   10 +-
 .../org/apache/tajo/tuple/BaseTupleBuilder.java |  112 ++
 .../org/apache/tajo/tuple/RowBlockReader.java   |   33 +
 .../org/apache/tajo/tuple/TupleBuilder.java     |   26 +
 .../tajo/tuple/offheap/DirectBufTuple.java      |   41 +
 .../tajo/tuple/offheap/FixedSizeLimitSpec.java  |   32 +
 .../apache/tajo/tuple/offheap/HeapTuple.java    |  269 +++++
 .../tajo/tuple/offheap/OffHeapMemory.java       |  102 ++
 .../tajo/tuple/offheap/OffHeapRowBlock.java     |  176 +++
 .../tuple/offheap/OffHeapRowBlockReader.java    |   63 ++
 .../tuple/offheap/OffHeapRowBlockUtils.java     |   54 +
 .../tuple/offheap/OffHeapRowBlockWriter.java    |   58 +
 .../tajo/tuple/offheap/OffHeapRowWriter.java    |  232 ++++
 .../tajo/tuple/offheap/ResizableLimitSpec.java  |  142 +++
 .../apache/tajo/tuple/offheap/RowWriter.java    |   73 ++
 .../apache/tajo/tuple/offheap/UnSafeTuple.java  |  308 ++++++
 .../offheap/UnSafeTupleBytesComparator.java     |   99 ++
 .../tajo/tuple/offheap/ZeroCopyTuple.java       |   35 +
 tajo-storage/src/main/proto/IndexProtos.proto   |    4 +-
 .../tajo/storage/TestTupleComparator.java       |    2 +-
 .../apache/tajo/storage/index/TestBSTIndex.java |   20 +-
 .../index/TestSingleCSVFileBSTIndex.java        |    4 +-
 .../apache/tajo/tuple/TestBaseTupleBuilder.java |   76 ++
 .../tajo/tuple/offheap/TestHeapTuple.java       |   45 +
 .../tajo/tuple/offheap/TestOffHeapRowBlock.java |  577 ++++++++++
 .../tajo/tuple/offheap/TestResizableSpec.java   |   59 +
 210 files changed, 13005 insertions(+), 7010 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/CHANGES
----------------------------------------------------------------------
diff --cc CHANGES
index 7d51e2c,19dc1f6..e02a323
--- a/CHANGES
+++ b/CHANGES
@@@ -16,6 -25,6 +25,8 @@@ Release 0.9.1 - unrelease
      TAJO-1125: Separate logical plan and optimizer into a maven module.
      (hyunsik)
  
++    TAJO-1123: Use Fragment instead of FileFragment.(Hyoungjun Kim)
++
      TAJO-1092: Improve the function system to allow other function 
      implementation types. (hyunsik)
  

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java
----------------------------------------------------------------------
diff --cc 
tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java
index 0000000,9dd2b1c..959aad6
mode 000000,100644..100644
--- 
a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java
+++ 
b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java
@@@ -1,0 -1,210 +1,211 @@@
+ /**
+  * 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.cli.tsql;
+ 
+ import org.apache.commons.lang.exception.ExceptionUtils;
+ import org.apache.tajo.QueryId;
+ import org.apache.tajo.SessionVars;
++import org.apache.tajo.TajoConstants;
+ import org.apache.tajo.catalog.TableDesc;
+ import org.apache.tajo.catalog.statistics.TableStats;
+ import org.apache.tajo.client.QueryClient;
+ import org.apache.tajo.client.QueryStatus;
+ import org.apache.tajo.util.FileUtil;
+ 
+ import java.io.InputStream;
+ import java.io.PrintWriter;
+ import java.sql.ResultSet;
+ import java.sql.ResultSetMetaData;
+ 
+ public class DefaultTajoCliOutputFormatter implements TajoCliOutputFormatter {
+   private int printPauseRecords;
+   private boolean printPause;
+   private boolean printErrorTrace;
+   private String nullChar;
+ 
+   @Override
+   public void init(TajoCli.TajoCliContext context) {
+     this.printPause = context.getBool(SessionVars.CLI_PAGING_ENABLED);
+     this.printPauseRecords = context.getInt(SessionVars.CLI_PAGE_ROWS);
+     this.printErrorTrace = 
context.getBool(SessionVars.CLI_DISPLAY_ERROR_TRACE);
+     this.nullChar = context.get(SessionVars.CLI_NULL_CHAR);
+   }
+ 
+   @Override
+   public void setScirptMode() {
+     this.printPause = false;
+   }
+ 
+   private String getQuerySuccessMessage(TableDesc tableDesc, float 
responseTime, int totalPrintedRows, String postfix,
+                                         boolean endOfTuple) {
+     TableStats stat = tableDesc.getStats();
+     String volume = stat == null ? (endOfTuple ? "0 B" : "unknown bytes") :
+         FileUtil.humanReadableByteCount(stat.getNumBytes(), false);
 -    long resultRows = stat == null ? QueryClient.UNKNOWN_ROW_NUMBER : 
stat.getNumRows();
++    long resultRows = stat == null ? TajoConstants.UNKNOWN_ROW_NUMBER : 
stat.getNumRows();
+ 
+     String displayRowNum;
 -    if (resultRows == QueryClient.UNKNOWN_ROW_NUMBER) {
++    if (resultRows == TajoConstants.UNKNOWN_ROW_NUMBER) {
+ 
+       if (endOfTuple) {
+         displayRowNum = totalPrintedRows + " rows";
+       } else {
+         displayRowNum = "unknown row number";
+       }
+ 
+     } else {
+       displayRowNum = resultRows + " rows";
+     }
+     return "(" + displayRowNum + ", " + getResponseTimeReadable(responseTime) 
+ ", " + volume + " " + postfix + ")";
+   }
+ 
+   protected String getResponseTimeReadable(float responseTime) {
+     return responseTime + " sec";
+   }
+ 
+   @Override
+   public void printResult(PrintWriter sout, InputStream sin, TableDesc 
tableDesc,
+                           float responseTime, ResultSet res) throws Exception 
{
+     long resultRows = tableDesc.getStats() == null ? -1 : 
tableDesc.getStats().getNumRows();
+     if (resultRows == -1) {
+       resultRows = Integer.MAX_VALUE;
+     }
+ 
+     if (res == null) {
+       sout.println(getQuerySuccessMessage(tableDesc, responseTime, 0, 
"inserted", true));
+       return;
+     }
+     ResultSetMetaData rsmd = res.getMetaData();
+     int numOfColumns = rsmd.getColumnCount();
+     for (int i = 1; i <= numOfColumns; i++) {
+       if (i > 1) sout.print(",  ");
+       String columnName = rsmd.getColumnName(i);
+       sout.print(columnName);
+     }
+     sout.println("\n-------------------------------");
+ 
+     int numOfPrintedRows = 0;
+     int totalPrintedRows = 0;
+     boolean endOfTuple = true;
+     while (res.next()) {
+       for (int i = 1; i <= numOfColumns; i++) {
+         if (i > 1) sout.print(",  ");
+         String columnValue = res.getString(i);
+         if(res.wasNull()){
+           sout.print(nullChar);
+         } else {
+           sout.print(columnValue);
+         }
+       }
+       sout.println();
+       sout.flush();
+       numOfPrintedRows++;
+       totalPrintedRows++;
+       if (printPause && printPauseRecords > 0 && totalPrintedRows < 
resultRows && numOfPrintedRows >= printPauseRecords) {
+         if (resultRows < Integer.MAX_VALUE) {
+           sout.print("(" + totalPrintedRows + "/" + resultRows + " rows, 
continue... 'q' is quit)");
+         } else {
+           sout.print("(" + totalPrintedRows + " rows, continue... 'q' is 
quit)");
+         }
+         sout.flush();
+         if (sin != null) {
+           if (sin.read() == 'q') {
+             endOfTuple = false;
+             sout.println();
+             break;
+           }
+         }
+         numOfPrintedRows = 0;
+         sout.println();
+       }
+     }
+     sout.println(getQuerySuccessMessage(tableDesc, responseTime, 
totalPrintedRows, "selected", endOfTuple));
+     sout.flush();
+   }
+ 
+   @Override
+   public void printNoResult(PrintWriter sout) {
+     sout.println("(0 rows)");
+     sout.flush();
+   }
+ 
+   @Override
+   public void printProgress(PrintWriter sout, QueryStatus status) {
+     sout.println("Progress: " + (int)(status.getProgress() * 100.0f)
+         + "%, response time: "
+         + getResponseTimeReadable((float)((status.getFinishTime() - 
status.getSubmitTime()) / 1000.0)));
+     sout.flush();
+   }
+ 
+   @Override
+   public void printMessage(PrintWriter sout, String message) {
+     sout.println(message);
+     sout.flush();
+   }
+ 
+   @Override
+   public void printErrorMessage(PrintWriter sout, Throwable t) {
+     sout.println(parseErrorMessage(t.getMessage()));
+     if (printErrorTrace) {
+       sout.println(ExceptionUtils.getStackTrace(t));
+     }
+     sout.flush();
+   }
+ 
+   @Override
+   public void printErrorMessage(PrintWriter sout, String message) {
+     sout.println(parseErrorMessage(message));
+     sout.flush();
+   }
+ 
+   @Override
+   public void printKilledMessage(PrintWriter sout, QueryId queryId) {
+     sout.println(TajoCli.KILL_PREFIX + queryId);
+     sout.flush();
+   }
+ 
+   @Override
+   public void printErrorMessage(PrintWriter sout, QueryStatus status) {
+     if (status.getErrorMessage() != null && 
!status.getErrorMessage().isEmpty()) {
+       printErrorMessage(sout, parseErrorMessage(status.getErrorMessage()));
+     } else {
+       printErrorMessage(sout, "No error message");
+     }
+     if (printErrorTrace && status.getErrorTrace() != null && 
!status.getErrorTrace().isEmpty()) {
+       sout.println(status.getErrorTrace());
+     }
+     sout.flush();
+   }
+ 
+   public static String parseErrorMessage(String message) {
+     if (message == null) {
+       return TajoCli.ERROR_PREFIX + "No error message";
+     }
+     String[] lines = message.split("\n");
+     message = lines[0];
+ 
+     int index = message.lastIndexOf(TajoCli.ERROR_PREFIX);
+     if (index < 0) {
+       message = TajoCli.ERROR_PREFIX + message;
+     } else {
+       message = message.substring(index);
+     }
+ 
+     return message;
+   }
+ }

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-client/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
----------------------------------------------------------------------
diff --cc 
tajo-client/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
index 0000000,2d4408b..1248ca6
mode 000000,100644..100644
--- 
a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
+++ 
b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
@@@ -1,0 -1,136 +1,137 @@@
+ /**
+  * 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.cli.tsql.commands;
+ 
+ import org.apache.commons.lang.CharUtils;
+ import org.apache.commons.lang.StringEscapeUtils;
++import org.apache.tajo.TajoConstants;
+ import org.apache.tajo.catalog.Column;
+ import org.apache.tajo.catalog.TableDesc;
+ import org.apache.tajo.catalog.partition.PartitionMethodDesc;
+ import org.apache.tajo.cli.tsql.TajoCli;
+ import org.apache.tajo.client.QueryClient;
+ import org.apache.tajo.util.FileUtil;
+ import org.apache.tajo.util.TUtil;
+ 
+ import java.util.List;
+ import java.util.Map;
+ 
+ public class DescTableCommand extends TajoShellCommand {
+   public DescTableCommand(TajoCli.TajoCliContext context) {
+     super(context);
+   }
+ 
+   @Override
+   public String getCommand() {
+     return "\\d";
+   }
+ 
+   @Override
+   public void invoke(String[] cmd) throws Exception {
+     if (cmd.length == 2) {
+       String tableName = cmd[1];
+       tableName = tableName.replace("\"", "");
+       TableDesc desc = client.getTableDesc(tableName);
+       if (desc == null) {
+         context.getOutput().println("Did not find any relation named \"" + 
tableName + "\"");
+       } else {
+         context.getOutput().println(toFormattedString(desc));
+       }
+     } else if (cmd.length == 1) {
+       List<String> tableList = client.getTableList(null);
+       if (tableList.size() == 0) {
+         context.getOutput().println("No Relation Found");
+       }
+       for (String table : tableList) {
+         context.getOutput().println(table);
+       }
+     } else {
+       throw new IllegalArgumentException();
+     }
+   }
+ 
+   @Override
+   public String getUsage() {
+     return "[table_name]";
+   }
+ 
+   @Override
+   public String getDescription() {
+     return "show table description";
+   }
+ 
+   protected String toFormattedString(TableDesc desc) {
+     StringBuilder sb = new StringBuilder();
+     sb.append("\ntable name: ").append(desc.getName()).append("\n");
+     sb.append("table path: ").append(desc.getPath()).append("\n");
+     sb.append("store type: 
").append(desc.getMeta().getStoreType()).append("\n");
+     if (desc.getStats() != null) {
+ 
+       long row = desc.getStats().getNumRows();
 -      String rowText = row == QueryClient.UNKNOWN_ROW_NUMBER ? "unknown" : 
row + "";
++      String rowText = row == TajoConstants.UNKNOWN_ROW_NUMBER ? "unknown" : 
row + "";
+       sb.append("number of rows: ").append(rowText).append("\n");
+       sb.append("volume: ").append(
+           FileUtil.humanReadableByteCount(desc.getStats().getNumBytes(),
+               true)).append("\n");
+     }
+     sb.append("Options: \n");
+     for(Map.Entry<String, String> entry : desc.getMeta().toMap().entrySet()){
+ 
+       /*
+       *  Checks whether the character is ASCII 7 bit printable.
+       *  For example, a printable unicode '\u007c' become the character 
‘|’.
+       *
+       *  Control-chars : ctrl-a(\u0001), tab(\u0009) ..
+       *  Printable-chars : '|'(\u007c), ','(\u002c) ..
+       * */
+ 
+       String value = entry.getValue();
+       String unescaped = StringEscapeUtils.unescapeJava(value);
+       if (unescaped.length() == 1 && 
CharUtils.isAsciiPrintable(unescaped.charAt(0))) {
+         value = unescaped;
+       }
+       
sb.append("\t").append("'").append(entry.getKey()).append("'").append("=")
+           .append("'").append(value).append("'").append("\n");
+     }
+     sb.append("\n");
+     sb.append("schema: \n");
+ 
+     for(int i = 0; i < desc.getSchema().size(); i++) {
+       Column col = desc.getSchema().getColumn(i);
+       
sb.append(col.getSimpleName()).append("\t").append(col.getDataType().getType());
+       if (col.getDataType().hasLength()) {
+         sb.append("(").append(col.getDataType().getLength()).append(")");
+       }
+       sb.append("\n");
+     }
+ 
+     sb.append("\n");
+     if (desc.getPartitionMethod() != null) {
+       PartitionMethodDesc partition = desc.getPartitionMethod();
+       sb.append("Partitions: \n");
+ 
+       
sb.append("type:").append(partition.getPartitionType().name()).append("\n");
+ 
+       sb.append("columns:").append(":");
+       
sb.append(TUtil.arrayToString(partition.getExpressionSchema().toArray()));
+     }
+ 
+     return sb.toString();
+   }
+ }

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-client/src/main/java/org/apache/tajo/client/QueryClient.java
----------------------------------------------------------------------
diff --cc tajo-client/src/main/java/org/apache/tajo/client/QueryClient.java
index 0000000,dbbafb6..59ef52b
mode 000000,100644..100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/QueryClient.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/QueryClient.java
@@@ -1,0 -1,116 +1,114 @@@
+ /**
+  * 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.client;
+ 
+ import com.google.protobuf.ServiceException;
+ import org.apache.hadoop.security.UserGroupInformation;
+ import org.apache.tajo.QueryId;
+ import org.apache.tajo.ipc.ClientProtos;
+ import org.apache.tajo.jdbc.TajoMemoryResultSet;
+ 
+ import java.io.Closeable;
+ import java.io.IOException;
+ import java.sql.ResultSet;
+ import java.util.List;
+ import java.util.Map;
+ 
+ import static org.apache.tajo.TajoIdProtos.SessionIdProto;
+ 
+ public interface QueryClient extends Closeable {
+ 
 -  int UNKNOWN_ROW_NUMBER = -1;
 -
+   public void setSessionId(SessionIdProto sessionId);
+ 
+   public boolean isConnected();
+ 
+   public SessionIdProto getSessionId();
+ 
+   public String getBaseDatabase();
+ 
+   @Override
+   public void close();
+ 
+   public UserGroupInformation getUserInfo();
+ 
+   /**
+    * Call to QueryMaster closing query resources
+    * @param queryId
+    */
+   public void closeQuery(final QueryId queryId);
+ 
+   public void closeNonForwardQuery(final QueryId queryId);
+ 
+   public String getCurrentDatabase() throws ServiceException;
+ 
+   public Boolean selectDatabase(final String databaseName) throws 
ServiceException;
+ 
+   public Boolean updateSessionVariables(final Map<String, String> variables) 
throws ServiceException;
+ 
+   public Boolean unsetSessionVariables(final List<String> variables) throws 
ServiceException;
+ 
+   public String getSessionVariable(final String varname) throws 
ServiceException;
+ 
+   public Boolean existSessionVariable(final String varname) throws 
ServiceException;
+ 
+   public Map<String, String> getAllSessionVariables() throws ServiceException;
+ 
+   /**
+    * It submits a query statement and get a response immediately.
+    * The response only contains a query id, and submission status.
+    * In order to get the result, you should use {@link 
#getQueryResult(org.apache.tajo.QueryId)}.
+    */
+   public ClientProtos.SubmitQueryResponse executeQuery(final String sql) 
throws ServiceException;
+ 
+   public ClientProtos.SubmitQueryResponse executeQueryWithJson(final String 
json) throws ServiceException;
+ 
+   /**
+    * It submits a query statement and get a response.
+    * The main difference from {@link #executeQuery(String)}
+    * is a blocking method. So, this method is wait for
+    * the finish of the submitted query.
+    *
+    * @return If failed, return null.
+    */
+   public ResultSet executeQueryAndGetResult(final String sql) throws 
ServiceException, IOException;
+ 
+   public ResultSet executeJsonQueryAndGetResult(final String json) throws 
ServiceException, IOException;
+ 
+   public QueryStatus getQueryStatus(QueryId queryId) throws ServiceException;
+ 
+   public ResultSet getQueryResult(QueryId queryId) throws ServiceException, 
IOException;
+ 
+   public ResultSet createNullResultSet(QueryId queryId) throws IOException;
+ 
+   public ClientProtos.GetQueryResultResponse getResultResponse(QueryId 
queryId) throws ServiceException;
+ 
+   public TajoMemoryResultSet fetchNextQueryResult(final QueryId queryId, 
final int fetchRowNum) throws ServiceException;
+ 
+   public boolean updateQuery(final String sql) throws ServiceException;
+ 
+   public boolean updateQueryWithJson(final String json) throws 
ServiceException;
+ 
+   public List<ClientProtos.BriefQueryInfo> getRunningQueryList() throws 
ServiceException;
+ 
+   public List<ClientProtos.BriefQueryInfo> getFinishedQueryList() throws 
ServiceException;
+ 
+   public List<ClientProtos.WorkerResourceInfo> getClusterInfo() throws 
ServiceException;
+ 
+   public QueryStatus killQuery(final QueryId queryId) throws 
ServiceException, IOException;
+ }

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSet.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
----------------------------------------------------------------------
diff --cc 
tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
index ecc3616,99b79ec..76574a8
--- 
a/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
@@@ -45,9 -45,9 +45,10 @@@ import org.apache.tajo.ipc.TajoWorkerPr
  import 
org.apache.tajo.ipc.TajoWorkerProtocol.DistinctGroupbyEnforcer.MultipleAggregationStage;
  import 
org.apache.tajo.ipc.TajoWorkerProtocol.DistinctGroupbyEnforcer.SortSpecArray;
  import org.apache.tajo.plan.LogicalPlan;
- import org.apache.tajo.plan.util.PlannerUtil;
  import org.apache.tajo.plan.logical.*;
+ import org.apache.tajo.plan.util.PlannerUtil;
+ import org.apache.tajo.storage.BaseTupleComparator;
 +import org.apache.tajo.storage.FileStorageManager;
  import org.apache.tajo.storage.StorageConstants;
  import org.apache.tajo.storage.StorageManager;
  import org.apache.tajo.storage.TupleComparator;
@@@ -1184,12 -1184,11 +1185,12 @@@ public class PhysicalPlannerImpl implem
          FragmentConvertor.convert(ctx.getConf(), 
ctx.getDataChannel().getStoreType(), fragmentProtos);
  
      String indexName = IndexUtil.getIndexNameOfFrag(fragments.get(0), 
annotation.getSortKeys());
 -    Path indexPath = new Path(sm.getTablePath(annotation.getTableName()), 
"index");
 +    Path indexPath = new Path(
 +        
StorageManager.getFileStorageManager(ctx.getConf()).getTablePath(annotation.getTableName()),
 "index");
  
-     TupleComparator comp = new TupleComparator(annotation.getKeySchema(),
+     TupleComparator comp = new BaseTupleComparator(annotation.getKeySchema(),
          annotation.getSortKeys());
 -    return new BSTIndexScanExec(ctx, sm, annotation, fragments.get(0), new 
Path(indexPath, indexName),
 +    return new BSTIndexScanExec(ctx, annotation, fragments.get(0), new 
Path(indexPath, indexName),
          annotation.getKeySchema(), comp, annotation.getDatum());
  
    }

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ExternalSortExec.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalPlanUtil.java
----------------------------------------------------------------------
diff --cc 
tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalPlanUtil.java
index f2df2c8,ec5915f..0538813
--- 
a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalPlanUtil.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/PhysicalPlanUtil.java
@@@ -34,7 -34,7 +34,8 @@@ import org.apache.tajo.plan.expr.EvalNo
  import org.apache.tajo.plan.logical.NodeType;
  import org.apache.tajo.plan.logical.PersistentStoreNode;
  import org.apache.tajo.engine.query.QueryContext;
 +import org.apache.tajo.storage.FileStorageManager;
+ import org.apache.tajo.storage.BaseTupleComparator;
  import org.apache.tajo.storage.StorageConstants;
  import org.apache.tajo.storage.StorageManager;
  import org.apache.tajo.storage.TupleComparator;

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
index 06acd83,f7c7b11..8088391
--- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@@ -40,10 -40,8 +40,8 @@@ import org.apache.tajo.catalog.*
  import org.apache.tajo.catalog.exception.*;
  import org.apache.tajo.catalog.partition.PartitionMethodDesc;
  import org.apache.tajo.catalog.proto.CatalogProtos;
- import org.apache.tajo.catalog.proto.CatalogProtos.FragmentProto;
 +import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
  import org.apache.tajo.catalog.statistics.TableStats;
- import org.apache.tajo.client.TajoClient;
 -import org.apache.tajo.client.QueryClient;
  import org.apache.tajo.common.TajoDataTypes;
  import org.apache.tajo.conf.TajoConf;
  import org.apache.tajo.datum.DatumFactory;

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/main/java/org/apache/tajo/master/TajoMaster.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBSTIndexExec.java
----------------------------------------------------------------------
diff --cc 
tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBSTIndexExec.java
index c5a6d46,c7fbf39..0b9f2eb
--- 
a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBSTIndexExec.java
+++ 
b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBSTIndexExec.java
@@@ -66,9 -66,9 +66,9 @@@ public class TestBSTIndexExec 
    private SQLAnalyzer analyzer;
    private LogicalPlanner planner;
    private LogicalOptimizer optimizer;
 -  private StorageManager sm;
 +  private FileStorageManager sm;
    private Schema idxSchema;
-   private TupleComparator comp;
+   private BaseTupleComparator comp;
    private BSTIndex.BSTIndexWriter writer;
    private HashMap<Integer , Integer> randomValues ;
    private int rndKey = -1;

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-core/src/test/java/org/apache/tajo/worker/TestRangeRetrieverHandler.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-storage/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/85627a52/tajo-storage/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java
----------------------------------------------------------------------

Reply via email to