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 2014/08/11 10:11:46 UTC
[17/17] git commit: Merge branch 'master' of
http://git-wip-us.apache.org/repos/asf/tajo into index_support
Merge branch 'master' of http://git-wip-us.apache.org/repos/asf/tajo into index_support
Conflicts:
tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/fa8f037b
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/fa8f037b
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/fa8f037b
Branch: refs/heads/index_support
Commit: fa8f037bb5676e9499c23a0f489cf2a448885ddd
Parents: 5c0277f ddfc3f3
Author: Jihoon Son <ji...@apache.org>
Authored: Mon Aug 11 17:11:04 2014 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Mon Aug 11 17:11:04 2014 +0900
----------------------------------------------------------------------
CHANGES | 33 +-
.../java/org/apache/tajo/catalog/TableMeta.java | 14 +-
.../apache/tajo/catalog/TestKeyValueSet.java | 83 +++-
.../tajo/catalog/store/HCatalogStore.java | 28 +-
.../tajo/catalog/store/TestHCatalogStore.java | 12 +-
.../org/apache/tajo/catalog/TestCatalog.java | 10 +-
.../tajo/cli/DefaultTajoCliOutputFormatter.java | 16 +-
.../java/org/apache/tajo/cli/HelpCommand.java | 100 ++---
.../java/org/apache/tajo/cli/SetCommand.java | 78 +++-
.../main/java/org/apache/tajo/cli/TajoCli.java | 152 +++++---
.../apache/tajo/cli/TajoCliOutputFormatter.java | 5 +-
.../org/apache/tajo/cli/TajoGetConfCommand.java | 57 +++
.../org/apache/tajo/cli/TajoShellCommand.java | 10 +-
.../java/org/apache/tajo/client/TajoAdmin.java | 16 +
.../org/apache/tajo/client/TajoGetConf.java | 171 +++++++++
.../main/java/org/apache/tajo/ConfigKey.java | 52 +++
.../java/org/apache/tajo/OverridableConf.java | 235 ++++++++++++
.../main/java/org/apache/tajo/SessionVars.java | 211 +++++++++++
.../java/org/apache/tajo/conf/TajoConf.java | 204 +++++-----
.../main/java/org/apache/tajo/datum/Datum.java | 72 ++++
.../java/org/apache/tajo/datum/Float4Datum.java | 60 ++-
.../java/org/apache/tajo/datum/Float8Datum.java | 78 +++-
.../java/org/apache/tajo/datum/Int2Datum.java | 76 +++-
.../java/org/apache/tajo/datum/Int4Datum.java | 78 +++-
.../java/org/apache/tajo/datum/Int8Datum.java | 78 +++-
.../org/apache/tajo/datum/IntervalDatum.java | 16 +-
.../java/org/apache/tajo/datum/NullDatum.java | 1 +
.../java/org/apache/tajo/util/BytesUtils.java | 35 ++
.../java/org/apache/tajo/util/KeyValueSet.java | 149 ++++++--
.../tajo/datum/TestArithmeticOperator.java | 377 +++++++++++++++++++
.../exception/RangeOverflowException.java | 5 +-
.../function/builtin/CountValueDistinct.java | 4 +-
.../apache/tajo/engine/function/math/Round.java | 2 +-
.../tajo/engine/function/math/RoundFloat8.java | 39 +-
.../tajo/engine/planner/LogicalOptimizer.java | 9 +-
.../apache/tajo/engine/planner/LogicalPlan.java | 4 +-
.../engine/planner/LogicalPlanPreprocessor.java | 18 +-
.../engine/planner/LogicalPlanVerifier.java | 12 +-
.../tajo/engine/planner/LogicalPlanner.java | 35 +-
.../engine/planner/PhysicalPlannerImpl.java | 44 ++-
.../engine/planner/PreLogicalPlanVerifier.java | 21 +-
.../engine/planner/RangePartitionAlgorithm.java | 97 ++---
.../engine/planner/UniformRangePartition.java | 259 ++++++++-----
.../engine/planner/global/GlobalPlanner.java | 18 +-
.../planner/physical/ExternalSortExec.java | 4 +-
.../engine/planner/physical/StoreTableExec.java | 6 +-
.../planner/rewrite/ProjectionPushDownRule.java | 10 +
.../apache/tajo/engine/query/QueryContext.java | 144 +++----
.../tajo/engine/query/QueryUnitRequestImpl.java | 3 +-
.../org/apache/tajo/master/GlobalEngine.java | 112 +++---
.../tajo/master/TajoMasterClientService.java | 34 +-
.../apache/tajo/master/querymaster/Query.java | 4 +-
.../tajo/master/querymaster/QueryMaster.java | 39 +-
.../querymaster/QueryMasterManagerService.java | 7 +-
.../master/querymaster/QueryMasterTask.java | 4 +-
.../tajo/master/querymaster/Repartitioner.java | 138 +++++--
.../tajo/master/querymaster/SubQuery.java | 31 +-
.../org/apache/tajo/master/session/Session.java | 50 +--
.../session/SessionLivelinessMonitor.java | 2 +-
.../java/org/apache/tajo/worker/FetchImpl.java | 23 ++
.../java/org/apache/tajo/worker/Fetcher.java | 31 +-
.../tajo/worker/TajoWorkerManagerService.java | 13 +
.../main/java/org/apache/tajo/worker/Task.java | 12 +-
.../apache/tajo/worker/TaskAttemptContext.java | 12 +-
.../java/org/apache/tajo/worker/TaskRunner.java | 21 +-
.../src/main/proto/TajoWorkerProtocol.proto | 5 +
.../resources/webapps/worker/querydetail.jsp | 10 +
.../apache/tajo/LocalTajoTestingUtility.java | 5 +
.../java/org/apache/tajo/QueryTestCaseBase.java | 2 +-
.../test/java/org/apache/tajo/TpchTestBase.java | 2 +-
.../tajo/cli/TestDefaultCliOutputFormatter.java | 47 ++-
.../java/org/apache/tajo/cli/TestTajoCli.java | 185 +++++----
.../org/apache/tajo/client/TestTajoClient.java | 8 +-
.../apache/tajo/engine/eval/ExprTestBase.java | 9 +-
.../tajo/engine/eval/TestEvalTreeUtil.java | 16 +-
.../tajo/engine/function/TestMathFunctions.java | 26 +-
.../engine/planner/TestLogicalOptimizer.java | 20 +-
.../tajo/engine/planner/TestLogicalPlan.java | 3 +-
.../tajo/engine/planner/TestLogicalPlanner.java | 138 +++++--
.../tajo/engine/planner/TestPlannerUtil.java | 5 +-
.../planner/TestUniformRangePartition.java | 159 +++++++-
.../planner/global/TestBroadcastJoinPlan.java | 62 +--
.../planner/physical/TestBNLJoinExec.java | 9 +-
.../planner/physical/TestBSTIndexExec.java | 4 +-
.../planner/physical/TestExternalSortExec.java | 4 +-
.../physical/TestFullOuterHashJoinExec.java | 24 +-
.../physical/TestFullOuterMergeJoinExec.java | 29 +-
.../planner/physical/TestHashAntiJoinExec.java | 4 +-
.../planner/physical/TestHashJoinExec.java | 19 +-
.../planner/physical/TestHashSemiJoinExec.java | 4 +-
.../physical/TestLeftOuterHashJoinExec.java | 28 +-
.../physical/TestLeftOuterNLJoinExec.java | 25 +-
.../planner/physical/TestMergeJoinExec.java | 4 +-
.../engine/planner/physical/TestNLJoinExec.java | 17 +-
.../planner/physical/TestPhysicalPlanner.java | 100 ++---
.../physical/TestProgressExternalSortExec.java | 4 +-
.../physical/TestRightOuterHashJoinExec.java | 16 +-
.../physical/TestRightOuterMergeJoinExec.java | 32 +-
.../engine/planner/physical/TestSortExec.java | 4 +-
.../tajo/engine/query/TestCreateIndex.java | 5 +-
.../tajo/engine/query/TestGroupByQuery.java | 64 ++--
.../tajo/engine/query/TestJoinBroadcast.java | 8 +-
.../apache/tajo/engine/query/TestJoinQuery.java | 90 ++---
.../tajo/engine/query/TestNullValues.java | 14 +-
.../tajo/engine/query/TestSelectQuery.java | 40 +-
.../apache/tajo/engine/query/TestSortQuery.java | 8 +-
.../org/apache/tajo/jdbc/TestResultSet.java | 2 +-
.../tajo/master/TestExecutionBlockCursor.java | 6 +-
.../apache/tajo/master/TestGlobalPlanner.java | 4 +-
.../apache/tajo/master/TestRepartitioner.java | 93 ++++-
.../querymaster/TestQueryUnitStatusUpdate.java | 2 +-
.../apache/tajo/worker/TestDeletionService.java | 61 +++
.../org/apache/tajo/worker/TestFetcher.java | 29 +-
.../tajo/worker/TestRangeRetrieverHandler.java | 8 +-
.../testDistinctAggregationCaseByCase3.sql | 8 +
.../testDistinctAggregationCaseByCase4.sql | 7 +
.../TestSelectQuery/testCaseWhenRound.sql | 8 +
...testSelectColumnAliasExistingInRelation3.sql | 19 +
.../testDistinctAggregationCaseByCase3.result | 3 +
.../testDistinctAggregationCaseByCase4.result | 3 +
.../TestSelectQuery/testCaseWhenRound.result | 22 ++
...tSelectColumnAliasExistingInRelation3.result | 11 +
.../TestTajoCli/testHelpSessionVars.result | 36 ++
...estSelectResultWithNullTrueDeprecated.result | 9 +
.../testStopWhenErrorDeprecated.result | 6 +
tajo-dist/src/main/bin/tajo | 5 +
.../java/org/apache/tajo/storage/Appender.java | 2 +-
.../java/org/apache/tajo/storage/CSVFile.java | 11 +-
.../org/apache/tajo/storage/StorageUtil.java | 18 +-
.../org/apache/tajo/storage/avro/AvroUtil.java | 17 +-
.../org/apache/tajo/storage/rcfile/RCFile.java | 10 +-
.../sequencefile/SequenceFileAppender.java | 30 +-
.../sequencefile/SequenceFileScanner.java | 21 +-
.../apache/tajo/storage/v2/RCFileScanner.java | 2 +-
.../tajo/storage/TestCompressionStorages.java | 12 +
.../org/apache/tajo/storage/TestStorages.java | 13 +
.../tajo/pullserver/TajoPullServerService.java | 54 ++-
137 files changed, 4202 insertions(+), 1362 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/CHANGES
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanPreprocessor.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
index 0e2b26c,35df11f..162aed2
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
@@@ -1850,57 -1844,6 +1849,57 @@@ public class LogicalPlanner extends Bas
}
@Override
+ public LogicalNode visitCreateIndex(PlanContext context, Stack<Expr> stack, CreateIndex createIndex)
+ throws PlanningException {
+ stack.push(createIndex);
+ LogicalNode child = visit(context, stack, createIndex.getChild());
+ stack.pop();
+
+ QueryBlock block = context.queryBlock;
+ CreateIndexNode createIndexNode = block.getNodeFromExpr(createIndex);
+ if (CatalogUtil.isFQTableName(createIndex.getIndexName())) {
+ createIndexNode.setIndexName(createIndex.getIndexName());
+ } else {
+ createIndexNode.setIndexName(
- CatalogUtil.buildFQName(context.session.getCurrentDatabase(), createIndex.getIndexName()));
++ CatalogUtil.buildFQName(context.queryContext.getCurrentDatabase(), createIndex.getIndexName()));
+ }
+ createIndexNode.setUnique(createIndex.isUnique());
+ Sort.SortSpec[] sortSpecs = createIndex.getSortSpecs();
+ int sortKeyNum = sortSpecs.length;
+ String[] referNames = new String[sortKeyNum];
+
+ ExprNormalizedResult[] normalizedExprList = new ExprNormalizedResult[sortKeyNum];
+ for (int i = 0; i < sortKeyNum; i++) {
+ normalizedExprList[i] = normalizer.normalize(context, sortSpecs[i].getKey());
+ }
+ for (int i = 0; i < sortKeyNum; i++) {
+ referNames[i] = block.namedExprsMgr.addExpr(normalizedExprList[i].baseExpr);
+ block.namedExprsMgr.addNamedExprArray(normalizedExprList[i].aggExprs);
+ block.namedExprsMgr.addNamedExprArray(normalizedExprList[i].scalarExprs);
+ }
+
+ createIndexNode.setSortSpecs(annotateSortSpecs(block, referNames, sortSpecs));
+ createIndexNode.setIndexType(IndexMethod.valueOf(createIndex.getMethodSpec().getName().toUpperCase()));
+
+ if (createIndex.getParams() != null) {
+ KeyValueSet keyValueSet = new KeyValueSet();
+ keyValueSet.putAll(createIndex.getParams());
+ createIndexNode.setOptions(keyValueSet);
+ }
+
+ createIndexNode.setInSchema(child.getOutSchema());
+ createIndexNode.setChild(child);
+ return createIndexNode;
+ }
+
+ @Override
+ public LogicalNode visitDropIndex(PlanContext context, Stack<Expr> stack, DropIndex dropIndex) {
+ DropIndexNode dropIndexNode = context.queryBlock.getNodeFromExpr(dropIndex);
+ dropIndexNode.init(dropIndex.getIndexName(), dropIndex.isIfExists());
+ return dropIndexNode;
+ }
+
+ @Override
public LogicalNode visitTruncateTable(PlanContext context, Stack<Expr> stack, TruncateTable truncateTable)
throws PlanningException {
TruncateTableNode truncateTableNode = context.queryBlock.getNodeFromExpr(truncateTable);
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/rewrite/ProjectionPushDownRule.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/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 aed2fe6,37a56ba..24637b1
--- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@@ -190,17 -173,10 +176,23 @@@ public class GlobalEngine extends Abstr
if (PlannerUtil.checkIfDDLPlan(rootNode)) {
context.getSystemMetrics().counter("Query", "numDDLQuery").inc();
- updateQuery(queryContext, rootNode.getChild());
- responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
- responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
++//<<<<<<< HEAD
++//=======
++// updateQuery(queryContext, rootNode.getChild());
++// responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
++// responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
++//>>>>>>> ddfc3f33039ee15ab0a2d3fe5890b9acb40aec3d
+
+ if (PlannerUtil.checkIfCreateIndexPlan(rootNode)) {
+ return createIndex(session, (CreateIndexNode)rootNode.getChild(), queryContext,
+ plan, sql, jsonExpr, responseBuilder);
+ } else {
- updateQuery(session, rootNode.getChild());
++ updateQuery(queryContext, rootNode.getChild());
+ responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
+ responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
+ return responseBuilder.build();
+ }
} else if (plan.isExplain()) { // explain query
String explainStr = PlannerUtil.buildExplainString(plan.getRootBlock().getRoot());
Schema schema = new Schema();
@@@ -468,13 -432,8 +460,13 @@@
return true;
case TRUNCATE_TABLE:
TruncateTableNode truncateTable = (TruncateTableNode) root;
- truncateTable(session, truncateTable);
+ truncateTable(queryContext, truncateTable);
return true;
+ case DROP_INDEX:
+ DropIndexNode dropIndexNode = (DropIndexNode) root;
- dropIndex(session, dropIndexNode);
++ dropIndex(queryContext, dropIndexNode);
+ return true;
+
default:
throw new InternalError("updateQuery cannot handle such query: \n" + root.toJson());
}
@@@ -663,98 -624,6 +657,98 @@@
}
}
+ /**
+ * Create an index for a given table.
+ * @param session user session
+ * @param createIndexNode the root of logical plan
+ */
+ private SubmitQueryResponse createIndex(final Session session, final CreateIndexNode createIndexNode,
+ QueryContext queryContext, LogicalPlan plan,
+ String sql, String jsonExpr,
+ SubmitQueryResponse.Builder responseBuilder) throws Exception {
+ SubmitQueryResponse response = null;
+ final CatalogService catalog = context.getCatalog();
+ final String dbName = session.getCurrentDatabase();
+ String indexName = createIndexNode.getIndexName();
+ if (CatalogUtil.isFQTableName(indexName)) {
+ indexName = CatalogUtil.splitFQTableName(indexName)[1];
+ }
+
+ boolean exists = catalog.existIndexByName(dbName, indexName);
+ if (exists) {
+ if (createIndexNode.isIfNotExists()) {
+ LOG.info("index \"" + indexName + "\" already exists." );
+ } else {
+ throw new AlreadyExistsIndexException(createIndexNode.getIndexName());
+ }
+ } else {
+ response = executeInCluster(queryContext, plan, session, sql, jsonExpr, responseBuilder);
+
+ // get the table name and predicate from scan
+ try {
+ ScanNode scanNode = PlannerUtil.findTopNode(createIndexNode, NodeType.SCAN);
+ String tableName;
+ if (CatalogUtil.isFQTableName(scanNode.getTableName())) {
+ tableName = CatalogUtil.splitFQTableName(scanNode.getTableName())[1];
+ } else {
+ tableName = scanNode.getTableName();
+ }
+ String predicate = scanNode.hasQual() ? scanNode.getQual().toJson() : null;
+ // extract index keys
+ List<IndexKey> indexKeys = TUtil.newList();
+ for (SortSpec eachKey : createIndexNode.getSortSpecs()) {
+ indexKeys.add(new IndexKey(eachKey.getSortKey().toJson(), eachKey.isAscending(), eachKey.isNullFirst()));
+ }
+
+ IndexDesc indexDesc = new IndexDesc(indexName, dbName, tableName, createIndexNode.getIndexType(),
+ indexKeys, createIndexNode.isUnique(), createIndexNode.isClustered(), predicate);
+ catalog.createIndex(indexDesc);
+ } catch (Exception e) {
+ // delete index
+ deleteIndexFiles(dbName, indexName);
+ }
+ }
+ return response;
+ }
+
+ /**
+ * Drop the specified index.
- * @param session user session
++ * @param queryContext query context
+ * @param indexName index name
+ * @param ifExists if exists
+ */
- public void dropIndex(final Session session, String indexName, boolean ifExists) {
++ public void dropIndex(final QueryContext queryContext, String indexName, boolean ifExists) {
+ final CatalogService catalog = context.getCatalog();
- final String dbName = session.getCurrentDatabase();
++ final String dbName = queryContext.getCurrentDatabase();
+
+ boolean exists = catalog.existIndexByName(dbName, indexName);
+ LOG.info("index name exist: " + exists);
+ if (!exists) {
+ if (ifExists) {
+ LOG.info("index \"" + indexName + "\" does not exist." );
+ } else {
+ throw new NoSuchIndexException(indexName);
+ }
+ } else {
+ catalog.dropIndex(dbName, indexName);
+ deleteIndexFiles(dbName, indexName);
+ }
+ }
+
+ private void deleteIndexFiles(String dbName, String indexName) {
+ Path indexPath = new Path(context.getConf().getVar(ConfVars.WAREHOUSE_DIR), dbName + "/" + indexName);
+ try {
+ FileSystem fs = indexPath.getFileSystem(context.getConf());
+ fs.delete(indexPath, true);
+ } catch (IOException e) {
+ throw new InternalError(e.getMessage());
+ }
+ }
+
- private void dropIndex(final Session session, final DropIndexNode dropIndexNode) {
- dropIndex(session, dropIndexNode.getIndexName(), dropIndexNode.isIfExists());
++ private void dropIndex(final QueryContext queryContext, final DropIndexNode dropIndexNode) {
++ dropIndex(queryContext, dropIndexNode.getIndexName(), dropIndexNode.isIfExists());
+ }
+
private boolean existColumnName(String tableName, String columnName) {
final TableDesc tableDesc = catalog.getTableDesc(tableName);
return tableDesc.getSchema().containsByName(columnName) ? true : false;
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
index 1ac85e3,7d80a88..2f3cbf9
--- a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@@ -754,42 -770,5 +773,43 @@@ public class TajoMasterClientService ex
throw new ServiceException(t);
}
}
+
+ @Override
+ public BoolProto existIndex(RpcController controller, SessionedStringProto request) throws ServiceException {
+ try {
+ Session session = context.getSessionManager().getSession(request.getSessionId().getId());
+
+ String databaseName;
+ String indexName;
+ if (CatalogUtil.isFQTableName(request.getValue())) {
+ String [] splitted = CatalogUtil.splitFQTableName(request.getValue());
+ databaseName = splitted[0];
+ indexName = splitted[1];
+ } else {
+ databaseName = session.getCurrentDatabase();
+ indexName = request.getValue();
+ }
+
+ if (catalog.existIndexByName(databaseName, indexName)) {
+ return BOOL_TRUE;
+ } else {
+ return BOOL_FALSE;
+ }
+ } catch (Throwable e) {
+ throw new ServiceException(e);
+ }
+ }
+
+ @Override
+ public BoolProto dropIndex(RpcController controller, SessionedStringProto request) throws ServiceException {
+ try {
+ Session session = context.getSessionManager().getSession(request.getSessionId().getId());
- context.getGlobalEngine().dropIndex(session, request.getValue(), true);
++ QueryContext queryContext = new QueryContext(conf, session);
++ context.getGlobalEngine().dropIndex(queryContext, request.getValue(), true);
+ return BOOL_TRUE;
+ } catch (Throwable t) {
+ throw new ServiceException(t);
+ }
+ }
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/test/java/org/apache/tajo/QueryTestCaseBase.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
----------------------------------------------------------------------
diff --cc tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
index 6a6d07c,73f72be..81be5c4
--- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
@@@ -835,31 -871,11 +870,34 @@@ public class TestLogicalPlanner
}
@Test
+ public final void testCreateIndexNode() throws PlanningException {
++ QueryContext qc = new QueryContext(util.getConfiguration(), session);
+ Expr expr = sqlAnalyzer.parse(QUERIES[11]);
- LogicalPlan rootNode = planner.createPlan(session, expr);
++ LogicalPlan rootNode = planner.createPlan(qc, expr);
+ LogicalNode plan = rootNode.getRootBlock().getRoot();
+ testJsonSerDerObject(plan);
+
+ LogicalRootNode root = (LogicalRootNode) plan;
+ assertEquals(NodeType.CREATE_INDEX, root.getChild().getType());
+ CreateIndexNode createIndexNode = root.getChild();
+
+ assertEquals(NodeType.PROJECTION, createIndexNode.getChild().getType());
+ ProjectionNode projNode = createIndexNode.getChild();
+
+ assertEquals(NodeType.SELECTION, projNode.getChild().getType());
+ SelectionNode selNode = projNode.getChild();
+
+ assertEquals(NodeType.SCAN, selNode.getChild().getType());
+ ScanNode scanNode = selNode.getChild();
+ assertEquals(CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "employee"), scanNode.getTableName());
+ }
+
+ @Test
public final void testAsterisk() throws CloneNotSupportedException, PlanningException {
+ QueryContext qc = new QueryContext(util.getConfiguration(), session);
+
Expr expr = sqlAnalyzer.parse(QUERIES[13]);
- LogicalPlan planNode = planner.createPlan(session, expr);
+ LogicalPlan planNode = planner.createPlan(qc, expr);
LogicalNode plan = planNode.getRootBlock().getRoot();
assertEquals(NodeType.ROOT, plan.getType());
TestLogicalNode.testCloneLogicalNode(plan);
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
----------------------------------------------------------------------
diff --cc tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
index 6c36040,a184a9a..072cff3
--- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
@@@ -797,17 -799,11 +799,17 @@@ public class TestPhysicalPlanner
FileFragment[] frags = StorageManager.splitNG(conf, "default.employee", employee.getMeta(), employee.getPath(),
Integer.MAX_VALUE);
Path workDir = CommonTestingUtil.getTestDir("target/test-data/testCreateIndex");
+ Path indexPath = StorageUtil.concatPath(TajoConf.getWarehouseDir(conf), "default/idx_employee");
+ if (sm.getFileSystem().exists(indexPath)) {
+ sm.getFileSystem().delete(indexPath, true);
+ }
+
- TaskAttemptContext ctx = new TaskAttemptContext(conf, new QueryContext(),
+ TaskAttemptContext ctx = new TaskAttemptContext(new QueryContext(conf),
LocalTajoTestingUtility.newQueryUnitAttemptId(masterPlan),
new FileFragment[] {frags[0]}, workDir);
+ ctx.setEnforcer(new Enforcer());
Expr context = analyzer.parse(createIndexStmt[0]);
- LogicalPlan plan = planner.createPlan(session, context);
+ LogicalPlan plan = planner.createPlan(defaultContext, context);
LogicalNode rootNode = optimizer.optimize(plan);
PhysicalPlanner phyPlanner = new PhysicalPlannerImpl(conf, sm);
http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCreateIndex.java
----------------------------------------------------------------------
diff --cc tajo-core/src/test/java/org/apache/tajo/engine/query/TestCreateIndex.java
index 4714bd6,0000000..f03ed61
mode 100644,000000..100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCreateIndex.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCreateIndex.java
@@@ -1,90 -1,0 +1,91 @@@
+/*
+ * 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.query;
+
+import com.google.protobuf.ServiceException;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.tajo.IntegrationTest;
+import org.apache.tajo.QueryTestCaseBase;
+import org.apache.tajo.TajoConstants;
++import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.conf.TajoConf.ConfVars;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@Category(IntegrationTest.class)
+public class TestCreateIndex extends QueryTestCaseBase {
+
+ public TestCreateIndex() {
+ super(TajoConstants.DEFAULT_DATABASE_NAME);
+ }
+
+ private void checkIndexExist(String indexName) throws IOException, ServiceException {
- Path indexPath = new Path(conf.getVar(ConfVars.WAREHOUSE_DIR), "default/" + indexName);
++ Path indexPath = new Path(TajoConf.getWarehouseDir(conf), "default/" + indexName);
+ FileSystem fs = indexPath.getFileSystem(conf);
+ assertTrue(fs.exists(indexPath));
+ assertEquals(2, fs.listStatus(indexPath).length);
+ assertIndexExists(indexName);
+ }
+
+ private void checkIndexNotExist(String indexName) throws IOException, ServiceException {
- Path indexPath = new Path(conf.getVar(ConfVars.WAREHOUSE_DIR), "default/" + indexName);
++ Path indexPath = new Path(TajoConf.getWarehouseDir(conf), "default/" + indexName);
+ FileSystem fs = indexPath.getFileSystem(conf);
+ assertFalse(fs.exists(indexPath));
+ assertIndexNotExists(indexName);
+ }
+
+ @Test
+ public final void testCreateIndex() throws Exception {
+ executeQuery();
+ checkIndexExist("l_orderkey_idx");
+ executeString("drop index l_orderkey_idx");
+ checkIndexNotExist("l_orderkey_idx");
+ }
+
+ @Test
+ public final void testCreateIndexOnMultiAttrs() throws Exception {
+ executeQuery();
+ checkIndexExist("l_orderkey_partkey_idx");
+ executeString("drop index l_orderkey_partkey_idx");
+ checkIndexNotExist("l_orderkey_partkey_idx");
+ }
+
+ @Test
+ public final void testCreateIndexWithCondition() throws Exception {
+ executeQuery();
+ checkIndexExist("l_orderkey_partkey_lt10_idx");
+ executeString("drop index l_orderkey_partkey_lt10_idx");
+ checkIndexNotExist("l_orderkey_partkey_lt10_idx");
+ }
+
+ @Test
+ public final void testCreateIndexOnExpression() throws Exception {
+ executeQuery();
+ checkIndexExist("l_orderkey_100_lt10_idx");
+ executeString("drop index l_orderkey_100_lt10_idx");
+ checkIndexNotExist("l_orderkey_100_lt10_idx");
+ }
+}