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
----------------------------------------------------------------------