You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2013/12/03 12:51:09 UTC
[14/18] TAJO-284: Add table partitioning entry to Catalog. (jaehwa)
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
index b824756..d174e72 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
@@ -20,6 +20,9 @@ package org.apache.tajo.catalog;
import org.apache.hadoop.fs.Path;
import org.apache.tajo.catalog.function.Function;
+import org.apache.tajo.catalog.partition.Partitions;
+import org.apache.tajo.catalog.partition.Specifier;
+import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.catalog.proto.CatalogProtos.FunctionType;
import org.apache.tajo.catalog.proto.CatalogProtos.IndexMethod;
import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
@@ -70,19 +73,19 @@ public class TestCatalog {
schema1.addColumn(FieldName2, Type.INT4);
schema1.addColumn(FieldName3, Type.INT8);
Path path = new Path(CommonTestingUtil.getTestDir(), "table1");
- TableDesc meta = CatalogUtil.newTableDesc(
+ TableDesc meta = CatalogUtil.newTableDesc(
"getTable",
schema1,
StoreType.CSV,
new Options(),
path);
-
- assertFalse(catalog.existsTable("getTable"));
- catalog.addTable(meta);
- assertTrue(catalog.existsTable("getTable"));
-
- catalog.deleteTable("getTable");
+
assertFalse(catalog.existsTable("getTable"));
+ catalog.addTable(meta);
+ assertTrue(catalog.existsTable("getTable"));
+
+ catalog.deleteTable("getTable");
+ assertFalse(catalog.existsTable("getTable"));
}
@Test(expected = Throwable.class)
@@ -197,4 +200,212 @@ public class TestCatalog {
catalog.createFunction(overload);
assertTrue(catalog.containFunction("test3", CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.BLOB)));
}
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByHash1() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.HASH);
+ partitions.setNumPartitions(2);
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+
+ assertFalse(catalog.existsTable(tableName));
+ catalog.addTable(desc);
+ assertTrue(catalog.existsTable(tableName));
+ TableDesc retrieved = catalog.getTableDesc(tableName);
+
+ assertEquals(retrieved.getName(), tableName);
+ assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.HASH);
+ assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+ assertEquals(retrieved.getPartitions().getNumPartitions(), 2);
+
+ catalog.deleteTable(tableName);
+ assertFalse(catalog.existsTable(tableName));
+ }
+
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByHash2() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.HASH);
+ partitions.setNumPartitions(2);
+
+ partitions.addSpecifier(new Specifier("sub_part1"));
+ partitions.addSpecifier(new Specifier("sub_part2"));
+ partitions.addSpecifier(new Specifier("sub_part3"));
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(catalog.existsTable(tableName));
+ catalog.addTable(desc);
+ assertTrue(catalog.existsTable(tableName));
+
+ TableDesc retrieved = catalog.getTableDesc(tableName);
+
+ assertEquals(retrieved.getName(), tableName);
+ assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.HASH);
+ assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+ assertEquals(retrieved.getPartitions().getNumPartitions(), 2);
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getName(),
+ "sub_part1");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getName(),
+ "sub_part2");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(2).getName(),
+ "sub_part3");
+
+ catalog.deleteTable(tableName);
+ assertFalse(catalog.existsTable(tableName));
+ }
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByList() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.LIST);
+
+ partitions.addSpecifier(new Specifier("sub_part1", "Seoul,서울"));
+ partitions.addSpecifier(new Specifier("sub_part2", "Busan,부산"));
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(catalog.existsTable(tableName));
+ catalog.addTable(desc);
+ assertTrue(catalog.existsTable(tableName));
+
+ TableDesc retrieved = catalog.getTableDesc(tableName);
+
+ assertEquals(retrieved.getName(), tableName);
+ assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.LIST);
+ assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getName(),
+ "sub_part1");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getExpressions(),
+ "Seoul,서울");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getName(),
+ "sub_part2");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getExpressions(),
+ "Busan,부산");
+
+ catalog.deleteTable(tableName);
+ assertFalse(catalog.existsTable(tableName));
+ }
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByRange() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.RANGE);
+
+ partitions.addSpecifier(new Specifier("sub_part1", "2"));
+ partitions.addSpecifier(new Specifier("sub_part2", "5"));
+ partitions.addSpecifier(new Specifier("sub_part3"));
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(catalog.existsTable(tableName));
+ catalog.addTable(desc);
+ assertTrue(catalog.existsTable(tableName));
+
+ TableDesc retrieved = catalog.getTableDesc(tableName);
+
+ assertEquals(retrieved.getName(), tableName);
+ assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.RANGE);
+ assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getName(),
+ "sub_part1");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(0).getExpressions(),
+ "2");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getName(),
+ "sub_part2");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(1).getExpressions(),
+ "5");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(2).getName(),
+ "sub_part3");
+ assertEquals(retrieved.getPartitions().getSpecifiers().get(2).getExpressions(),
+ "");
+
+ catalog.deleteTable(tableName);
+ assertFalse(catalog.existsTable(tableName));
+ }
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByColumn() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.COLUMN);
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(catalog.existsTable(tableName));
+ catalog.addTable(desc);
+ assertTrue(catalog.existsTable(tableName));
+
+ TableDesc retrieved = catalog.getTableDesc(tableName);
+
+ assertEquals(retrieved.getName(), tableName);
+ assertEquals(retrieved.getPartitions().getPartitionsType(), CatalogProtos.PartitionsType.COLUMN);
+ assertEquals(retrieved.getPartitions().getColumn(0).getColumnName(), "id");
+
+ catalog.deleteTable(tableName);
+ assertFalse(catalog.existsTable(tableName));
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
index 260b4c7..d3671b3 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestDBStore.java
@@ -22,6 +22,9 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
+import org.apache.tajo.catalog.partition.Partitions;
+import org.apache.tajo.catalog.partition.Specifier;
+import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
import org.apache.tajo.catalog.statistics.TableStats;
import org.apache.tajo.catalog.store.AbstractDBStore;
@@ -219,4 +222,175 @@ public class TestDBStore {
s2.getColumn(i).getColumnName());
}
}
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByHash1() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.HASH);
+ partitions.setNumPartitions(2);
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(store.existTable(tableName));
+ store.addTable(desc);
+ assertTrue(store.existTable(tableName));
+
+ TableDesc retrieved = store.getTable(tableName);
+
+ // Schema order check
+ assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+ store.deleteTable(tableName);
+ assertFalse(store.existTable(tableName));
+ }
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByHash2() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.HASH);
+ partitions.setNumPartitions(2);
+
+ partitions.addSpecifier(new Specifier("sub_part1"));
+ partitions.addSpecifier(new Specifier("sub_part2"));
+ partitions.addSpecifier(new Specifier("sub_part3"));
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(store.existTable(tableName));
+ store.addTable(desc);
+ assertTrue(store.existTable(tableName));
+
+ TableDesc retrieved = store.getTable(tableName);
+
+ // Schema order check
+ assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+ store.deleteTable(tableName);
+ assertFalse(store.existTable(tableName));
+ }
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByList() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.LIST);
+
+ partitions.addSpecifier(new Specifier("sub_part1", "Seoul,서울"));
+ partitions.addSpecifier(new Specifier("sub_part2", "Busan,부산"));
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(store.existTable(tableName));
+ store.addTable(desc);
+ assertTrue(store.existTable(tableName));
+
+ TableDesc retrieved = store.getTable(tableName);
+
+ // Schema order check
+ assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+ store.deleteTable(tableName);
+ assertFalse(store.existTable(tableName));
+ }
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByRange() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.RANGE);
+
+ partitions.addSpecifier(new Specifier("sub_part1", "2"));
+ partitions.addSpecifier(new Specifier("sub_part2", "5"));
+ partitions.addSpecifier(new Specifier("sub_part3"));
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(store.existTable(tableName));
+ store.addTable(desc);
+ assertTrue(store.existTable(tableName));
+
+ TableDesc retrieved = store.getTable(tableName);
+
+ // Schema order check
+ assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+ store.deleteTable(tableName);
+ assertFalse(store.existTable(tableName));
+ }
+
+ @Test
+ public final void testAddAndDeleteTablePartitionByColumn() throws Exception {
+ Schema schema = new Schema();
+ schema.addColumn("id", Type.INT4)
+ .addColumn("name", Type.TEXT)
+ .addColumn("age", Type.INT4)
+ .addColumn("score", Type.FLOAT8);
+
+ String tableName = "addedtable";
+ Options opts = new Options();
+ opts.put("file.delimiter", ",");
+ TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV, opts);
+
+ Partitions partitions = new Partitions();
+ partitions.addColumn(new Column("id", Type.INT4));
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.COLUMN);
+
+ TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable"));
+ desc.setPartitions(partitions);
+ assertFalse(store.existTable(tableName));
+ store.addTable(desc);
+ assertTrue(store.existTable(tableName));
+
+ TableDesc retrieved = store.getTable(tableName);
+
+ // Schema order check
+ assertSchemaOrder(desc.getSchema(), retrieved.getSchema());
+ store.deleteTable(tableName);
+ assertFalse(store.existTable(tableName));
+ }
+
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
index c94260f..58eabfd 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/cli/TajoCli.java
@@ -27,8 +27,10 @@ import org.apache.tajo.QueryId;
import org.apache.tajo.QueryIdFactory;
import org.apache.tajo.TajoConstants;
import org.apache.tajo.TajoProtos.QueryState;
+import org.apache.tajo.algebra.CreateTable;
import org.apache.tajo.catalog.Column;
import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.partition.Specifier;
import org.apache.tajo.catalog.statistics.TableStats;
import org.apache.tajo.client.QueryStatus;
import org.apache.tajo.client.TajoClient;
@@ -463,6 +465,40 @@ public class TajoCli {
}
sb.append("\n");
}
+
+ sb.append("\n");
+ sb.append("Partitions: \n");
+ if (desc.getPartitions() != null) {
+ sb.append("type:").append(desc.getPartitions().getPartitionsType().name()).append("\n");
+ if (desc.getPartitions().getNumPartitions() > 0)
+ sb.append("numbers:").append(desc.getPartitions().getNumPartitions()).append("\n");
+
+ sb.append("columns:").append("\n");
+ for(Column eachColumn: desc.getPartitions().getColumns()) {
+ sb.append(" ");
+ sb.append(eachColumn.getColumnName()).append("\t").append(eachColumn.getDataType().getType());
+ if (eachColumn.getDataType().hasLength()) {
+ sb.append("(").append(eachColumn.getDataType().getLength()).append(")");
+ }
+ sb.append("\n");
+ }
+
+ if (desc.getPartitions().getSpecifiers() != null) {
+ sb.append("specifier:").append("\n");
+ for(Specifier specifier :desc.getPartitions().getSpecifiers()) {
+ sb.append(" ");
+ sb.append("name:").append(specifier.getName());
+ if (!specifier.getExpressions().equals("")) {
+ sb.append(", expressions:").append(specifier.getExpressions());
+ } else {
+ if (desc.getPartitions().getPartitionsType().name().equals(CreateTable.PartitionType.RANGE))
+ sb.append(" expressions: MAXVALUE");
+ }
+ sb.append("\n");
+ }
+ }
+ }
+
return sb.toString();
}
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
index 4a305ae..5bba89b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlan.java
@@ -222,6 +222,18 @@ public class LogicalPlan {
return ensureUniqueColumn(candidates);
}
+ // Trying to find columns from schema in current block.
+ if (block.getSchema() != null) {
+ Column found = block.getSchema().getColumnByName(columnRef.getName());
+ if (found != null) {
+ candidates.add(found);
+ }
+ }
+
+ if (!candidates.isEmpty()) {
+ return ensureUniqueColumn(candidates);
+ }
+
throw new VerifyException("ERROR: no such a column name "+ columnRef.getCanonicalName());
}
}
@@ -724,7 +736,6 @@ public class LogicalPlan {
// add target to list if a target can be evaluated at this node
List<Integer> newEvaluatedTargetIds = new ArrayList<Integer>();
for (int i = 0; i < getTargetListNum(); i++) {
-
if (getTarget(i) != null && !isTargetResolved(i)) {
EvalNode expr = getTarget(i).getEvalTree();
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
index 79f02d1..b5f8d2f 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
@@ -30,6 +30,8 @@ import org.apache.hadoop.fs.Path;
import org.apache.tajo.algebra.*;
import org.apache.tajo.algebra.CreateTable.ColumnDefinition;
import org.apache.tajo.catalog.*;
+import org.apache.tajo.catalog.partition.Partitions;
+import org.apache.tajo.catalog.partition.Specifier;
import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.common.TajoDataTypes.DataType;
@@ -46,6 +48,7 @@ import org.apache.tajo.engine.planner.LogicalPlan.QueryBlock;
import org.apache.tajo.engine.planner.logical.*;
import org.apache.tajo.engine.utils.SchemaUtil;
import org.apache.tajo.exception.InternalException;
+import org.apache.tajo.util.TUtil;
import java.util.List;
import java.util.Stack;
@@ -732,7 +735,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
public LogicalNode visitCreateTable(PlanContext context, Stack<OpType> stack, CreateTable expr)
throws PlanningException {
- String tableName = expr.getTableName();
+ String tableName = expr.getTableName();
if (expr.hasSubQuery()) {
stack.add(OpType.CreateTable);
@@ -789,10 +792,125 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
createTableNode.setPath(new Path(expr.getLocation()));
}
+ if (expr.hasPartition()) {
+ createTableNode.setPartitions(convertTableElementsPartition(context, expr));
+ }
return createTableNode;
}
}
+ /**
+ * convert table elements into Partition.
+ *
+ * @param context
+ * @param expr
+ * @return
+ * @throws PlanningException
+ */
+ private Partitions convertTableElementsPartition(PlanContext context,
+ CreateTable expr) throws PlanningException {
+ Schema schema = convertTableElementsSchema(expr.getTableElements());
+ Partitions partitions = null;
+ List<Specifier> specifiers = null;
+ if (expr.hasPartition()) {
+ partitions = new Partitions();
+ specifiers = TUtil.newList();
+
+ partitions.setPartitionsType(CatalogProtos.PartitionsType.valueOf(expr.getPartition()
+ .getPartitionType().name()));
+
+ if (expr.getPartition().getPartitionType().equals(CreateTable.PartitionType.HASH)) {
+ CreateTable.HashPartition hashPartition = expr.getPartition();
+
+ partitions.setColumns(convertTableElementsColumns(expr.getTableElements()
+ , hashPartition.getColumns()));
+
+ if (hashPartition.getColumns() != null) {
+ if (hashPartition.getQuantifier() != null) {
+ String quantity = ((LiteralValue)hashPartition.getQuantifier()).getValue();
+ partitions.setNumPartitions(Integer.parseInt(quantity));
+ }
+
+ if (hashPartition.getSpecifiers() != null) {
+ for(CreateTable.PartitionSpecifier eachSpec: hashPartition.getSpecifiers()) {
+ specifiers.add(new Specifier(eachSpec.getName()));
+ }
+ }
+
+ if (specifiers.isEmpty() && partitions.getNumPartitions() > 0) {
+ for (int i = 0; i < partitions.getNumPartitions(); i++) {
+ String partitionName = partitions.getPartitionsType().name() + "_" + expr
+ .getTableName() + "_" + i;
+ specifiers.add(new Specifier(partitionName));
+ }
+ }
+
+ if (!specifiers.isEmpty())
+ partitions.setSpecifiers(specifiers);
+ }
+ } else if (expr.getPartition().getPartitionType().equals(CreateTable.PartitionType.LIST)) {
+ CreateTable.ListPartition listPartition = expr.getPartition();
+
+ partitions.setColumns(convertTableElementsColumns(expr.getTableElements()
+ , listPartition.getColumns()));
+
+ if (listPartition.getSpecifiers() != null) {
+ StringBuffer sb = new StringBuffer();
+
+ for(CreateTable.ListPartitionSpecifier eachSpec: listPartition.getSpecifiers()) {
+ Specifier specifier = new Specifier(eachSpec.getName());
+ sb.delete(0, sb.length());
+ for(Expr eachExpr : eachSpec.getValueList().getValues()) {
+ context.block.setSchema(schema);
+ EvalNode eval = createEvalTree(context.plan, context.block, eachExpr);
+ if(sb.length() > 1)
+ sb.append(",");
+
+ sb.append(eval.toString());
+ }
+ specifier.setExpressions(sb.toString());
+ specifiers.add(specifier);
+ }
+ if (!specifiers.isEmpty())
+ partitions.setSpecifiers(specifiers);
+ }
+ } else if (expr.getPartition().getPartitionType().equals(CreateTable.PartitionType.RANGE)) {
+ CreateTable.RangePartition rangePartition = expr.getPartition();
+
+ partitions.setColumns(convertTableElementsColumns(expr.getTableElements()
+ , rangePartition.getColumns()));
+
+ if (rangePartition.getSpecifiers() != null) {
+ for(CreateTable.RangePartitionSpecifier eachSpec: rangePartition.getSpecifiers()) {
+ Specifier specifier = new Specifier();
+
+ if (eachSpec.getName() != null)
+ specifier.setName(eachSpec.getName());
+
+ if (eachSpec.getEnd() != null) {
+ context.block.setSchema(schema);
+ EvalNode eval = createEvalTree(context.plan, context.block, eachSpec.getEnd());
+ specifier.setExpressions(eval.toString());
+ }
+
+ if(eachSpec.isEndMaxValue()) {
+ specifier.setExpressions(null);
+ }
+ specifiers.add(specifier);
+ }
+ if (!specifiers.isEmpty())
+ partitions.setSpecifiers(specifiers);
+ }
+ } else if (expr.getPartition().getPartitionType().equals(CreateTable.PartitionType.COLUMN)) {
+ CreateTable.ColumnPartition columnPartition = expr.getPartition();
+
+ partitions.setColumns(convertTableElementsColumns(expr.getTableElements()
+ , columnPartition.getColumns()));
+ }
+ }
+
+ return partitions;
+ }
/**
@@ -811,6 +929,21 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
return schema;
}
+ private List<Column> convertTableElementsColumns(CreateTable.ColumnDefinition [] elements,
+ ColumnReferenceExpr[] references) {
+ List<Column> columnList = TUtil.newList();
+
+ for(CreateTable.ColumnDefinition columnDefinition: elements) {
+ for(ColumnReferenceExpr eachReference: references) {
+ if (columnDefinition.getColumnName().equalsIgnoreCase(eachReference.getName())) {
+ columnList.add(convertColumn(columnDefinition));
+ }
+ }
+ }
+
+ return columnList;
+ }
+
private DataType convertDataType(org.apache.tajo.algebra.DataType dataType) {
TajoDataTypes.Type type = TajoDataTypes.Type.valueOf(dataType.getTypeName());
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
index 50656c5..942309d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/CreateTableNode.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.fs.Path;
import org.apache.tajo.catalog.Column;
import org.apache.tajo.catalog.Options;
import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.partition.Partitions;
import org.apache.tajo.catalog.proto.CatalogProtos.StoreType;
import org.apache.tajo.engine.planner.PlanString;
import org.apache.tajo.util.TUtil;
@@ -35,6 +36,7 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
@Expose private Path path;
@Expose private Options options;
@Expose private boolean external;
+ @Expose private Partitions partitions;
public CreateTableNode(int pid, String tableName, Schema schema) {
super(pid, NodeType.CREATE_TABLE);
@@ -90,6 +92,17 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
this.external = external;
}
+ public Partitions getPartitions() {
+ return partitions;
+ }
+
+ public void setPartitions(Partitions partitions) {
+ this.partitions = partitions;
+ }
+
+ public boolean hasPartition() {
+ return this.partitions != null;
+ }
@Override
public PlanString getPlanString() {
@@ -107,7 +120,8 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
&& this.external == other.external
&& TUtil.checkEquals(path, other.path)
&& TUtil.checkEquals(options, other.options)
- && TUtil.checkEquals(partitionKeys, other.partitionKeys);
+ && TUtil.checkEquals(partitionKeys, other.partitionKeys)
+ && TUtil.checkEquals(partitions, other.partitions);
} else {
return false;
}
@@ -123,6 +137,7 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
store.path = path != null ? new Path(path.toString()) : null;
store.partitionKeys = partitionKeys != null ? partitionKeys.clone() : null;
store.options = (Options) (options != null ? options.clone() : null);
+ store.partitions = (Partitions) (partitions != null ? partitions.clone() : null);
return store;
}
@@ -142,6 +157,7 @@ public class CreateTableNode extends LogicalNode implements Cloneable {
sb.append(",\"storeType\": \"" + this.storageType);
sb.append(",\"path\" : \"" + this.path).append("\",");
sb.append(",\"external\" : \"" + this.external).append("\",");
+ sb.append(",\"partitions\" : \"" + this.partitions).append("\",");
sb.append("\n \"out schema\": ").append(getOutSchema()).append(",")
.append("\n \"in schema\": ").append(getInSchema())
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
index 94447c0..b2bd937 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/logical/StoreTableNode.java
@@ -22,6 +22,7 @@ import com.google.common.base.Preconditions;
import com.google.gson.annotations.Expose;
import org.apache.tajo.catalog.Column;
import org.apache.tajo.catalog.Options;
+import org.apache.tajo.catalog.partition.Partitions;
import org.apache.tajo.engine.planner.PlanString;
import org.apache.tajo.util.TUtil;
@@ -38,12 +39,19 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
@Expose private Options options;
@Expose private boolean isCreatedTable = false;
@Expose private boolean isOverwritten = false;
+ @Expose private Partitions partitions;
public StoreTableNode(int pid, String tableName) {
super(pid, NodeType.STORE);
this.tableName = tableName;
}
+ public StoreTableNode(int pid, String tableName, Partitions partitions) {
+ super(pid, NodeType.STORE);
+ this.tableName = tableName;
+ this.partitions = partitions;
+ }
+
public final String getTableName() {
return this.tableName;
}
@@ -101,6 +109,13 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
return this.options;
}
+ public Partitions getPartitions() {
+ return partitions;
+ }
+
+ public void setPartitions(Partitions partitions) {
+ this.partitions = partitions;
+ }
@Override
public PlanString getPlanString() {
@@ -131,6 +146,7 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
eq = eq && TUtil.checkEquals(options, other.options);
eq = eq && isCreatedTable == other.isCreatedTable;
eq = eq && isOverwritten == other.isOverwritten;
+ eq = eq && TUtil.checkEquals(partitions, other.partitions);
return eq;
} else {
return false;
@@ -147,6 +163,7 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
store.options = options != null ? (Options) options.clone() : null;
store.isCreatedTable = isCreatedTable;
store.isOverwritten = isOverwritten;
+ store.partitions = partitions;
return store;
}
@@ -169,8 +186,13 @@ public class StoreTableNode extends UnaryNode implements Cloneable {
}
sb.append("\n \"out schema\": ").append(getOutSchema()).append(",")
- .append("\n \"in schema\": ").append(getInSchema())
- .append("}");
+ .append("\n \"in schema\": ").append(getInSchema());
+
+ if(partitions != null) {
+ sb.append(partitions.toString());
+ }
+
+ sb.append("}");
return sb.toString() + "\n"
+ getChild().toString();
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
index 505fd71..4f18b11 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@ -32,6 +32,7 @@ import org.apache.tajo.algebra.Expr;
import org.apache.tajo.catalog.*;
import org.apache.tajo.catalog.exception.AlreadyExistsTableException;
import org.apache.tajo.catalog.exception.NoSuchTableException;
+import org.apache.tajo.catalog.partition.Partitions;
import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.catalog.statistics.TableStats;
import org.apache.tajo.conf.TajoConf;
@@ -131,7 +132,7 @@ public class GlobalEngine extends AbstractService {
}
Expr planningContext = hiveQueryMode ? converter.parse(sql) : analyzer.parse(sql);
-
+
LogicalPlan plan = createLogicalPlan(planningContext);
LogicalRootNode rootNode = plan.getRootBlock().getRoot();
@@ -253,10 +254,11 @@ public class GlobalEngine extends AbstractService {
}
return createTableOnDirectory(createTable.getTableName(), createTable.getSchema(), meta,
- createTable.getPath(), true);
+ createTable.getPath(), true, createTable.getPartitions());
}
- public TableDesc createTableOnDirectory(String tableName, Schema schema, TableMeta meta, Path path, boolean isCreated)
+ public TableDesc createTableOnDirectory(String tableName, Schema schema, TableMeta meta,
+ Path path, boolean isCreated, Partitions partitions)
throws IOException {
if (catalog.existsTable(tableName)) {
throw new AlreadyExistsTableException(tableName);
@@ -284,6 +286,7 @@ public class GlobalEngine extends AbstractService {
stats.setNumBytes(totalSize);
TableDesc desc = CatalogUtil.newTableDesc(tableName, schema, meta, path);
desc.setStats(stats);
+ desc.setPartitions(partitions);
catalog.addTable(desc);
LOG.info("Table " + desc.getName() + " is created (" + desc.getStats().getNumBytes() + ")");
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
index d1faf4f..03cb4d0 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@ -32,6 +32,7 @@ import org.apache.tajo.TajoIdProtos;
import org.apache.tajo.TajoProtos;
import org.apache.tajo.catalog.*;
import org.apache.tajo.catalog.exception.NoSuchTableException;
+import org.apache.tajo.catalog.partition.Partitions;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.conf.TajoConf.ConfVars;
import org.apache.tajo.ipc.ClientProtos;
@@ -307,11 +308,12 @@ public class TajoMasterClientService extends AbstractService {
Schema schema = new Schema(request.getSchema());
TableMeta meta = new TableMeta(request.getMeta());
+ Partitions partitions = new Partitions(request.getPartitions());
TableDesc desc;
try {
- desc = context.getGlobalEngine().createTableOnDirectory(request.getName(), schema, meta, path,
- false);
+ desc = context.getGlobalEngine().createTableOnDirectory(request.getName(), schema,
+ meta, path, false, partitions);
} catch (Exception e) {
return TableResponse.newBuilder()
.setResultCode(ResultCode.ERROR)
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto b/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto
index 89c40c8..dc9c905 100644
--- a/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto
+++ b/tajo-core/tajo-core-backend/src/main/proto/ClientProtos.proto
@@ -124,6 +124,7 @@ message CreateTableRequest {
required SchemaProto schema = 2;
required TableProto meta = 3;
required string path = 4;
+ optional PartitionsProto partitions = 5;
}
message AttachTableRequest {
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/0b0de13b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java
index bd62f40..8b06ebf 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestTajoClient.java
@@ -191,4 +191,126 @@ public class TestTajoClient {
assertEquals(tableName1, desc.getName());
assertTrue(desc.getStats().getNumBytes() > 0);
}
+
+ @Test
+ public final void testCreateAndDropTablePartitionedHash1ByExecuteQuery() throws IOException,
+ ServiceException, SQLException {
+ TajoConf conf = cluster.getConfiguration();
+ final String tableName = "testCreateAndDropTablePartitionedHash1";
+
+ assertFalse(client.existTable(tableName));
+
+ String sql = "create table " + tableName + " (deptname text, score int4)";
+ sql += " PARTITION BY HASH (deptname)";
+ sql += " (PARTITION sub_part1, PARTITION sub_part2, PARTITION sub_part3)";
+
+ client.updateQuery(sql);
+ assertTrue(client.existTable(tableName));
+
+ Path tablePath = client.getTableDesc(tableName).getPath();
+ FileSystem hdfs = tablePath.getFileSystem(conf);
+ assertTrue(hdfs.exists(tablePath));
+
+ client.updateQuery("drop table " + tableName);
+ assertFalse(client.existTable(tableName));
+ assertFalse(hdfs.exists(tablePath));
+ }
+
+ @Test
+ public final void testCreateAndDropTablePartitionedHash2ByExecuteQuery() throws IOException,
+ ServiceException, SQLException {
+ TajoConf conf = cluster.getConfiguration();
+ final String tableName = "testCreateAndDropTablePartitionedHash2";
+
+ assertFalse(client.existTable(tableName));
+
+ String sql = "create table " + tableName + " (deptname text, score int4)";
+ sql += "PARTITION BY HASH (deptname)";
+ sql += "PARTITIONS 2";
+
+ client.updateQuery(sql);
+ assertTrue(client.existTable(tableName));
+
+ Path tablePath = client.getTableDesc(tableName).getPath();
+ FileSystem hdfs = tablePath.getFileSystem(conf);
+ assertTrue(hdfs.exists(tablePath));
+
+ client.updateQuery("drop table " + tableName);
+ assertFalse(client.existTable(tableName));
+ assertFalse(hdfs.exists(tablePath));
+ }
+
+ @Test
+ public final void testCreateAndDropTablePartitionedListByExecuteQuery() throws IOException,
+ ServiceException, SQLException {
+ TajoConf conf = cluster.getConfiguration();
+ final String tableName = "testCreateAndDropTablePartitionedList";
+
+ assertFalse(client.existTable(tableName));
+
+ String sql = "create table " + tableName + " (deptname text, score int4)";
+ sql += "PARTITION BY LIST (deptname)";
+ sql += "( PARTITION sub_part1 VALUES('r&d', 'design'),";
+ sql += "PARTITION sub_part2 VALUES('sales', 'hr') )";
+
+ client.updateQuery(sql);
+ assertTrue(client.existTable(tableName));
+
+ Path tablePath = client.getTableDesc(tableName).getPath();
+ FileSystem hdfs = tablePath.getFileSystem(conf);
+ assertTrue(hdfs.exists(tablePath));
+
+ client.updateQuery("drop table " + tableName);
+ assertFalse(client.existTable(tableName));
+ assertFalse(hdfs.exists(tablePath));
+ }
+
+ @Test
+ public final void testCreateAndDropTablePartitionedRangeByExecuteQuery() throws IOException,
+ ServiceException, SQLException {
+ TajoConf conf = cluster.getConfiguration();
+ final String tableName = "testCreateAndDropTablePartitionedRange";
+
+ assertFalse(client.existTable(tableName));
+
+ String sql = "create table " + tableName + " (deptname text, score int4)";
+ sql += "PARTITION BY RANGE (score)";
+ sql += "( PARTITION sub_part1 VALUES LESS THAN (2),";
+ sql += "PARTITION sub_part2 VALUES LESS THAN (5),";
+ sql += "PARTITION sub_part2 VALUES LESS THAN (MAXVALUE) )";
+
+ client.updateQuery(sql);
+ assertTrue(client.existTable(tableName));
+
+ Path tablePath = client.getTableDesc(tableName).getPath();
+ FileSystem hdfs = tablePath.getFileSystem(conf);
+ assertTrue(hdfs.exists(tablePath));
+
+ client.updateQuery("drop table " + tableName);
+ assertFalse(client.existTable(tableName));
+ assertFalse(hdfs.exists(tablePath));
+ }
+ @Test
+ public final void testCreateAndDropTablePartitionedColumnByExecuteQuery() throws IOException,
+ ServiceException, SQLException {
+ TajoConf conf = cluster.getConfiguration();
+ final String tableName = "testCreateAndDropTablePartitionedColumn";
+
+ assertFalse(client.existTable(tableName));
+
+ String sql = "create table " + tableName + " (deptname text, score int4)";
+ sql += "PARTITION BY COLUMN (deptname)";
+
+ client.updateQuery(sql);
+ assertTrue(client.existTable(tableName));
+
+ Path tablePath = client.getTableDesc(tableName).getPath();
+ FileSystem hdfs = tablePath.getFileSystem(conf);
+ assertTrue(hdfs.exists(tablePath));
+
+ client.updateQuery("drop table " + tableName);
+ assertFalse(client.existTable(tableName));
+ assertFalse(hdfs.exists(tablePath));
+ }
+
}