Repository: phoenix Updated Branches: refs/heads/4.x-HBase-1.2 9ab708061 -> 280412183
PHOENIX-4942 Move MetaDataEndpointImplTest to integration test Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/28041218 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/28041218 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/28041218 Branch: refs/heads/4.x-HBase-1.2 Commit: 2804121837d77e048f6ce5cacee0084d5258220a Parents: 9ab7080 Author: Thomas D'Silva <tdsi...@apache.org> Authored: Mon Oct 15 22:17:24 2018 -0700 Committer: Thomas D'Silva <tdsi...@apache.org> Committed: Mon Oct 15 22:17:24 2018 -0700 ---------------------------------------------------------------------- .../phoenix/end2end/MetaDataEndpointImplIT.java | 301 +++++++++++++++++++ .../coprocessor/MetaDataEndpointImplTest.java | 299 ------------------ 2 files changed, 301 insertions(+), 299 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/28041218/phoenix-core/src/it/java/org/apache/phoenix/end2end/MetaDataEndpointImplIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/MetaDataEndpointImplIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/MetaDataEndpointImplIT.java new file mode 100644 index 0000000..f14af9e --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/MetaDataEndpointImplIT.java @@ -0,0 +1,301 @@ +package org.apache.phoenix.end2end; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.HTable; +import org.apache.phoenix.coprocessor.TableViewFinderResult; +import org.apache.phoenix.coprocessor.ViewFinder; +import org.apache.phoenix.end2end.ParallelStatsDisabledIT; +import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; +import org.apache.phoenix.schema.PColumn; +import org.apache.phoenix.schema.PTable; +import org.apache.phoenix.schema.TableNotFoundException; +import org.apache.phoenix.util.PhoenixRuntime; +import org.junit.Test; + +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +/** + * 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. + */ +public class MetaDataEndpointImplIT extends ParallelStatsDisabledIT { + private final TableName catalogTable = TableName.valueOf(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES); + private final TableName linkTable = TableName.valueOf(PhoenixDatabaseMetaData.SYSTEM_CHILD_LINK_NAME_BYTES); + + /* + The tree structure is as follows: Where ParentTable is the Base Table + and all children are views and child views respectively. + + ParentTable + / \ + leftChild rightChild + / + leftGrandChild + */ + + @Test + public void testGettingChildrenAndParentViews() throws Exception { + String baseTable = generateUniqueName(); + String leftChild = generateUniqueName(); + String rightChild = generateUniqueName(); + String leftGrandChild = generateUniqueName(); + Connection conn = DriverManager.getConnection(getUrl()); + String ddlFormat = + "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " + + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; + conn.createStatement().execute(ddlFormat); + + conn.createStatement().execute("CREATE VIEW " + rightChild + " AS SELECT * FROM " + baseTable); + conn.createStatement().execute("CREATE VIEW " + leftChild + " (carrier VARCHAR) AS SELECT * FROM " + baseTable); + conn.createStatement().execute("CREATE VIEW " + leftGrandChild + " (dropped_calls BIGINT) AS SELECT * FROM " + leftChild); + + PTable table = PhoenixRuntime.getTable(conn, baseTable.toUpperCase()); + PTable rightChildTable = PhoenixRuntime.getTable(conn, rightChild.toUpperCase()); + System.err.println(rightChildTable); + + TableViewFinderResult childViews = new TableViewFinderResult(); + ViewFinder.findAllRelatives(getTable(linkTable), HConstants.EMPTY_BYTE_ARRAY, table.getSchemaName().getBytes(), + table.getTableName().getBytes(), PTable.LinkType.CHILD_TABLE, childViews); + assertEquals(3, childViews.getLinks().size()); + + PTable childMostView = PhoenixRuntime.getTable(conn , leftGrandChild.toUpperCase()); + TableViewFinderResult parentViews = new TableViewFinderResult(); + ViewFinder + .findAllRelatives(getTable(catalogTable), HConstants.EMPTY_BYTE_ARRAY, childMostView.getSchemaName().getBytes(), + childMostView.getTableName().getBytes(), PTable.LinkType.PARENT_TABLE, parentViews); + // returns back everything but the parent table - should only return back the left_child and not the right child + assertEquals(1, parentViews.getLinks().size()); + // now lets check and make sure the columns are correct + assertColumnNamesEqual(PhoenixRuntime.getTable(conn, childMostView.getName().getString()), "PK2", "V1", "V2", "CARRIER", "DROPPED_CALLS"); + + } + + @Test + public void testGettingOneChild() throws Exception { + String baseTable = generateUniqueName(); + String leftChild = generateUniqueName(); + Connection conn = DriverManager.getConnection(getUrl()); + String ddlFormat = + "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " + + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; + conn.createStatement().execute(ddlFormat); + conn.createStatement().execute("CREATE VIEW " + leftChild + " (carrier VARCHAR) AS SELECT * FROM " + baseTable); + + + // now lets check and make sure the columns are correct + assertColumnNamesEqual(PhoenixRuntime.getTable(conn, leftChild.toUpperCase()), "PK2", "V1", "V2", "CARRIER"); + } + + @Test + public void testDroppingADerivedColumn() throws Exception { + String baseTable = generateUniqueName(); + String childView = generateUniqueName(); + Connection conn = DriverManager.getConnection(getUrl()); + String ddlFormat = "CREATE TABLE " + baseTable + " (A VARCHAR PRIMARY KEY, B VARCHAR, C VARCHAR)"; + conn.createStatement().execute(ddlFormat); + conn.createStatement().execute("CREATE VIEW " + childView + " (D VARCHAR) AS SELECT * FROM " + baseTable); + assertColumnNamesEqual(PhoenixRuntime.getTable(conn, childView.toUpperCase()), "A", "B", "C", "D"); + conn.createStatement().execute("ALTER VIEW " + childView + " DROP COLUMN C"); + + // now lets check and make sure the columns are correct + assertColumnNamesEqual(PhoenixRuntime.getTableNoCache(conn, childView.toUpperCase()), "A", "B", "D"); + + } + + @Test + public void testDroppingAColumn() throws Exception { + String baseTable = generateUniqueName(); + String childView = generateUniqueName(); + Connection conn = DriverManager.getConnection(getUrl()); + String ddlFormat = "CREATE TABLE " + baseTable + " (A VARCHAR PRIMARY KEY, B VARCHAR, C VARCHAR)"; + conn.createStatement().execute(ddlFormat); + conn.createStatement().execute("CREATE VIEW " + childView + " (D VARCHAR) AS SELECT * FROM " + baseTable); + assertColumnNamesEqual(PhoenixRuntime.getTable(conn, childView.toUpperCase()), "A", "B", "C", "D"); + conn.createStatement().execute("ALTER TABLE " + baseTable + " DROP COLUMN C"); + + // now lets check and make sure the columns are correct + assertColumnNamesEqual(PhoenixRuntime.getTableNoCache(conn, childView.toUpperCase()), "A", "B", "D"); + } + + @Test + public void testAlteringBaseColumns() throws Exception { + String baseTable = generateUniqueName(); + String leftChild = generateUniqueName(); + Connection conn = DriverManager.getConnection(getUrl()); + String ddlFormat = + "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " + + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; + conn.createStatement().execute(ddlFormat); + conn.createStatement().execute("CREATE VIEW " + leftChild + " (carrier VARCHAR) AS SELECT * FROM " + baseTable); + + // now lets check and make sure the columns are correct + PTable childPTable = PhoenixRuntime.getTable(conn, leftChild.toUpperCase()); + assertColumnNamesEqual(childPTable, "PK2", "V1", "V2", "CARRIER"); + + // now lets alter the base table by adding a column + conn.createStatement().execute("ALTER TABLE " + baseTable + " ADD V3 integer"); + + // make sure that column was added to the base table + PTable table = PhoenixRuntime.getTableNoCache(conn, baseTable.toUpperCase()); + assertColumnNamesEqual(table, "PK2", "V1", "V2", "V3"); + + + childPTable = PhoenixRuntime.getTableNoCache(conn, leftChild.toUpperCase()); + assertColumnNamesEqual(childPTable, "PK2", "V1", "V2", "V3", "CARRIER"); + } + + @Test + public void testAddingAColumnWithADifferentDefinition() throws Exception { + String baseTable = generateUniqueName(); + String view = generateUniqueName(); + Connection conn = DriverManager.getConnection(getUrl()); + String ddlFormat = + "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " + + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; + conn.createStatement().execute(ddlFormat); + conn.createStatement().execute("CREATE VIEW " + view + " (carrier BIGINT) AS SELECT * FROM " + baseTable); + Map<String, String> expected = new ImmutableMap.Builder<String, String>() + .put("PK2", "VARCHAR") + .put("V1", "VARCHAR") + .put("V2", "VARCHAR") + .put("CARRIER", "BIGINT") + .build(); + + assertColumnNamesAndDefinitionsEqual(PhoenixRuntime.getTable(conn , view.toUpperCase()), expected); + try { + conn.createStatement().execute("ALTER TABLE " + baseTable + " ADD carrier VARCHAR"); + } + catch(SQLException e) { + assertEquals(SQLExceptionCode.CANNOT_MUTATE_TABLE.getErrorCode(), e.getErrorCode()); + } + + Map<String, String> expectedBaseTableColumns = new ImmutableMap.Builder<String, String>() + .put("PK2", "VARCHAR") + .put("V1", "VARCHAR") + .put("V2", "VARCHAR") + .build(); + + assertColumnNamesAndDefinitionsEqual(PhoenixRuntime.getTable(conn , baseTable.toUpperCase()), expectedBaseTableColumns); + + // the view column "CARRIER" should still be unchanged + Map<String, String> expectedViewColumnDefinition = new ImmutableMap.Builder<String, String>() + .put("PK2", "VARCHAR") + .put("V1", "VARCHAR") + .put("V2", "VARCHAR") + .put("CARRIER", "BIGINT") + .build(); + + assertColumnNamesAndDefinitionsEqual(PhoenixRuntime.getTable(conn , view.toUpperCase()), expectedViewColumnDefinition); + } + + public void testDropCascade() throws Exception { + String baseTable = generateUniqueName(); + String child = generateUniqueName(); + String grandChild = generateUniqueName(); + Connection conn = DriverManager.getConnection(getUrl()); + String ddlFormat = + "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " + + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; + conn.createStatement().execute(ddlFormat); + conn.createStatement().execute("CREATE VIEW " + child + " (A VARCHAR) AS SELECT * FROM " + baseTable); + conn.createStatement().execute("CREATE VIEW " + grandChild + " (B VARCHAR) AS SELECT * FROM " + child); + + PTable childMostView = PhoenixRuntime.getTable(conn , child.toUpperCase()); + // now lets check and make sure the columns are correct + PTable grandChildPTable = PhoenixRuntime.getTable(conn, childMostView.getName().getString()); + assertColumnNamesEqual(grandChildPTable, "PK2", "V1", "V2", "A"); + + // now lets drop the parent table + conn.createStatement().execute("DROP TABLE " + baseTable + " CASCADE"); + + // the tables should no longer exist + try { + PhoenixRuntime.getTableNoCache(conn, baseTable); + fail(); + } + catch(TableNotFoundException e){} + try { + PhoenixRuntime.getTableNoCache(conn, child); + fail(); + } + catch(TableNotFoundException e){} + try { + PhoenixRuntime.getTableNoCache(conn, grandChild); + fail(); + } + catch(TableNotFoundException e){} + } + + @Test + public void testWhereClause() throws Exception { + Connection conn = DriverManager.getConnection(getUrl()); + String baseTableName = generateUniqueName(); + String childViewName = generateUniqueName(); + String grandChildViewName = generateUniqueName(); + String baseTableDdl = "CREATE TABLE " + baseTableName + " (" + + "A0 CHAR(1) NOT NULL PRIMARY KEY," + + "A1 CHAR(1), A2 CHAR (1))"; + conn.createStatement().execute(baseTableDdl); + conn.createStatement().execute( + "CREATE VIEW " + childViewName + " AS SELECT * FROM " + baseTableName + " WHERE A1 = 'X'"); + conn.createStatement().execute( + "CREATE VIEW " + grandChildViewName + " AS SELECT * FROM " + childViewName + " WHERE A2 = 'Y'"); + + PTable childViewTable = PhoenixRuntime.getTableNoCache(conn, childViewName); + PTable grandChildViewTable = PhoenixRuntime.getTableNoCache(conn, grandChildViewName); + + assertNotNull(childViewTable.getColumnForColumnName("A1").getViewConstant()); + assertNotNull(grandChildViewTable.getColumnForColumnName("A1").getViewConstant()); + assertNotNull(grandChildViewTable.getColumnForColumnName("A2").getViewConstant()); + } + + private void assertColumnNamesEqual(PTable table, String... cols) { + List<String> actual = Lists.newArrayList(); + for (PColumn column : table.getColumns()) { + actual.add(column.getName().getString().trim()); + } + List<String> expected = Arrays.asList(cols); + assertEquals(Joiner.on(", ").join(expected), Joiner.on(", ").join(actual)); + } + + private void assertColumnNamesAndDefinitionsEqual(PTable table, Map<String, String> expected) { + Map<String, String> actual = Maps.newHashMap(); + for (PColumn column : table.getColumns()) { + actual.put(column.getName().getString().trim(), column.getDataType().getSqlTypeName()); + } + assertEquals(expected, actual); + } + + private HTable getTable(TableName catalogTable) throws IOException { + return new HTable(utility.getConfiguration(), catalogTable); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/28041218/phoenix-core/src/test/java/org/apache/phoenix/coprocessor/MetaDataEndpointImplTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/coprocessor/MetaDataEndpointImplTest.java b/phoenix-core/src/test/java/org/apache/phoenix/coprocessor/MetaDataEndpointImplTest.java deleted file mode 100644 index cb41191..0000000 --- a/phoenix-core/src/test/java/org/apache/phoenix/coprocessor/MetaDataEndpointImplTest.java +++ /dev/null @@ -1,299 +0,0 @@ -package org.apache.phoenix.coprocessor; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.client.HTable; -import org.apache.phoenix.end2end.ParallelStatsDisabledIT; -import org.apache.phoenix.exception.SQLExceptionCode; -import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; -import org.apache.phoenix.schema.PColumn; -import org.apache.phoenix.schema.PTable; -import org.apache.phoenix.schema.TableNotFoundException; -import org.apache.phoenix.util.PhoenixRuntime; -import org.junit.Test; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - -/** - * 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. - */ -public class MetaDataEndpointImplTest extends ParallelStatsDisabledIT { - private final TableName catalogTable = TableName.valueOf(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES); - private final TableName linkTable = TableName.valueOf(PhoenixDatabaseMetaData.SYSTEM_CHILD_LINK_NAME_BYTES); - - /* - The tree structure is as follows: Where ParentTable is the Base Table - and all children are views and child views respectively. - - ParentTable - / \ - leftChild rightChild - / - leftGrandChild - */ - - @Test - public void testGettingChildrenAndParentViews() throws Exception { - String baseTable = generateUniqueName(); - String leftChild = generateUniqueName(); - String rightChild = generateUniqueName(); - String leftGrandChild = generateUniqueName(); - Connection conn = DriverManager.getConnection(getUrl()); - String ddlFormat = - "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " - + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; - conn.createStatement().execute(ddlFormat); - - conn.createStatement().execute("CREATE VIEW " + rightChild + " AS SELECT * FROM " + baseTable); - conn.createStatement().execute("CREATE VIEW " + leftChild + " (carrier VARCHAR) AS SELECT * FROM " + baseTable); - conn.createStatement().execute("CREATE VIEW " + leftGrandChild + " (dropped_calls BIGINT) AS SELECT * FROM " + leftChild); - - PTable table = PhoenixRuntime.getTable(conn, baseTable.toUpperCase()); - PTable rightChildTable = PhoenixRuntime.getTable(conn, rightChild.toUpperCase()); - System.err.println(rightChildTable); - - TableViewFinderResult childViews = new TableViewFinderResult(); - ViewFinder.findAllRelatives(getTable(linkTable), HConstants.EMPTY_BYTE_ARRAY, table.getSchemaName().getBytes(), - table.getTableName().getBytes(), PTable.LinkType.CHILD_TABLE, childViews); - assertEquals(3, childViews.getLinks().size()); - - PTable childMostView = PhoenixRuntime.getTable(conn , leftGrandChild.toUpperCase()); - TableViewFinderResult parentViews = new TableViewFinderResult(); - ViewFinder - .findAllRelatives(getTable(catalogTable), HConstants.EMPTY_BYTE_ARRAY, childMostView.getSchemaName().getBytes(), - childMostView.getTableName().getBytes(), PTable.LinkType.PARENT_TABLE, parentViews); - // returns back everything but the parent table - should only return back the left_child and not the right child - assertEquals(1, parentViews.getLinks().size()); - // now lets check and make sure the columns are correct - assertColumnNamesEqual(PhoenixRuntime.getTable(conn, childMostView.getName().getString()), "PK2", "V1", "V2", "CARRIER", "DROPPED_CALLS"); - - } - - @Test - public void testGettingOneChild() throws Exception { - String baseTable = generateUniqueName(); - String leftChild = generateUniqueName(); - Connection conn = DriverManager.getConnection(getUrl()); - String ddlFormat = - "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " - + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; - conn.createStatement().execute(ddlFormat); - conn.createStatement().execute("CREATE VIEW " + leftChild + " (carrier VARCHAR) AS SELECT * FROM " + baseTable); - - - // now lets check and make sure the columns are correct - assertColumnNamesEqual(PhoenixRuntime.getTable(conn, leftChild.toUpperCase()), "PK2", "V1", "V2", "CARRIER"); - } - - @Test - public void testDroppingADerivedColumn() throws Exception { - String baseTable = generateUniqueName(); - String childView = generateUniqueName(); - Connection conn = DriverManager.getConnection(getUrl()); - String ddlFormat = "CREATE TABLE " + baseTable + " (A VARCHAR PRIMARY KEY, B VARCHAR, C VARCHAR)"; - conn.createStatement().execute(ddlFormat); - conn.createStatement().execute("CREATE VIEW " + childView + " (D VARCHAR) AS SELECT * FROM " + baseTable); - assertColumnNamesEqual(PhoenixRuntime.getTable(conn, childView.toUpperCase()), "A", "B", "C", "D"); - conn.createStatement().execute("ALTER VIEW " + childView + " DROP COLUMN C"); - - // now lets check and make sure the columns are correct - assertColumnNamesEqual(PhoenixRuntime.getTableNoCache(conn, childView.toUpperCase()), "A", "B", "D"); - - } - - @Test - public void testDroppingAColumn() throws Exception { - String baseTable = generateUniqueName(); - String childView = generateUniqueName(); - Connection conn = DriverManager.getConnection(getUrl()); - String ddlFormat = "CREATE TABLE " + baseTable + " (A VARCHAR PRIMARY KEY, B VARCHAR, C VARCHAR)"; - conn.createStatement().execute(ddlFormat); - conn.createStatement().execute("CREATE VIEW " + childView + " (D VARCHAR) AS SELECT * FROM " + baseTable); - assertColumnNamesEqual(PhoenixRuntime.getTable(conn, childView.toUpperCase()), "A", "B", "C", "D"); - conn.createStatement().execute("ALTER TABLE " + baseTable + " DROP COLUMN C"); - - // now lets check and make sure the columns are correct - assertColumnNamesEqual(PhoenixRuntime.getTableNoCache(conn, childView.toUpperCase()), "A", "B", "D"); - } - - @Test - public void testAlteringBaseColumns() throws Exception { - String baseTable = generateUniqueName(); - String leftChild = generateUniqueName(); - Connection conn = DriverManager.getConnection(getUrl()); - String ddlFormat = - "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " - + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; - conn.createStatement().execute(ddlFormat); - conn.createStatement().execute("CREATE VIEW " + leftChild + " (carrier VARCHAR) AS SELECT * FROM " + baseTable); - - // now lets check and make sure the columns are correct - PTable childPTable = PhoenixRuntime.getTable(conn, leftChild.toUpperCase()); - assertColumnNamesEqual(childPTable, "PK2", "V1", "V2", "CARRIER"); - - // now lets alter the base table by adding a column - conn.createStatement().execute("ALTER TABLE " + baseTable + " ADD V3 integer"); - - // make sure that column was added to the base table - PTable table = PhoenixRuntime.getTableNoCache(conn, baseTable.toUpperCase()); - assertColumnNamesEqual(table, "PK2", "V1", "V2", "V3"); - - - childPTable = PhoenixRuntime.getTableNoCache(conn, leftChild.toUpperCase()); - assertColumnNamesEqual(childPTable, "PK2", "V1", "V2", "V3", "CARRIER"); - } - - @Test - public void testAddingAColumnWithADifferentDefinition() throws Exception { - String baseTable = generateUniqueName(); - String view = generateUniqueName(); - Connection conn = DriverManager.getConnection(getUrl()); - String ddlFormat = - "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " - + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; - conn.createStatement().execute(ddlFormat); - conn.createStatement().execute("CREATE VIEW " + view + " (carrier BIGINT) AS SELECT * FROM " + baseTable); - Map<String, String> expected = new ImmutableMap.Builder<String, String>() - .put("PK2", "VARCHAR") - .put("V1", "VARCHAR") - .put("V2", "VARCHAR") - .put("CARRIER", "BIGINT") - .build(); - - assertColumnNamesAndDefinitionsEqual(PhoenixRuntime.getTable(conn , view.toUpperCase()), expected); - try { - conn.createStatement().execute("ALTER TABLE " + baseTable + " ADD carrier VARCHAR"); - } - catch(SQLException e) { - assertEquals(SQLExceptionCode.CANNOT_MUTATE_TABLE.getErrorCode(), e.getErrorCode()); - } - - Map<String, String> expectedBaseTableColumns = new ImmutableMap.Builder<String, String>() - .put("PK2", "VARCHAR") - .put("V1", "VARCHAR") - .put("V2", "VARCHAR") - .build(); - - assertColumnNamesAndDefinitionsEqual(PhoenixRuntime.getTable(conn , baseTable.toUpperCase()), expectedBaseTableColumns); - - // the view column "CARRIER" should still be unchanged - Map<String, String> expectedViewColumnDefinition = new ImmutableMap.Builder<String, String>() - .put("PK2", "VARCHAR") - .put("V1", "VARCHAR") - .put("V2", "VARCHAR") - .put("CARRIER", "BIGINT") - .build(); - - assertColumnNamesAndDefinitionsEqual(PhoenixRuntime.getTable(conn , view.toUpperCase()), expectedViewColumnDefinition); - } - - public void testDropCascade() throws Exception { - String baseTable = generateUniqueName(); - String child = generateUniqueName(); - String grandChild = generateUniqueName(); - Connection conn = DriverManager.getConnection(getUrl()); - String ddlFormat = - "CREATE TABLE IF NOT EXISTS " + baseTable + " (" + " PK2 VARCHAR NOT NULL, V1 VARCHAR, V2 VARCHAR " - + " CONSTRAINT NAME_PK PRIMARY KEY (PK2)" + " )"; - conn.createStatement().execute(ddlFormat); - conn.createStatement().execute("CREATE VIEW " + child + " (A VARCHAR) AS SELECT * FROM " + baseTable); - conn.createStatement().execute("CREATE VIEW " + grandChild + " (B VARCHAR) AS SELECT * FROM " + child); - - PTable childMostView = PhoenixRuntime.getTable(conn , child.toUpperCase()); - // now lets check and make sure the columns are correct - PTable grandChildPTable = PhoenixRuntime.getTable(conn, childMostView.getName().getString()); - assertColumnNamesEqual(grandChildPTable, "PK2", "V1", "V2", "A"); - - // now lets drop the parent table - conn.createStatement().execute("DROP TABLE " + baseTable + " CASCADE"); - - // the tables should no longer exist - try { - PhoenixRuntime.getTableNoCache(conn, baseTable); - fail(); - } - catch(TableNotFoundException e){} - try { - PhoenixRuntime.getTableNoCache(conn, child); - fail(); - } - catch(TableNotFoundException e){} - try { - PhoenixRuntime.getTableNoCache(conn, grandChild); - fail(); - } - catch(TableNotFoundException e){} - } - - @Test - public void testWhereClause() throws Exception { - Connection conn = DriverManager.getConnection(getUrl()); - String baseTableName = generateUniqueName(); - String childViewName = generateUniqueName(); - String grandChildViewName = generateUniqueName(); - String baseTableDdl = "CREATE TABLE " + baseTableName + " (" + - "A0 CHAR(1) NOT NULL PRIMARY KEY," + - "A1 CHAR(1), A2 CHAR (1))"; - conn.createStatement().execute(baseTableDdl); - conn.createStatement().execute( - "CREATE VIEW " + childViewName + " AS SELECT * FROM " + baseTableName + " WHERE A1 = 'X'"); - conn.createStatement().execute( - "CREATE VIEW " + grandChildViewName + " AS SELECT * FROM " + childViewName + " WHERE A2 = 'Y'"); - - PTable childViewTable = PhoenixRuntime.getTableNoCache(conn, childViewName); - PTable grandChildViewTable = PhoenixRuntime.getTableNoCache(conn, grandChildViewName); - - assertNotNull(childViewTable.getColumnForColumnName("A1").getViewConstant()); - assertNotNull(grandChildViewTable.getColumnForColumnName("A1").getViewConstant()); - assertNotNull(grandChildViewTable.getColumnForColumnName("A2").getViewConstant()); - } - - private void assertColumnNamesEqual(PTable table, String... cols) { - List<String> actual = Lists.newArrayList(); - for (PColumn column : table.getColumns()) { - actual.add(column.getName().getString().trim()); - } - List<String> expected = Arrays.asList(cols); - assertEquals(Joiner.on(", ").join(expected), Joiner.on(", ").join(actual)); - } - - private void assertColumnNamesAndDefinitionsEqual(PTable table, Map<String, String> expected) { - Map<String, String> actual = Maps.newHashMap(); - for (PColumn column : table.getColumns()) { - actual.put(column.getName().getString().trim(), column.getDataType().getSqlTypeName()); - } - assertEquals(expected, actual); - } - - private HTable getTable(TableName catalogTable) throws IOException { - return new HTable(utility.getConfiguration(), catalogTable); - } - -} \ No newline at end of file