You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2014/03/25 02:36:20 UTC
[05/13] TAJO-353: Add Database support to Tajo. (hyunsik)
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/QueryTestCaseBase.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/QueryTestCaseBase.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/QueryTestCaseBase.java
index ddb9952..a5c5d78 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/QueryTestCaseBase.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/QueryTestCaseBase.java
@@ -19,6 +19,8 @@
package org.apache.tajo;
import com.google.protobuf.ServiceException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.tajo.algebra.CreateTable;
@@ -27,15 +29,16 @@ import org.apache.tajo.algebra.Expr;
import org.apache.tajo.algebra.OpType;
import org.apache.tajo.annotation.Nullable;
import org.apache.tajo.catalog.CatalogService;
+import org.apache.tajo.catalog.CatalogUtil;
+import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.cli.ParsedResult;
+import org.apache.tajo.cli.SimpleParser;
import org.apache.tajo.client.TajoClient;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.engine.parser.SQLAnalyzer;
import org.apache.tajo.storage.StorageUtil;
import org.apache.tajo.util.FileUtil;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
+import org.junit.*;
import org.junit.rules.TestName;
import java.io.File;
@@ -44,8 +47,7 @@ import java.net.URL;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
import static org.junit.Assert.*;
@@ -118,13 +120,13 @@ import static org.junit.Assert.*;
* </ul>
*/
public class QueryTestCaseBase {
-
+ private static final Log LOG = LogFactory.getLog(QueryTestCaseBase.class);
protected static final TpchTestBase testBase;
protected static final TajoTestingCluster testingCluster;
protected static TajoConf conf;
protected static TajoClient client;
- protected static CatalogService catalog;
- protected static SQLAnalyzer sqlParser = new SQLAnalyzer();
+ protected static final CatalogService catalog;
+ protected static final SQLAnalyzer sqlParser = new SQLAnalyzer();
/** the base path of dataset directories */
protected static final Path datasetBasePath;
@@ -147,14 +149,15 @@ public class QueryTestCaseBase {
}
/** It transiently contains created tables for the running test class. */
- private static Set<String> createdTableSet = new HashSet<String>();
+ private static String currentDatabase;
+ private static Set<String> createdTableGlobalSet = new HashSet<String>();
// queries and results directory corresponding to subclass class.
private Path currentQueryPath;
private Path currentResultPath;
private Path currentDatasetPath;
// for getting a method name
- @Rule public TestName name= new TestName();
+ @Rule public TestName name = new TestName();
@BeforeClass
public static void setUpClass() throws IOException {
@@ -164,19 +167,56 @@ public class QueryTestCaseBase {
@AfterClass
public static void tearDownClass() throws ServiceException {
- for (String tableName : createdTableSet) {
- client.dropTable(tableName, false);
+ for (String tableName : createdTableGlobalSet) {
+ client.updateQuery("DROP TABLE IF EXISTS " +tableName + " PURGE");
+ }
+ createdTableGlobalSet.clear();
+
+ // if the current database is "default", shouldn't drop it.
+ if (!currentDatabase.equals(TajoConstants.DEFAULT_DATABASE_NAME)) {
+ for (String tableName : catalog.getAllTableNames(currentDatabase)) {
+ client.updateQuery("DROP TABLE IF EXISTS " +tableName + " PURGE");
+ }
+
+ client.selectDatabase(TajoConstants.DEFAULT_DATABASE_NAME);
+ client.dropDatabase(currentDatabase);
}
- createdTableSet.clear();
client.close();
}
- @Before
- public void setUp() {
+ public QueryTestCaseBase() {
+ this.currentDatabase = getClass().getSimpleName();
+ init();
+ }
+
+ public QueryTestCaseBase(String currentDatabase) {
+ this.currentDatabase = currentDatabase;
+ init();
+ }
+
+ private void init() {
String className = getClass().getSimpleName();
currentQueryPath = new Path(queryBasePath, className);
currentResultPath = new Path(resultBasePath, className);
currentDatasetPath = new Path(datasetBasePath, className);
+
+ try {
+ // if the current database is "default", we don't need create it because it is already prepated at startup time.
+ if (!currentDatabase.equals(TajoConstants.DEFAULT_DATABASE_NAME)) {
+ client.updateQuery("CREATE DATABASE IF NOT EXISTS " + currentDatabase);
+ }
+ client.selectDatabase(currentDatabase);
+ } catch (ServiceException e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected TajoClient getClient() {
+ return client;
+ }
+
+ public String getCurrentDatabase() {
+ return currentDatabase;
}
protected ResultSet executeString(String sql) throws Exception {
@@ -204,7 +244,12 @@ public class QueryTestCaseBase {
Path queryFilePath = getQueryFilePath(queryFileName);
FileSystem fs = currentQueryPath.getFileSystem(testBase.getTestingCluster().getConfiguration());
assertTrue(queryFilePath.toString() + " existence check", fs.exists(queryFilePath));
- ResultSet result = testBase.execute(FileUtil.readTextFile(new File(queryFilePath.toUri())));
+
+ List<ParsedResult> parsedResults = SimpleParser.parseScript(FileUtil.readTextFile(new File(queryFilePath.toUri())));
+ if (parsedResults.size() > 1) {
+ assertNotNull("This script \"" + queryFileName + "\" includes two or more queries");
+ }
+ ResultSet result = client.executeQueryAndGetResult(parsedResults.get(0).getStatement());
assertNotNull("Query succeeded test", result);
return result;
}
@@ -264,10 +309,22 @@ public class QueryTestCaseBase {
}
}
+ public void assertDatabaseExists(String databaseName) throws ServiceException {
+ assertTrue(client.existDatabase(databaseName));
+ }
+
+ public void assertDatabaseNotExists(String databaseName) throws ServiceException {
+ assertTrue(!client.existDatabase(databaseName));
+ }
+
public void assertTableExists(String tableName) throws ServiceException {
assertTrue(client.existTable(tableName));
}
+ public void assertTableNotExists(String tableName) throws ServiceException {
+ assertTrue(!client.existTable(tableName));
+ }
+
/**
* It transforms a ResultSet instance to rows represented as strings.
*
@@ -316,7 +373,7 @@ public class QueryTestCaseBase {
return StorageUtil.concatPath(currentDatasetPath, fileName);
}
- public String executeDDL(String ddlFileName, @Nullable String [] args) throws Exception {
+ public List<String> executeDDL(String ddlFileName, @Nullable String [] args) throws Exception {
return executeDDL(ddlFileName, null, true, args);
}
@@ -337,17 +394,16 @@ public class QueryTestCaseBase {
* @param dataFileName A file name, containing data rows, which columns have to be separated by vertical bar '|'.
* This file name is used for replacing some format string indicating an external table location.
* @param args A list of arguments, each of which is used to replace corresponding variable which has a form of ${i}.
- * @return The table name created
+ * @return The table names created
*/
- public String executeDDL(String ddlFileName, @Nullable String dataFileName, @Nullable String ... args)
+ public List<String> executeDDL(String ddlFileName, @Nullable String dataFileName, @Nullable String ... args)
throws Exception {
return executeDDL(ddlFileName, dataFileName, true, args);
}
- private String executeDDL(String ddlFileName, @Nullable String dataFileName, boolean isLocalTable,
- @Nullable String [] args)
- throws Exception {
+ private List<String> executeDDL(String ddlFileName, @Nullable String dataFileName, boolean isLocalTable,
+ @Nullable String [] args) throws Exception {
Path ddlFilePath = new Path(currentQueryPath, ddlFileName);
FileSystem fs = ddlFilePath.getFileSystem(conf);
@@ -360,33 +416,43 @@ public class QueryTestCaseBase {
}
String compiled = compileTemplate(template, dataFilePath, args);
- // parse a statement
- Expr expr = sqlParser.parse(compiled);
- assertNotNull(ddlFilePath + " cannot be parsed", expr);
-
- String tableName = null;
- if (expr.getType() == OpType.CreateTable) {
- CreateTable createTable = (CreateTable) expr;
- tableName = createTable.getTableName();
- client.updateQuery(compiled);
- assertTrue("table '" + tableName + "' creation check", client.existTable(tableName));
- if (isLocalTable) {
- createdTableSet.add(tableName);
- }
- } else if (expr.getType() == OpType.DropTable) {
- DropTable dropTable = (DropTable) expr;
- tableName = dropTable.getTableName();
- assertTrue("table '" + tableName + "' existence check", client.existTable(tableName));
- client.updateQuery(compiled);
- assertFalse("table '" + tableName + "' dropped check", client.existTable(tableName));
- if (isLocalTable) {
- createdTableSet.remove(tableName);
+ List<ParsedResult> parsedResults = SimpleParser.parseScript(compiled);
+ List<String> createdTableNames = new ArrayList<String>();
+
+ for (ParsedResult parsedResult : parsedResults) {
+ // parse a statement
+ Expr expr = sqlParser.parse(parsedResult.getStatement());
+ assertNotNull(ddlFilePath + " cannot be parsed", expr);
+
+ if (expr.getType() == OpType.CreateTable) {
+ CreateTable createTable = (CreateTable) expr;
+ String tableName = createTable.getTableName();
+ assertTrue("Table creation is failed.", client.updateQuery(parsedResult.getStatement()));
+ TableDesc createdTable = client.getTableDesc(tableName);
+ String createdTableName = createdTable.getName();
+
+ assertTrue("table '" + createdTableName + "' creation check", client.existTable(createdTableName));
+ if (isLocalTable) {
+ createdTableGlobalSet.add(createdTableName);
+ createdTableNames.add(tableName);
+ }
+ } else if (expr.getType() == OpType.DropTable) {
+ DropTable dropTable = (DropTable) expr;
+ String tableName = dropTable.getTableName();
+ assertTrue("table '" + tableName + "' existence check",
+ client.existTable(CatalogUtil.buildFQName(currentDatabase, tableName)));
+ assertTrue("table drop is failed.", client.updateQuery(parsedResult.getStatement()));
+ assertFalse("table '" + tableName + "' dropped check",
+ client.existTable(CatalogUtil.buildFQName(currentDatabase, tableName)));
+ if (isLocalTable) {
+ createdTableGlobalSet.remove(tableName);
+ }
+ } else {
+ assertTrue(ddlFilePath + " is not a Create or Drop Table statement", false);
}
- } else {
- assertTrue(ddlFilePath + " is not a Create or Drop Table statement", false);
}
- return tableName;
+ return createdTableNames;
}
/**
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/TajoTestingCluster.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/TajoTestingCluster.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/TajoTestingCluster.java
index 323a7cf..e24106a 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/TajoTestingCluster.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/TajoTestingCluster.java
@@ -80,6 +80,11 @@ public class TajoTestingCluster {
*/
public static final String DEFAULT_TEST_DIRECTORY = "target/test-data";
+ /**
+ * True If HCatalogStore is used. Otherwise, it is FALSE.
+ */
+ public Boolean isHCatalogStoreUse = false;
+
public TajoTestingCluster() {
this.conf = new TajoConf();
initPropertiesAndConfigs();
@@ -260,6 +265,10 @@ public class TajoTestingCluster {
return this.catalogServer;
}
+ public boolean isHCatalogStoreRunning() {
+ return isHCatalogStoreUse;
+ }
+
////////////////////////////////////////////////////////
// Tajo Cluster Section
////////////////////////////////////////////////////////
@@ -271,9 +280,6 @@ public class TajoTestingCluster {
c.setVar(ConfVars.TAJO_MASTER_UMBILICAL_RPC_ADDRESS, "localhost:0");
c.setVar(ConfVars.RESOURCE_TRACKER_RPC_ADDRESS, "localhost:0");
c.setVar(ConfVars.WORKER_PEER_RPC_ADDRESS, "localhost:0");
- c.setVar(ConfVars.CATALOG_ADDRESS, "localhost:0");
- c.set(CatalogConstants.STORE_CLASS, "org.apache.tajo.catalog.store.MemStore");
- c.set(CatalogConstants.CATALOG_URI, "jdbc:derby:" + testBuildDir.getAbsolutePath() + "/db");
c.setVar(ConfVars.WORKER_TEMPORAL_DIR, "file://" + testBuildDir.getAbsolutePath() + "/tajo-localdir");
LOG.info("derby repository is set to "+conf.get(CatalogConstants.CATALOG_URI));
@@ -282,10 +288,11 @@ public class TajoTestingCluster {
c.setVar(ConfVars.ROOT_DIR,
getMiniDFSCluster().getFileSystem().getUri() + "/tajo");
} else {
- c.setVar(ConfVars.ROOT_DIR,
- clusterTestBuildDir.getAbsolutePath() + "/tajo");
+ c.setVar(ConfVars.ROOT_DIR, clusterTestBuildDir.getAbsolutePath() + "/tajo");
}
+ setupCatalogForTesting(c, clusterTestBuildDir);
+
tajoMaster = new TajoMaster();
tajoMaster.init(c);
tajoMaster.start();
@@ -304,6 +311,51 @@ public class TajoTestingCluster {
startTajoWorkers(numSlaves);
}
LOG.info("Mini Tajo cluster is up");
+ LOG.info("====================================================================================");
+ LOG.info("= MiniTajoCluster starts up =");
+ LOG.info("====================================================================================");
+ LOG.info("= * Master Address: " + tajoMaster.getMasterName());
+ LOG.info("= * CatalogStore: " + tajoMaster.getCatalogServer().getStoreClassName());
+ LOG.info("------------------------------------------------------------------------------------");
+ LOG.info("= * Warehouse Dir: " + TajoConf.getWarehouseDir(c));
+ LOG.info("= * Worker Tmp Dir: " + c.getVar(ConfVars.WORKER_TEMPORAL_DIR));
+ LOG.info("====================================================================================");
+ }
+
+ private void setupCatalogForTesting(TajoConf c, File testBuildDir) throws IOException {
+ final String HCATALOG_CLASS_NAME = "org.apache.tajo.catalog.store.HCatalogStore";
+ boolean hcatalogClassExists = false;
+ try {
+ getClass().getClassLoader().loadClass(HCATALOG_CLASS_NAME);
+ hcatalogClassExists = true;
+ } catch (ClassNotFoundException e) {
+ LOG.info("HCatalogStore is not available.");
+ }
+ String driverClass = System.getProperty(CatalogConstants.STORE_CLASS);
+
+ if (hcatalogClassExists &&
+ driverClass != null && driverClass.equals(HCATALOG_CLASS_NAME)) {
+ try {
+ getClass().getClassLoader().loadClass(HCATALOG_CLASS_NAME);
+ String jdbcUri = "jdbc:derby:;databaseName="+ testBuildDir.toURI().getPath() + "/metastore_db;create=true";
+ c.set("hive.metastore.warehouse.dir", TajoConf.getWarehouseDir(c).toString() + "/default");
+ c.set("javax.jdo.option.ConnectionURL", jdbcUri);
+ c.set(TajoConf.ConfVars.WAREHOUSE_DIR.varname, conf.getVar(ConfVars.WAREHOUSE_DIR));
+ c.set(CatalogConstants.STORE_CLASS, HCATALOG_CLASS_NAME);
+ Path defaultDatabasePath = new Path(TajoConf.getWarehouseDir(c).toString() + "/default");
+ FileSystem fs = defaultDatabasePath.getFileSystem(c);
+ if (!fs.exists(defaultDatabasePath)) {
+ fs.mkdirs(defaultDatabasePath);
+ }
+ isHCatalogStoreUse = true;
+ } catch (ClassNotFoundException cnfe) {
+ throw new IOException(cnfe);
+ }
+ } else { // for derby
+ c.set(CatalogConstants.STORE_CLASS, "org.apache.tajo.catalog.store.MemStore");
+ c.set(CatalogConstants.CATALOG_URI, "jdbc:derby:" + testBuildDir.getAbsolutePath() + "/db");
+ }
+ c.setVar(ConfVars.CATALOG_ADDRESS, "localhost:0");
}
private void startTajoWorkers(int numSlaves) throws Exception {
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/benchmark/TestTPCH.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/benchmark/TestTPCH.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/benchmark/TestTPCH.java
index f0a0812..4ca9b3e 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/benchmark/TestTPCH.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/benchmark/TestTPCH.java
@@ -20,6 +20,7 @@ package org.apache.tajo.benchmark;
import org.apache.tajo.IntegrationTest;
import org.apache.tajo.QueryTestCaseBase;
+import org.apache.tajo.TajoConstants;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -27,6 +28,11 @@ import java.sql.ResultSet;
@Category(IntegrationTest.class)
public class TestTPCH extends QueryTestCaseBase {
+
+ public TestTPCH() {
+ super(TajoConstants.DEFAULT_DATABASE_NAME);
+ }
+
@Test
public void testQ1OrderBy() throws Exception {
ResultSet res = executeQuery();
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/cli/TestSimpleParser.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/cli/TestSimpleParser.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/cli/TestSimpleParser.java
new file mode 100644
index 0000000..e524652
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/cli/TestSimpleParser.java
@@ -0,0 +1,164 @@
+/**
+ * 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;
+
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class TestSimpleParser {
+
+ @Test
+ public final void testMetaCommands() throws InvalidStatementException {
+ List<ParsedResult> res1 = SimpleParser.parseScript("\\d");
+ assertEquals(1, res1.size());
+ assertEquals(ParsedResult.StatementType.META, res1.get(0).getType());
+ assertEquals("\\d", res1.get(0).getStatement());
+
+ List<ParsedResult> res2 = SimpleParser.parseScript("\\d;\\c;\\f;");
+ assertEquals(3, res2.size());
+ assertEquals(ParsedResult.StatementType.META, res2.get(0).getType());
+ assertEquals("\\d", res2.get(0).getStatement());
+ assertEquals(ParsedResult.StatementType.META, res2.get(1).getType());
+ assertEquals("\\c", res2.get(1).getStatement());
+ assertEquals(ParsedResult.StatementType.META, res2.get(2).getType());
+ assertEquals("\\f", res2.get(2).getStatement());
+
+ List<ParsedResult> res3 = SimpleParser.parseScript("\n\t\t \\d;\n\\c;\t\t\\f ;");
+ assertEquals(3, res3.size());
+ assertEquals(ParsedResult.StatementType.META, res3.get(0).getType());
+ assertEquals("\\d", res3.get(0).getStatement());
+ assertEquals(ParsedResult.StatementType.META, res3.get(1).getType());
+ assertEquals("\\c", res3.get(1).getStatement());
+ assertEquals(ParsedResult.StatementType.META, res3.get(2).getType());
+ assertEquals("\\f", res3.get(2).getStatement());
+
+ List<ParsedResult> res4 = SimpleParser.parseScript("\\\td;");
+ assertEquals(1, res4.size());
+ assertEquals("\\\td", res4.get(0).getStatement());
+ }
+
+ @Test
+ public final void testStatements() throws InvalidStatementException {
+ List<ParsedResult> res1 = SimpleParser.parseScript("select * from test;");
+ assertEquals(1, res1.size());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res1.get(0).getType());
+ assertEquals("select * from test", res1.get(0).getStatement());
+
+ List<ParsedResult> res2 = SimpleParser.parseScript("select * from test;");
+ assertEquals(1, res2.size());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res2.get(0).getType());
+ assertEquals("select * from test", res2.get(0).getStatement());
+
+ List<ParsedResult> res3 = SimpleParser.parseScript("select * from test1;select * from test2;");
+ assertEquals(2, res3.size());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res3.get(0).getType());
+ assertEquals("select * from test1", res3.get(0).getStatement());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res3.get(1).getType());
+ assertEquals("select * from test2", res3.get(1).getStatement());
+
+ List<ParsedResult> res4 = SimpleParser.parseScript("\t\t\n\rselect * from \ntest1;select * from test2\n;");
+ assertEquals(2, res4.size());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res4.get(0).getType());
+ assertEquals("select * from \ntest1", res4.get(0).getStatement());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res4.get(1).getType());
+ assertEquals("select * from test2", res4.get(1).getStatement());
+
+ List<ParsedResult> res5 =
+ SimpleParser.parseScript("\t\t\n\rselect * from \ntest1;\\d test;select * from test2;\n\nselect 1;");
+ assertEquals(4, res5.size());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res5.get(0).getType());
+ assertEquals("select * from \ntest1", res5.get(0).getStatement());
+ assertEquals(ParsedResult.StatementType.META, res5.get(1).getType());
+ assertEquals("\\d test", res5.get(1).getStatement());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res5.get(2).getType());
+ assertEquals("select * from test2", res5.get(2).getStatement());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res5.get(3).getType());
+ assertEquals("select 1", res5.get(3).getStatement());
+ }
+
+ @Test
+ public final void testQuoted() throws InvalidStatementException {
+ List<ParsedResult> res1 = SimpleParser.parseScript("select '\n;' from test;");
+ assertEquals(1, res1.size());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res1.get(0).getType());
+ assertEquals("select '\n;' from test", res1.get(0).getStatement());
+
+ List<ParsedResult> res2 = SimpleParser.parseScript("select 'abc\nbbc\nddf' from test;");
+ assertEquals(1, res2.size());
+ assertEquals(ParsedResult.StatementType.STATEMENT, res2.get(0).getType());
+ assertEquals("select 'abc\nbbc\nddf' from test", res2.get(0).getStatement());
+
+ try {
+ SimpleParser.parseScript("select 'abc");
+ assertTrue(false);
+ } catch (InvalidStatementException is) {
+ assertTrue(true);
+ }
+ }
+
+ @Test
+ public final void testParseLines1() throws InvalidStatementException {
+ String [] lines = {
+ "select abc, ",
+ "bbc from test"
+ };
+ SimpleParser parser = new SimpleParser();
+ List<ParsedResult> result1 = parser.parseLines(lines[0]);
+ assertEquals(0, result1.size());
+ List<ParsedResult> result2 = parser.parseLines(lines[1]);
+ assertEquals(0, result2.size());
+ List<ParsedResult> result3 = parser.EOF();
+ assertEquals(1, result3.size());
+ assertEquals(lines[0] + lines[1], result3.get(0).getStatement());
+ }
+
+ @Test
+ public final void testParseLines2() throws InvalidStatementException {
+ String [] lines = {
+ "select abc, '",
+ "bbc' from test; select * from test3;"
+ };
+ SimpleParser parser = new SimpleParser();
+ List<ParsedResult> result1 = parser.parseLines(lines[0]);
+ assertEquals(0, result1.size());
+ List<ParsedResult> result2 = parser.parseLines(lines[1]);
+ assertEquals(2, result2.size());
+ assertEquals("select abc, 'bbc' from test", result2.get(0).getStatement());
+ assertEquals("select * from test3", result2.get(1).getStatement());
+ }
+
+ @Test
+ public final void testParseLines3() throws InvalidStatementException {
+ String [] lines = {
+ "select abc, 'bbc",
+ "' from test; select * from test3;"
+ };
+ SimpleParser parser = new SimpleParser();
+ List<ParsedResult> result1 = parser.parseLines(lines[0]);
+ assertEquals(0, result1.size());
+ List<ParsedResult> result2 = parser.parseLines(lines[1]);
+ assertEquals(2, result2.size());
+ assertEquals("select abc, 'bbc' from test", result2.get(0).getStatement());
+ assertEquals("select * from test3", result2.get(1).getStatement());
+ }
+}
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestDDLBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestDDLBuilder.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestDDLBuilder.java
index 23b0877..1ae4753 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestDDLBuilder.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/client/TestDDLBuilder.java
@@ -27,34 +27,47 @@ import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.util.FileUtil;
import org.junit.Test;
-import java.io.File;
-
import static org.junit.Assert.assertEquals;
public class TestDDLBuilder {
- @Test
- public void testBuildDDL() throws Exception {
- Schema schema = new Schema();
- schema.addColumn("name", TajoDataTypes.Type.BLOB);
- schema.addColumn("addr", TajoDataTypes.Type.TEXT);
- TableMeta meta = CatalogUtil.newTableMeta(CatalogProtos.StoreType.CSV);
- meta.putOption(CatalogConstants.CSVFILE_DELIMITER, CatalogConstants.CSVFILE_DELIMITER_DEFAULT);
- meta.putOption(CatalogConstants.COMPRESSION_CODEC, GzipCodec.class.getName());
+ private static final Schema schema1;
+ private static final TableMeta meta1;
+ private static final PartitionMethodDesc partitionMethod1;
- TableDesc desc = new TableDesc("table1", schema, meta, new Path("/table1"));
+ static {
+ schema1 = new Schema();
+ schema1.addColumn("name", TajoDataTypes.Type.BLOB);
+ schema1.addColumn("addr", TajoDataTypes.Type.TEXT);
+
+ meta1 = CatalogUtil.newTableMeta(CatalogProtos.StoreType.CSV);
+ meta1.putOption(CatalogConstants.CSVFILE_DELIMITER, CatalogConstants.CSVFILE_DELIMITER_DEFAULT);
+ meta1.putOption(CatalogConstants.COMPRESSION_CODEC, GzipCodec.class.getName());
Schema expressionSchema = new Schema();
expressionSchema.addColumn("key", TajoDataTypes.Type.INT4);
expressionSchema.addColumn("key2", TajoDataTypes.Type.TEXT);
- PartitionMethodDesc partitionMethod = new PartitionMethodDesc(
+ partitionMethod1 = new PartitionMethodDesc(
+ "db1",
"table1",
CatalogProtos.PartitionType.COLUMN,
"key,key2",
expressionSchema);
- desc.setPartitionMethod(partitionMethod);
+ }
- assertEquals(FileUtil.readTextFile(new File("src/test/resources/results/testBuildDDL.result")),
- DDLBuilder.buildDDL(desc));
+ @Test
+ public void testBuildDDLForExternalTable() throws Exception {
+ TableDesc desc = new TableDesc("db1.table1", schema1, meta1, new Path("/table1"));
+ desc.setPartitionMethod(partitionMethod1);
+ desc.setExternal(true);
+ assertEquals(FileUtil.readTextFileFromResource("results/testBuildDDLForExternalTable.result"),
+ DDLBuilder.buildDDLForExternalTable(desc));
+ }
+
+ @Test
+ public void testBuildDDLForBaseTable() throws Exception {
+ TableDesc desc = new TableDesc("db1.table2", schema1, meta1, new Path("/table1"));
+ assertEquals(FileUtil.readTextFileFromResource("results/testBuildDDLForBaseTable.result"),
+ DDLBuilder.buildDDLForBaseTable(desc));
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/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 3dac2f1..5949d1b 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
@@ -18,6 +18,8 @@
package org.apache.tajo.client;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.protobuf.ServiceException;
import com.sun.org.apache.commons.logging.Log;
@@ -25,6 +27,7 @@ import com.sun.org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.tajo.*;
+import org.apache.tajo.catalog.CatalogUtil;
import org.apache.tajo.catalog.FunctionDesc;
import org.apache.tajo.catalog.TableDesc;
import org.apache.tajo.catalog.proto.CatalogProtos;
@@ -32,6 +35,7 @@ import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.ipc.ClientProtos;
import org.apache.tajo.storage.StorageUtil;
import org.apache.tajo.util.CommonTestingUtil;
+import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -39,11 +43,10 @@ import org.junit.experimental.categories.Category;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
@Category(IntegrationTest.class)
public class TestTajoClient {
@@ -60,6 +63,11 @@ public class TestTajoClient {
testDir = CommonTestingUtil.getTestDir();
}
+ @AfterClass
+ public static void tearDown() throws Exception {
+ client.close();
+ }
+
private static Path writeTmpTable(String tableName) throws IOException {
Path tablePath = StorageUtil.concatPath(testDir, tableName);
BackendTestingUtil.writeTmpTable(conf, tablePath);
@@ -67,6 +75,125 @@ public class TestTajoClient {
}
@Test
+ public final void testCreateAndDropDatabases() throws ServiceException {
+ int currentNum = client.getAllDatabaseNames().size();
+
+ String prefix = CatalogUtil.normalizeIdentifier("testCreateDatabase_");
+ for (int i = 0; i < 10; i++) {
+ // test allDatabaseNames
+ assertEquals(currentNum + i, client.getAllDatabaseNames().size());
+
+ // test existence
+ assertFalse(client.existDatabase(prefix + i));
+ assertTrue(client.createDatabase(prefix + i));
+ assertTrue(client.existDatabase(prefix + i));
+
+ // test allDatabaseNames
+ assertEquals(currentNum + i + 1, client.getAllDatabaseNames().size());
+ assertTrue(client.getAllDatabaseNames().contains(prefix + i));
+ }
+
+ // test dropDatabase, existDatabase and getAllDatabaseNames()
+ for (int i = 0; i < 10; i++) {
+ assertTrue(client.existDatabase(prefix + i));
+ assertTrue(client.getAllDatabaseNames().contains(prefix + i));
+ assertTrue(client.dropDatabase(prefix + i));
+ assertFalse(client.existDatabase(prefix + i));
+ assertFalse(client.getAllDatabaseNames().contains(prefix + i));
+ }
+
+ assertEquals(currentNum, client.getAllDatabaseNames().size());
+ }
+
+ @Test
+ public final void testCurrentDatabase() throws IOException, ServiceException, InterruptedException {
+ int currentNum = client.getAllDatabaseNames().size();
+ assertEquals(TajoConstants.DEFAULT_DATABASE_NAME, client.getCurrentDatabase());
+
+ assertTrue(client.createDatabase("testcurrentdatabase"));
+ assertEquals(currentNum + 1, client.getAllDatabaseNames().size());
+ assertEquals(TajoConstants.DEFAULT_DATABASE_NAME, client.getCurrentDatabase());
+ assertTrue(client.selectDatabase("testcurrentdatabase"));
+ assertEquals("testcurrentdatabase", client.getCurrentDatabase());
+ assertTrue(client.selectDatabase("default"));
+ assertTrue(client.dropDatabase("testcurrentdatabase"));
+
+ assertEquals(currentNum, client.getAllDatabaseNames().size());
+ }
+
+ @Test
+ public final void testSelectDatabaseToInvalidOne() throws IOException, ServiceException, InterruptedException {
+ int currentNum = client.getAllDatabaseNames().size();
+ assertFalse(client.existDatabase("invaliddatabase"));
+
+ try {
+ assertTrue(client.selectDatabase("invaliddatabase"));
+ assertFalse(true);
+ } catch (Throwable t) {
+ assertFalse(false);
+ }
+
+ assertEquals(currentNum, client.getAllDatabaseNames().size());
+ }
+
+ @Test
+ public final void testDropCurrentDatabase() throws IOException, ServiceException, InterruptedException {
+ int currentNum = client.getAllDatabaseNames().size();
+ assertTrue(client.createDatabase("testdropcurrentdatabase"));
+ assertTrue(client.selectDatabase("testdropcurrentdatabase"));
+ assertEquals("testdropcurrentdatabase", client.getCurrentDatabase());
+
+ try {
+ client.dropDatabase("testdropcurrentdatabase");
+ assertFalse(true);
+ } catch (Throwable t) {
+ assertFalse(false);
+ }
+
+ assertTrue(client.selectDatabase("default"));
+ assertTrue(client.dropDatabase("testdropcurrentdatabase"));
+ assertEquals(currentNum, client.getAllDatabaseNames().size());
+ }
+
+ @Test
+ public final void testSessionVariables() throws IOException, ServiceException, InterruptedException {
+ String prefixName = "key_";
+ String prefixValue = "val_";
+ for (int i = 0; i < 10; i++) {
+ String key = prefixName + i;
+ String val = prefixValue + i;
+
+ assertEquals(i, client.getAllSessionVariables().size());
+ assertFalse(client.getAllSessionVariables().containsKey(key));
+ assertFalse(client.existSessionVariable(key));
+
+ Map<String, String> map = Maps.newHashMap();
+ map.put(key, val);
+ client.updateSessionVariables(map);
+
+ assertEquals(i + 1, client.getAllSessionVariables().size());
+ assertTrue(client.getAllSessionVariables().containsKey(key));
+ assertTrue(client.existSessionVariable(key));
+ }
+
+ int totalSessionVarNum = client.getAllSessionVariables().size();
+
+ for (int i = 0; i < 10; i++) {
+ String key = prefixName + i;
+
+ assertTrue(client.getAllSessionVariables().containsKey(key));
+ assertTrue(client.existSessionVariable(key));
+
+ client.unsetSessionVariables(Lists.newArrayList(key));
+
+ assertFalse(client.getAllSessionVariables().containsKey(key));
+ assertFalse(client.existSessionVariable(key));
+ }
+
+ assertEquals(totalSessionVarNum - 10, client.getAllSessionVariables().size());
+ }
+
+ @Test
public final void testKillQuery() throws IOException, ServiceException, InterruptedException {
ClientProtos.GetQueryStatusResponse res = client.executeQuery("select sleep(1) from lineitem");
Thread.sleep(1000);
@@ -142,7 +269,7 @@ public class TestTajoClient {
assertTrue(client.existTable(tableName));
client.updateQuery("drop table " + tableName);
- assertFalse(client.existTable(tableName));
+ assertFalse(client.existTable("tableName"));
FileSystem localFS = FileSystem.getLocal(conf);
assertTrue(localFS.exists(tablePath));
}
@@ -235,7 +362,7 @@ public class TestTajoClient {
assertTrue(client.existTable(tableName1));
assertTrue(client.existTable(tableName2));
- Set<String> tables = Sets.newHashSet(client.getTableList());
+ Set<String> tables = Sets.newHashSet(client.getTableList(null));
assertTrue(tables.contains(tableName1));
assertTrue(tables.contains(tableName2));
}
@@ -258,7 +385,7 @@ public class TestTajoClient {
TableDesc desc = client.getTableDesc(tableName1);
assertNotNull(desc);
- assertEquals(tableName1, desc.getName());
+ assertEquals(CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, tableName1), desc.getName());
assertTrue(desc.getStats().getNumBytes() > 0);
}
@@ -424,7 +551,7 @@ public class TestTajoClient {
assertFalse(client.existTable(tableName));
String sql = "create table " + tableName + " (deptname text, score int4)";
- sql += "PARTITION BY COLUMN (deptname text)";
+ sql += "PARTITION BY COLUMN (key1 text)";
client.updateQuery(sql);
assertTrue(client.existTable(tableName));
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
index 2982f83..a89f2bb 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
@@ -18,18 +18,22 @@
package org.apache.tajo.engine.eval;
+import org.apache.tajo.LocalTajoTestingUtility;
import org.apache.tajo.TajoTestingCluster;
import org.apache.tajo.algebra.Expr;
import org.apache.tajo.catalog.*;
import org.apache.tajo.catalog.proto.CatalogProtos;
+import org.apache.tajo.cli.InvalidStatementException;
+import org.apache.tajo.cli.ParsedResult;
+import org.apache.tajo.cli.SimpleParser;
import org.apache.tajo.datum.NullDatum;
import org.apache.tajo.datum.TextDatum;
import org.apache.tajo.engine.json.CoreGsonHelper;
import org.apache.tajo.engine.parser.SQLAnalyzer;
import org.apache.tajo.engine.planner.*;
-import org.apache.tajo.engine.planner.logical.LogicalNode;
import org.apache.tajo.engine.utils.SchemaUtil;
import org.apache.tajo.master.TajoMaster;
+import org.apache.tajo.master.session.Session;
import org.apache.tajo.storage.LazyTuple;
import org.apache.tajo.storage.Tuple;
import org.apache.tajo.storage.VTuple;
@@ -39,8 +43,10 @@ import org.junit.AfterClass;
import org.junit.BeforeClass;
import java.io.IOException;
-import java.util.Stack;
+import java.util.List;
+import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
+import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -58,6 +64,8 @@ public class ExprTestBase {
util = new TajoTestingCluster();
util.startCatalogCluster();
cat = util.getMiniCatalogCluster().getCatalog();
+ cat.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse");
+ cat.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
for (FunctionDesc funcDesc : TajoMaster.initBuiltinFunctions()) {
cat.createFunction(funcDesc);
}
@@ -88,27 +96,34 @@ public class ExprTestBase {
* @return
* @throws PlanningException
*/
- private static Target[] getRawTargets(String query, boolean condition) throws PlanningException {
- Expr expr = analyzer.parse(query);
+ private static Target[] getRawTargets(String query, boolean condition) throws PlanningException,
+ InvalidStatementException {
+
+ Session session = LocalTajoTestingUtility.createDummySession();
+ List<ParsedResult> parsedResults = SimpleParser.parseScript(query);
+ if (parsedResults.size() > 1) {
+ throw new RuntimeException("this query includes two or more statements.");
+ }
+ Expr expr = analyzer.parse(parsedResults.get(0).getStatement());
VerificationState state = new VerificationState();
- preLogicalPlanVerifier.visit(state, new Stack<Expr>(), expr);
+ preLogicalPlanVerifier.verify(session, state, expr);
if (state.getErrorMessages().size() > 0) {
if (!condition && state.getErrorMessages().size() > 0) {
throw new PlanningException(state.getErrorMessages().get(0));
}
assertFalse(state.getErrorMessages().get(0), true);
}
- LogicalPlan plan = planner.createPlan(expr, true);
+ LogicalPlan plan = planner.createPlan(session, expr, true);
optimizer.optimize(plan);
- annotatedPlanVerifier.visit(state, plan, plan.getRootBlock(), plan.getRootBlock().getRoot(),
- new Stack<LogicalNode>());
+ annotatedPlanVerifier.verify(session, state, plan);
+
if (state.getErrorMessages().size() > 0) {
assertFalse(state.getErrorMessages().get(0), true);
}
Target [] targets = plan.getRootBlock().getRawTargets();
if (targets == null) {
- throw new PlanningException("Wrong query statement or query plan: " + query);
+ throw new PlanningException("Wrong query statement or query plan: " + parsedResults.get(0).getStatement());
}
for (Target t : targets) {
assertJsonSerDer(t.getEvalTree());
@@ -133,10 +148,11 @@ public class ExprTestBase {
char delimiter, boolean condition) throws IOException {
LazyTuple lazyTuple;
VTuple vtuple = null;
+ String qualifiedTableName = CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, tableName);
Schema inputSchema = null;
if (schema != null) {
inputSchema = SchemaUtil.clone(schema);
- inputSchema.setQualifier(tableName);
+ inputSchema.setQualifier(qualifiedTableName);
int targetIdx [] = new int[inputSchema.size()];
for (int i = 0; i < targetIdx.length; i++) {
@@ -154,8 +170,8 @@ public class ExprTestBase {
vtuple.put(i, lazyTuple.get(i));
}
}
- cat.addTable(new TableDesc(tableName, inputSchema, CatalogProtos.StoreType.CSV, new Options(),
- CommonTestingUtil.getTestDir()));
+ cat.createTable(new TableDesc(qualifiedTableName, inputSchema,
+ CatalogProtos.StoreType.CSV, new Options(), CommonTestingUtil.getTestDir()));
}
Target [] targets;
@@ -172,6 +188,8 @@ public class ExprTestBase {
for (int i = 0; i < expected.length; i++) {
assertEquals(query, expected[i], outTuple.get(i).asChars());
}
+ } catch (InvalidStatementException e) {
+ assertFalse(e.getMessage(), true);
} catch (PlanningException e) {
// In failure test case, an exception must occur while executing query.
// So, we should check an error message, and return it.
@@ -182,7 +200,7 @@ public class ExprTestBase {
}
} finally {
if (schema != null) {
- cat.deleteTable(tableName);
+ cat.dropTable(qualifiedTableName);
}
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
index f9c50ac..d916bbc 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
@@ -19,6 +19,8 @@
package org.apache.tajo.engine.eval;
import com.google.common.collect.Sets;
+import org.apache.tajo.LocalTajoTestingUtility;
+import org.apache.tajo.TajoConstants;
import org.apache.tajo.TajoTestingCluster;
import org.apache.tajo.algebra.Expr;
import org.apache.tajo.algebra.OpType;
@@ -39,6 +41,7 @@ import org.apache.tajo.engine.planner.logical.GroupbyNode;
import org.apache.tajo.engine.planner.logical.NodeType;
import org.apache.tajo.exception.InternalException;
import org.apache.tajo.master.TajoMaster;
+import org.apache.tajo.master.session.Session;
import org.apache.tajo.storage.Tuple;
import org.apache.tajo.util.CommonTestingUtil;
import org.junit.AfterClass;
@@ -50,6 +53,7 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
+import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
import static org.apache.tajo.common.TajoDataTypes.Type.INT4;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -62,6 +66,8 @@ public class TestEvalTreeUtil {
static EvalNode expr3;
static SQLAnalyzer analyzer;
static LogicalPlanner planner;
+ static Session session = LocalTajoTestingUtility.createDummySession();
+
public static class TestSum extends GeneralFunction {
private Integer x;
private Integer y;
@@ -87,6 +93,8 @@ public class TestEvalTreeUtil {
for (FunctionDesc funcDesc : TajoMaster.initBuiltinFunctions()) {
catalog.createFunction(funcDesc);
}
+ catalog.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse");
+ catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
Schema schema = new Schema();
schema.addColumn("name", TajoDataTypes.Type.TEXT);
@@ -94,8 +102,10 @@ public class TestEvalTreeUtil {
schema.addColumn("age", TajoDataTypes.Type.INT4);
TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV);
- TableDesc desc = new TableDesc("people", schema, meta, CommonTestingUtil.getTestDir());
- catalog.addTable(desc);
+ TableDesc desc = new TableDesc(
+ CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "people"), schema, meta,
+ CommonTestingUtil.getTestDir());
+ catalog.createTable(desc);
FunctionDesc funcMeta = new FunctionDesc("test_sum", TestSum.class,
FunctionType.GENERAL,
@@ -126,7 +136,7 @@ public class TestEvalTreeUtil {
Expr expr = analyzer.parse(query);
LogicalPlan plan = null;
try {
- plan = planner.createPlan(expr);
+ plan = planner.createPlan(session, expr);
} catch (PlanningException e) {
e.printStackTrace();
}
@@ -138,7 +148,7 @@ public class TestEvalTreeUtil {
Expr block = analyzer.parse(query);
LogicalPlan plan = null;
try {
- plan = planner.createPlan(block);
+ plan = planner.createPlan(session, block);
} catch (PlanningException e) {
e.printStackTrace();
}
@@ -150,23 +160,23 @@ public class TestEvalTreeUtil {
@Test
public final void testChangeColumnRef() throws CloneNotSupportedException {
EvalNode copy = (EvalNode)expr1.clone();
- EvalTreeUtil.changeColumnRef(copy, "people.score", "newscore");
+ EvalTreeUtil.changeColumnRef(copy, "default.people.score", "newscore");
Set<Column> set = EvalTreeUtil.findUniqueColumns(copy);
assertEquals(1, set.size());
assertTrue(set.contains(new Column("newscore", TajoDataTypes.Type.INT4)));
copy = (EvalNode)expr2.clone();
- EvalTreeUtil.changeColumnRef(copy, "people.age", "sum_age");
+ EvalTreeUtil.changeColumnRef(copy, "default.people.age", "sum_age");
set = EvalTreeUtil.findUniqueColumns(copy);
assertEquals(2, set.size());
- assertTrue(set.contains(new Column("people.score", TajoDataTypes.Type.INT4)));
+ assertTrue(set.contains(new Column("default.people.score", TajoDataTypes.Type.INT4)));
assertTrue(set.contains(new Column("sum_age", TajoDataTypes.Type.INT4)));
copy = (EvalNode)expr3.clone();
- EvalTreeUtil.changeColumnRef(copy, "people.age", "sum_age");
+ EvalTreeUtil.changeColumnRef(copy, "default.people.age", "sum_age");
set = EvalTreeUtil.findUniqueColumns(copy);
assertEquals(2, set.size());
- assertTrue(set.contains(new Column("people.score", TajoDataTypes.Type.INT4)));
+ assertTrue(set.contains(new Column("default.people.score", TajoDataTypes.Type.INT4)));
assertTrue(set.contains(new Column("sum_age", TajoDataTypes.Type.INT4)));
}
@@ -174,17 +184,17 @@ public class TestEvalTreeUtil {
public final void testFindAllRefColumns() {
Set<Column> set = EvalTreeUtil.findUniqueColumns(expr1);
assertEquals(1, set.size());
- assertTrue(set.contains(new Column("people.score", TajoDataTypes.Type.INT4)));
+ assertTrue(set.contains(new Column("default.people.score", TajoDataTypes.Type.INT4)));
set = EvalTreeUtil.findUniqueColumns(expr2);
assertEquals(2, set.size());
- assertTrue(set.contains(new Column("people.score", TajoDataTypes.Type.INT4)));
- assertTrue(set.contains(new Column("people.age", TajoDataTypes.Type.INT4)));
+ assertTrue(set.contains(new Column("default.people.score", TajoDataTypes.Type.INT4)));
+ assertTrue(set.contains(new Column("default.people.age", TajoDataTypes.Type.INT4)));
set = EvalTreeUtil.findUniqueColumns(expr3);
assertEquals(2, set.size());
- assertTrue(set.contains(new Column("people.score", TajoDataTypes.Type.INT4)));
- assertTrue(set.contains(new Column("people.age", TajoDataTypes.Type.INT4)));
+ assertTrue(set.contains(new Column("default.people.score", TajoDataTypes.Type.INT4)));
+ assertTrue(set.contains(new Column("default.people.age", TajoDataTypes.Type.INT4)));
}
public static final String [] QUERIES = {
@@ -213,9 +223,9 @@ public class TestEvalTreeUtil {
@Test
public final void testGetContainExprs() throws CloneNotSupportedException, PlanningException {
Expr expr = analyzer.parse(QUERIES[1]);
- LogicalPlan plan = planner.createPlan(expr, true);
+ LogicalPlan plan = planner.createPlan(session, expr, true);
Target [] targets = plan.getRootBlock().getRawTargets();
- Column col1 = new Column("people.score", TajoDataTypes.Type.INT4);
+ Column col1 = new Column("default.people.score", TajoDataTypes.Type.INT4);
Collection<EvalNode> exprs =
EvalTreeUtil.getContainExpr(targets[0].getEvalTree(), col1);
EvalNode node = exprs.iterator().next();
@@ -223,11 +233,11 @@ public class TestEvalTreeUtil {
assertEquals(EvalType.PLUS, node.getLeftExpr().getType());
assertEquals(new ConstEval(DatumFactory.createInt4(4)), node.getRightExpr());
- Column col2 = new Column("people.age", TajoDataTypes.Type.INT4);
+ Column col2 = new Column("default.people.age", TajoDataTypes.Type.INT4);
exprs = EvalTreeUtil.getContainExpr(targets[1].getEvalTree(), col2);
node = exprs.iterator().next();
assertEquals(EvalType.GTH, node.getType());
- assertEquals("people.age", node.getLeftExpr().getName());
+ assertEquals("default.people.age", node.getLeftExpr().getName());
assertEquals(new ConstEval(DatumFactory.createInt4(5)), node.getRightExpr());
}
@@ -237,7 +247,7 @@ public class TestEvalTreeUtil {
EvalNode node = getRootSelection(QUERIES[5]);
EvalNode [] cnf = AlgebraicUtil.toConjunctiveNormalFormArray(node);
- Column col1 = new Column("people.score", TajoDataTypes.Type.INT4);
+ Column col1 = new Column("default.people.score", TajoDataTypes.Type.INT4);
assertEquals(2, cnf.length);
EvalNode first = cnf[0];
@@ -276,8 +286,8 @@ public class TestEvalTreeUtil {
EvalNode [] cnf = AlgebraicUtil.toDisjunctiveNormalFormArray(node);
assertEquals(2, cnf.length);
- assertEquals("people.score (INT4) > 1 AND people.score (INT4) < 3", cnf[0].toString());
- assertEquals("7 < people.score (INT4) AND people.score (INT4) < 10", cnf[1].toString());
+ assertEquals("default.people.score (INT4) > 1 AND default.people.score (INT4) < 3", cnf[0].toString());
+ assertEquals("7 < default.people.score (INT4) AND default.people.score (INT4) < 10", cnf[1].toString());
}
@Test
@@ -291,9 +301,9 @@ public class TestEvalTreeUtil {
assertTrue(7.0d == node.eval(null, null).asFloat8());
Expr expr = analyzer.parse(QUERIES[1]);
- LogicalPlan plan = planner.createPlan(expr, true);
+ LogicalPlan plan = planner.createPlan(session, expr, true);
targets = plan.getRootBlock().getRawTargets();
- Column col1 = new Column("people.score", TajoDataTypes.Type.INT4);
+ Column col1 = new Column("default.people.score", TajoDataTypes.Type.INT4);
Collection<EvalNode> exprs =
EvalTreeUtil.getContainExpr(targets[0].getEvalTree(), col1);
node = exprs.iterator().next();
@@ -309,7 +319,7 @@ public class TestEvalTreeUtil {
@Test
public final void testTranspose() throws PlanningException {
- Column col1 = new Column("people.score", TajoDataTypes.Type.INT4);
+ Column col1 = new Column("default.people.score", TajoDataTypes.Type.INT4);
EvalNode node = getRootSelection(QUERIES[3]);
// we expect that score < 3
EvalNode transposed = AlgebraicUtil.transpose(node, col1);
@@ -331,7 +341,7 @@ public class TestEvalTreeUtil {
public final void testFindDistinctAggFunctions() throws PlanningException {
String query = "select sum(score) + max(age) from people";
Expr expr = analyzer.parse(query);
- LogicalPlan plan = planner.createPlan(expr);
+ LogicalPlan plan = planner.createPlan(session, expr);
GroupbyNode groupByNode = plan.getRootBlock().getNode(NodeType.GROUP_BY);
EvalNode [] aggEvals = groupByNode.getAggFunctions();
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java
index 3e64016..65612f7 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.function;
import org.apache.tajo.IntegrationTest;
import org.apache.tajo.QueryTestCaseBase;
+import org.apache.tajo.TajoConstants;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -29,6 +30,11 @@ import static org.junit.Assert.assertTrue;
@Category(IntegrationTest.class)
public class TestBuiltinFunctions extends QueryTestCaseBase {
+
+ public TestBuiltinFunctions() {
+ super(TajoConstants.DEFAULT_DATABASE_NAME);
+ }
+
@Test
public void testMaxLong() throws Exception {
ResultSet res = executeQuery();
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java
index 6107ca7..c4ef32b 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java
@@ -18,6 +18,8 @@
package org.apache.tajo.engine.planner;
+import org.apache.tajo.LocalTajoTestingUtility;
+import org.apache.tajo.TajoConstants;
import org.apache.tajo.TajoTestingCluster;
import org.apache.tajo.algebra.Expr;
import org.apache.tajo.catalog.*;
@@ -28,11 +30,14 @@ import org.apache.tajo.engine.function.builtin.SumInt;
import org.apache.tajo.engine.parser.SQLAnalyzer;
import org.apache.tajo.engine.planner.logical.*;
import org.apache.tajo.master.TajoMaster;
+import org.apache.tajo.master.session.Session;
import org.apache.tajo.util.CommonTestingUtil;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
+import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
import static org.junit.Assert.*;
public class TestLogicalOptimizer {
@@ -42,12 +47,15 @@ public class TestLogicalOptimizer {
private static SQLAnalyzer sqlAnalyzer;
private static LogicalPlanner planner;
private static LogicalOptimizer optimizer;
+ private static Session session = LocalTajoTestingUtility.createDummySession();
@BeforeClass
public static void setUp() throws Exception {
util = new TajoTestingCluster();
util.startCatalogCluster();
catalog = util.getMiniCatalogCluster().getCatalog();
+ catalog.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse");
+ catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
for (FunctionDesc funcDesc : TajoMaster.initBuiltinFunctions()) {
catalog.createFunction(funcDesc);
}
@@ -67,14 +75,22 @@ public class TestLogicalOptimizer {
schema3.addColumn("phone", Type.INT4);
TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV);
- TableDesc people = new TableDesc("employee", schema, meta, CommonTestingUtil.getTestDir());
- catalog.addTable(people);
+ TableDesc people = new TableDesc(
+ CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "employee"), schema, meta,
+ CommonTestingUtil.getTestDir());
+ catalog.createTable(people);
- TableDesc student = new TableDesc("dept", schema2, StoreType.CSV, new Options(), CommonTestingUtil.getTestDir());
- catalog.addTable(student);
+ TableDesc student =
+ new TableDesc(
+ CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "dept"), schema2, StoreType.CSV, new Options(),
+ CommonTestingUtil.getTestDir());
+ catalog.createTable(student);
- TableDesc score = new TableDesc("score", schema3, StoreType.CSV, new Options(), CommonTestingUtil.getTestDir());
- catalog.addTable(score);
+ TableDesc score =
+ new TableDesc(
+ CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "score"), schema3, StoreType.CSV, new Options(),
+ CommonTestingUtil.getTestDir());
+ catalog.createTable(score);
FunctionDesc funcDesc = new FunctionDesc("sumtest", SumInt.class, FunctionType.GENERAL,
CatalogUtil.newSimpleDataType(Type.INT4),
@@ -104,7 +120,7 @@ public class TestLogicalOptimizer {
public final void testProjectionPushWithNaturalJoin() throws PlanningException, CloneNotSupportedException {
// two relations
Expr expr = sqlAnalyzer.parse(QUERIES[4]);
- LogicalPlan newPlan = planner.createPlan(expr);
+ LogicalPlan newPlan = planner.createPlan(session, expr);
LogicalNode plan = newPlan.getRootBlock().getRoot();
assertEquals(NodeType.ROOT, plan.getType());
LogicalRootNode root = (LogicalRootNode) plan;
@@ -131,7 +147,7 @@ public class TestLogicalOptimizer {
public final void testProjectionPushWithInnerJoin() throws PlanningException {
// two relations
Expr expr = sqlAnalyzer.parse(QUERIES[5]);
- LogicalPlan newPlan = planner.createPlan(expr);
+ LogicalPlan newPlan = planner.createPlan(session, expr);
optimizer.optimize(newPlan);
}
@@ -139,7 +155,7 @@ public class TestLogicalOptimizer {
public final void testProjectionPush() throws CloneNotSupportedException, PlanningException {
// two relations
Expr expr = sqlAnalyzer.parse(QUERIES[2]);
- LogicalPlan newPlan = planner.createPlan(expr);
+ LogicalPlan newPlan = planner.createPlan(session, expr);
LogicalNode plan = newPlan.getRootBlock().getRoot();
assertEquals(NodeType.ROOT, plan.getType());
@@ -161,7 +177,7 @@ public class TestLogicalOptimizer {
@Test
public final void testOptimizeWithGroupBy() throws CloneNotSupportedException, PlanningException {
Expr expr = sqlAnalyzer.parse(QUERIES[3]);
- LogicalPlan newPlan = planner.createPlan(expr);
+ LogicalPlan newPlan = planner.createPlan(session, expr);
LogicalNode plan = newPlan.getRootBlock().getRoot();
assertEquals(NodeType.ROOT, plan.getType());
@@ -188,7 +204,7 @@ public class TestLogicalOptimizer {
public final void testPushable() throws CloneNotSupportedException, PlanningException {
// two relations
Expr expr = sqlAnalyzer.parse(QUERIES[0]);
- LogicalPlan newPlan = planner.createPlan(expr);
+ LogicalPlan newPlan = planner.createPlan(session, expr);
LogicalNode plan = newPlan.getRootBlock().getRoot();
assertEquals(NodeType.ROOT, plan.getType());
@@ -219,7 +235,7 @@ public class TestLogicalOptimizer {
// Scan Pushable Test
expr = sqlAnalyzer.parse(QUERIES[1]);
- newPlan = planner.createPlan(expr);
+ newPlan = planner.createPlan(session, expr);
plan = newPlan.getRootBlock().getRoot();
assertEquals(NodeType.ROOT, plan.getType());
@@ -241,7 +257,7 @@ public class TestLogicalOptimizer {
@Test
public final void testInsertInto() throws CloneNotSupportedException, PlanningException {
Expr expr = sqlAnalyzer.parse(TestLogicalPlanner.insertStatements[0]);
- LogicalPlan newPlan = planner.createPlan(expr);
+ LogicalPlan newPlan = planner.createPlan(session, expr);
optimizer.optimize(newPlan);
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/3ba26241/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlan.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlan.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlan.java
index bfd1f81..2f1e0f9 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlan.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlan.java
@@ -18,6 +18,7 @@
package org.apache.tajo.engine.planner;
+import org.apache.tajo.LocalTajoTestingUtility;
import org.apache.tajo.TajoTestingCluster;
import org.apache.tajo.benchmark.TPCH;
import org.apache.tajo.catalog.*;
@@ -33,6 +34,8 @@ import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
+import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
+import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
import static org.apache.tajo.engine.planner.LogicalPlan.BlockType;
import static org.junit.Assert.*;
@@ -49,6 +52,8 @@ public class TestLogicalPlan {
util = new TajoTestingCluster();
util.startCatalogCluster();
catalog = util.getMiniCatalogCluster().getCatalog();
+ catalog.createTablespace(DEFAULT_TABLESPACE_NAME, CommonTestingUtil.getTestDir().toUri().toString());
+ catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
for (FunctionDesc funcDesc : TajoMaster.initBuiltinFunctions()) {
catalog.createFunction(funcDesc);
}
@@ -71,7 +76,7 @@ public class TestLogicalPlan {
TableDesc d = CatalogUtil.newTableDesc(tpchTables[i], tpch.getSchema(tpchTables[i]), m,
CommonTestingUtil.getTestDir());
d.setStats(stats);
- catalog.addTable(d);
+ catalog.createTable(d);
}
planner = new LogicalPlanner(catalog);
optimizer = new LogicalOptimizer(util.getConfiguration());
@@ -83,7 +88,7 @@ public class TestLogicalPlan {
@Test
public final void testQueryBlockGraph() {
- LogicalPlan plan = new LogicalPlan(planner);
+ LogicalPlan plan = new LogicalPlan(LocalTajoTestingUtility.createDummySession().getCurrentDatabase(), planner);
LogicalPlan.QueryBlock root = plan.newAndGetBlock(LogicalPlan.ROOT_BLOCK);
LogicalPlan.QueryBlock new1 = plan.newQueryBlock();
LogicalPlan.QueryBlock new2 = plan.newQueryBlock();