| /** |
| * 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.catalog; |
| |
| import org.apache.hadoop.fs.Path; |
| import org.apache.tajo.catalog.exception.NoSuchFunctionException; |
| import org.apache.tajo.catalog.function.Function; |
| import org.apache.tajo.catalog.partition.PartitionMethodDesc; |
| 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; |
| import org.apache.tajo.common.TajoDataTypes; |
| import org.apache.tajo.common.TajoDataTypes.Type; |
| import org.apache.tajo.conf.TajoConf; |
| import org.apache.tajo.util.CommonTestingUtil; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| import java.io.IOException; |
| |
| import static org.junit.Assert.*; |
| |
| public class TestCatalog { |
| static final String FieldName1="f1"; |
| static final String FieldName2="f2"; |
| static final String FieldName3="f3"; |
| |
| Schema schema1; |
| |
| static CatalogServer server; |
| static CatalogService catalog; |
| |
| @BeforeClass |
| public static void setUp() throws Exception { |
| TajoConf conf = new TajoConf(); |
| |
| conf.set(CatalogConstants.CATALOG_URI, "jdbc:derby:target/test-data/TestCatalog/db;create=true"); |
| conf.setVar(TajoConf.ConfVars.CATALOG_ADDRESS, "127.0.0.1:0"); |
| |
| server = new CatalogServer(); |
| server.init(conf); |
| server.start(); |
| catalog = new LocalCatalogWrapper(server); |
| |
| for(String table : catalog.getAllTableNames()){ |
| catalog.deleteTable(table); |
| } |
| } |
| |
| @AfterClass |
| public static void tearDown() throws IOException { |
| server.stop(); |
| } |
| |
| @Test |
| public void testGetTable() throws Exception { |
| schema1 = new Schema(); |
| schema1.addColumn(FieldName1, Type.BLOB); |
| schema1.addColumn(FieldName2, Type.INT4); |
| schema1.addColumn(FieldName3, Type.INT8); |
| Path path = new Path(CommonTestingUtil.getTestDir(), "table1"); |
| 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")); |
| } |
| |
| @Test |
| public void testAddTableNoName() throws Exception { |
| schema1 = new Schema(); |
| schema1.addColumn(FieldName1, Type.BLOB); |
| schema1.addColumn(FieldName2, Type.INT4); |
| schema1.addColumn(FieldName3, Type.INT8); |
| |
| TableMeta info = CatalogUtil.newTableMeta(StoreType.CSV); |
| TableDesc desc = new TableDesc(); |
| desc.setMeta(info); |
| |
| assertFalse(catalog.addTable(desc)); |
| } |
| |
| static IndexDesc desc1; |
| static IndexDesc desc2; |
| static IndexDesc desc3; |
| |
| static { |
| desc1 = new IndexDesc( |
| "idx_test", "indexed", new Column("id", Type.INT4), |
| IndexMethod.TWO_LEVEL_BIN_TREE, true, true, true); |
| |
| desc2 = new IndexDesc( |
| "idx_test2", "indexed", new Column("score", Type.FLOAT8), |
| IndexMethod.TWO_LEVEL_BIN_TREE, false, false, false); |
| |
| desc3 = new IndexDesc( |
| "idx_test", "indexed", new Column("id", Type.INT4), |
| IndexMethod.TWO_LEVEL_BIN_TREE, true, true, true); |
| } |
| |
| @Test |
| public void testAddAndDelIndex() throws Exception { |
| TableDesc desc = TestDBStore.prepareTable(); |
| assertTrue(catalog.addTable(desc)); |
| |
| assertFalse(catalog.existIndex(desc1.getName())); |
| assertFalse(catalog.existIndex("indexed", "id")); |
| catalog.addIndex(desc1); |
| assertTrue(catalog.existIndex(desc1.getName())); |
| assertTrue(catalog.existIndex("indexed", "id")); |
| |
| assertFalse(catalog.existIndex(desc2.getName())); |
| assertFalse(catalog.existIndex("indexed", "score")); |
| catalog.addIndex(desc2); |
| assertTrue(catalog.existIndex(desc2.getName())); |
| assertTrue(catalog.existIndex("indexed", "score")); |
| |
| catalog.deleteIndex(desc1.getName()); |
| assertFalse(catalog.existIndex(desc1.getName())); |
| catalog.deleteIndex(desc2.getName()); |
| assertFalse(catalog.existIndex(desc2.getName())); |
| |
| catalog.deleteTable(desc.getName()); |
| assertFalse(catalog.existsTable(desc.getName())); |
| } |
| |
| public static class TestFunc1 extends Function { |
| public TestFunc1() { |
| super( |
| new Column [] { |
| new Column("name", TajoDataTypes.Type.INT4) |
| } |
| ); |
| } |
| |
| public CatalogProtos.FunctionType getFunctionType() { |
| return FunctionType.GENERAL; |
| } |
| } |
| |
| public static class TestFunc2 extends Function { |
| public TestFunc2() { |
| super( |
| new Column [] { |
| new Column("name", TajoDataTypes.Type.INT4), |
| new Column("bytes", TajoDataTypes.Type.BLOB) |
| } |
| ); |
| } |
| public CatalogProtos.FunctionType getFunctionType() { |
| return FunctionType.GENERAL; |
| } |
| } |
| |
| @Test |
| public final void testRegisterAndFindFunc() throws Exception { |
| assertFalse(catalog.containFunction("test10", FunctionType.GENERAL)); |
| FunctionDesc meta = new FunctionDesc("test10", TestFunc2.class, FunctionType.GENERAL, |
| CatalogUtil.newSimpleDataType(Type.INT4), |
| CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.BLOB)); |
| |
| catalog.createFunction(meta); |
| assertTrue(catalog.containFunction("test10", CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.BLOB))); |
| FunctionDesc retrived = catalog.getFunction("test10", CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.BLOB)); |
| |
| assertEquals(retrived.getSignature(), "test10"); |
| assertEquals(retrived.getFuncClass(), TestFunc2.class); |
| assertEquals(retrived.getFuncType(), FunctionType.GENERAL); |
| |
| assertFalse(catalog.containFunction("test10", CatalogUtil.newSimpleDataTypeArray(Type.BLOB, Type.INT4))); |
| } |
| |
| |
| @Test |
| public final void testRegisterFunc() throws Exception { |
| assertFalse(catalog.containFunction("test2", FunctionType.UDF)); |
| FunctionDesc meta = new FunctionDesc("test2", TestFunc1.class, FunctionType.UDF, |
| CatalogUtil.newSimpleDataType(Type.INT4), |
| CatalogUtil.newSimpleDataTypeArray(Type.INT4)); |
| |
| catalog.createFunction(meta); |
| assertTrue(catalog.containFunction("test2", CatalogUtil.newSimpleDataTypeArray(Type.INT4))); |
| FunctionDesc retrived = catalog.getFunction("test2", CatalogUtil.newSimpleDataTypeArray(Type.INT4)); |
| |
| assertEquals(retrived.getSignature(),"test2"); |
| assertEquals(retrived.getFuncClass(),TestFunc1.class); |
| assertEquals(retrived.getFuncType(),FunctionType.UDF); |
| } |
| |
| @Test |
| public final void testSuchFunctionException() throws Exception { |
| try { |
| assertFalse(catalog.containFunction("test123", CatalogUtil.newSimpleDataTypeArray(Type.INT4))); |
| catalog.getFunction("test123", CatalogUtil.newSimpleDataTypeArray(Type.INT4)); |
| fail(); |
| } catch (NoSuchFunctionException nsfe) { |
| // succeed test |
| } catch (Throwable e) { |
| fail(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public final void testDropFunction() throws Exception { |
| assertFalse(catalog.containFunction("test3", CatalogUtil.newSimpleDataTypeArray(Type.INT4))); |
| FunctionDesc meta = new FunctionDesc("test3", TestFunc1.class, FunctionType.UDF, |
| CatalogUtil.newSimpleDataType(Type.INT4), |
| CatalogUtil.newSimpleDataTypeArray(Type.INT4)); |
| catalog.createFunction(meta); |
| assertTrue(catalog.containFunction("test3", CatalogUtil.newSimpleDataTypeArray(Type.INT4))); |
| catalog.dropFunction("test3"); |
| assertFalse(catalog.containFunction("test3", CatalogUtil.newSimpleDataTypeArray(Type.INT4))); |
| |
| assertFalse(catalog.containFunction("test3", CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.BLOB))); |
| FunctionDesc overload = new FunctionDesc("test3", TestFunc2.class, FunctionType.GENERAL, |
| CatalogUtil.newSimpleDataType(Type.INT4), |
| CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.BLOB)); |
| 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); |
| |
| PartitionMethodDesc partitionDesc = new PartitionMethodDesc(); |
| partitionDesc.setTableId(tableName); |
| partitionDesc.setExpression("id"); |
| Schema partSchema = new Schema(); |
| partSchema.addColumn("id", Type.INT4); |
| partitionDesc.setExpressionSchema(partSchema); |
| partitionDesc.setPartitionType(CatalogProtos.PartitionType.HASH); |
| |
| TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable")); |
| desc.setPartitionMethod(partitionDesc); |
| |
| assertFalse(catalog.existsTable(tableName)); |
| catalog.addTable(desc); |
| assertTrue(catalog.existsTable(tableName)); |
| TableDesc retrieved = catalog.getTableDesc(tableName); |
| |
| assertEquals(retrieved.getName(), tableName); |
| assertEquals(retrieved.getPartitionMethod().getPartitionType(), CatalogProtos.PartitionType.HASH); |
| assertEquals(retrieved.getPartitionMethod().getExpressionSchema().getColumn(0).getSimpleName(), "id"); |
| |
| 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); |
| |
| PartitionMethodDesc partitionDesc = new PartitionMethodDesc(); |
| partitionDesc.setTableId(tableName); |
| partitionDesc.setExpression("id"); |
| Schema partSchema = new Schema(); |
| partSchema.addColumn("id", Type.INT4); |
| partitionDesc.setExpressionSchema(partSchema); |
| partitionDesc.setPartitionType(CatalogProtos.PartitionType.HASH); |
| |
| TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable")); |
| desc.setPartitionMethod(partitionDesc); |
| |
| assertFalse(catalog.existsTable(tableName)); |
| catalog.addTable(desc); |
| assertTrue(catalog.existsTable(tableName)); |
| |
| TableDesc retrieved = catalog.getTableDesc(tableName); |
| |
| assertEquals(retrieved.getName(), tableName); |
| assertEquals(retrieved.getPartitionMethod().getPartitionType(), CatalogProtos.PartitionType.HASH); |
| assertEquals(retrieved.getPartitionMethod().getExpressionSchema().getColumn(0).getSimpleName(), "id"); |
| |
| 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); |
| |
| PartitionMethodDesc partitionDesc = new PartitionMethodDesc(); |
| partitionDesc.setTableId(tableName); |
| partitionDesc.setExpression("id"); |
| Schema partSchema = new Schema(); |
| partSchema.addColumn("id", Type.INT4); |
| partitionDesc.setExpressionSchema(partSchema); |
| partitionDesc.setPartitionType(CatalogProtos.PartitionType.LIST); |
| |
| TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable")); |
| desc.setPartitionMethod(partitionDesc); |
| assertFalse(catalog.existsTable(tableName)); |
| catalog.addTable(desc); |
| assertTrue(catalog.existsTable(tableName)); |
| |
| TableDesc retrieved = catalog.getTableDesc(tableName); |
| |
| assertEquals(retrieved.getName(), tableName); |
| assertEquals(retrieved.getPartitionMethod().getPartitionType(), CatalogProtos.PartitionType.LIST); |
| assertEquals(retrieved.getPartitionMethod().getExpressionSchema().getColumn(0).getSimpleName(), "id"); |
| |
| 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); |
| |
| |
| PartitionMethodDesc partitionDesc = new PartitionMethodDesc(); |
| partitionDesc.setTableId(tableName); |
| partitionDesc.setExpression("id"); |
| Schema partSchema = new Schema(); |
| partSchema.addColumn("id", Type.INT4); |
| partitionDesc.setExpressionSchema(partSchema); |
| partitionDesc.setPartitionType(CatalogProtos.PartitionType.RANGE); |
| |
| TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable")); |
| desc.setPartitionMethod(partitionDesc); |
| assertFalse(catalog.existsTable(tableName)); |
| catalog.addTable(desc); |
| assertTrue(catalog.existsTable(tableName)); |
| |
| TableDesc retrieved = catalog.getTableDesc(tableName); |
| |
| assertEquals(retrieved.getName(), tableName); |
| assertEquals(retrieved.getPartitionMethod().getPartitionType(), CatalogProtos.PartitionType.RANGE); |
| assertEquals(retrieved.getPartitionMethod().getExpressionSchema().getColumn(0).getSimpleName(), "id"); |
| |
| 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); |
| |
| PartitionMethodDesc partitionDesc = new PartitionMethodDesc(); |
| partitionDesc.setTableId(tableName); |
| partitionDesc.setExpression("id"); |
| Schema partSchema = new Schema(); |
| partSchema.addColumn("id", Type.INT4); |
| partitionDesc.setExpressionSchema(partSchema); |
| partitionDesc.setPartitionType(CatalogProtos.PartitionType.COLUMN); |
| |
| TableDesc desc = new TableDesc(tableName, schema, meta, new Path(CommonTestingUtil.getTestDir(), "addedtable")); |
| desc.setPartitionMethod(partitionDesc); |
| assertFalse(catalog.existsTable(tableName)); |
| catalog.addTable(desc); |
| assertTrue(catalog.existsTable(tableName)); |
| |
| TableDesc retrieved = catalog.getTableDesc(tableName); |
| |
| assertEquals(retrieved.getName(), tableName); |
| assertEquals(retrieved.getPartitionMethod().getPartitionType(), CatalogProtos.PartitionType.COLUMN); |
| assertEquals(retrieved.getPartitionMethod().getExpressionSchema().getColumn(0).getSimpleName(), "id"); |
| |
| catalog.deleteTable(tableName); |
| assertFalse(catalog.existsTable(tableName)); |
| } |
| |
| } |