You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ya...@apache.org on 2020/01/17 22:03:30 UTC
[phoenix] branch master updated: PHOENIX-5671 Add tests for ViewUtil
This is an automated email from the ASF dual-hosted git repository.
yanxinyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/master by this push:
new 422c265 PHOENIX-5671 Add tests for ViewUtil
422c265 is described below
commit 422c265f8483cf7a9b8f473aba83a1c7897852ba
Author: Xinyi Yan <xy...@salesforce.com>
AuthorDate: Wed Jan 15 11:30:34 2020 -0800
PHOENIX-5671 Add tests for ViewUtil
Signed-off-by: Xinyi Yan <ya...@apache.org>
---
.../org/apache/phoenix/end2end/ViewUtilIT.java | 336 +++++++++++++++++++++
1 file changed, 336 insertions(+)
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewUtilIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewUtilIT.java
new file mode 100644
index 0000000..634ff72
--- /dev/null
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewUtilIT.java
@@ -0,0 +1,336 @@
+/*
+ * 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.phoenix.end2end;
+
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.Table;
+import org.apache.phoenix.jdbc.PhoenixConnection;
+import org.apache.phoenix.util.SchemaUtil;
+import org.apache.phoenix.util.TableViewFinderResult;
+import org.apache.phoenix.schema.PTable;
+import org.apache.phoenix.util.PhoenixRuntime;
+import org.apache.phoenix.util.PropertiesUtil;
+import org.apache.phoenix.util.ViewUtil;
+import org.junit.Test;
+
+import java.nio.charset.StandardCharsets;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.Properties;
+
+import static org.apache.phoenix.coprocessor.MetaDataProtocol.MIN_SPLITTABLE_SYSTEM_CATALOG;
+import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_LINK_HBASE_TABLE_NAME;
+import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+
+public class ViewUtilIT extends ParallelStatsDisabledIT {
+
+ @Test
+ public void testGetSystemTableForChildLinks() throws Exception {
+ assertEquals(SYSTEM_LINK_HBASE_TABLE_NAME, ViewUtil.getSystemTableForChildLinks(
+ MIN_SPLITTABLE_SYSTEM_CATALOG, config));
+
+ // lower version should also give CHILD_LINK table as server upgrade to advanced version
+ assertEquals(SYSTEM_LINK_HBASE_TABLE_NAME, ViewUtil.getSystemTableForChildLinks(
+ MIN_SPLITTABLE_SYSTEM_CATALOG - 1, config));
+ }
+
+ @Test
+ public void testHasChildViewsInGlobalViewCase() throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ TableName catalogOrChildTableName = ViewUtil.getSystemTableForChildLinks(0, config);
+ String schema = generateUniqueName();
+ byte[] schemaInBytes = schema.getBytes(StandardCharsets.UTF_8);
+ byte[] tenantIdInBytes = new byte[0];
+ String fullTableName = schema + "." + generateUniqueName();
+ String secondLevelViewName = schema + "." + generateUniqueName();
+ String thirdLevelViewName = schema + "." + generateUniqueName();
+ String leafViewName1 = schema + "." + generateUniqueName();
+ String leafViewName2 = schema + "." + generateUniqueName();
+
+ String tableDDLQuery = "CREATE TABLE " + fullTableName + " (A BIGINT PRIMARY KEY, B BIGINT)";
+ String viewDDLQuery = "CREATE VIEW %s AS SELECT * FROM %s";
+
+ try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
+ conn.createStatement().execute(tableDDLQuery);
+ conn.createStatement().execute(
+ String.format(viewDDLQuery, secondLevelViewName, fullTableName));
+ conn.createStatement().execute(
+ String.format(viewDDLQuery, leafViewName1, secondLevelViewName));
+ conn.createStatement().execute(
+ String.format(viewDDLQuery, thirdLevelViewName, secondLevelViewName));
+ conn.createStatement().execute(
+ String.format(viewDDLQuery, leafViewName2, thirdLevelViewName));
+
+ try (PhoenixConnection phoenixConnection =
+ DriverManager.getConnection(getUrl(), props).unwrap(PhoenixConnection.class)) {
+ Table catalogOrChildTable = phoenixConnection.getQueryServices().getTable(
+ SchemaUtil.getPhysicalName(catalogOrChildTableName.toBytes(),
+ phoenixConnection.getQueryServices().getProps()).getName());
+
+ assertTrue(ViewUtil.hasChildViews(catalogOrChildTable,
+ tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(fullTableName).
+ getBytes(StandardCharsets.UTF_8),
+ System.currentTimeMillis()));
+ assertTrue(ViewUtil.hasChildViews(catalogOrChildTable,
+ tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(secondLevelViewName).
+ getBytes(StandardCharsets.UTF_8)
+ , System.currentTimeMillis()));
+ assertTrue(ViewUtil.hasChildViews(catalogOrChildTable,
+ tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(thirdLevelViewName).
+ getBytes(StandardCharsets.UTF_8),
+ System.currentTimeMillis()));
+ assertFalse(ViewUtil.hasChildViews(catalogOrChildTable,
+ tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(leafViewName1).
+ getBytes(StandardCharsets.UTF_8),
+ System.currentTimeMillis()));
+ assertFalse(ViewUtil.hasChildViews(catalogOrChildTable,
+ tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(leafViewName2).
+ getBytes(StandardCharsets.UTF_8),
+ System.currentTimeMillis()));
+ }
+ }
+ }
+
+ @Test
+ public void testHasChildViewsInTenantViewCase() throws Exception {
+ String tenantId = generateUniqueName();
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ Properties tenantProps = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ tenantProps.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId);
+ TableName catalogOrChildTableName = ViewUtil.getSystemTableForChildLinks(0, config);
+ String schema = generateUniqueName();
+ byte[] schemaInBytes = schema.getBytes(StandardCharsets.UTF_8);
+ byte[] tenantIdInBytes = tenantId.getBytes(StandardCharsets.UTF_8);
+ byte[] emptyTenantIdInBytes = new byte[0];
+ String multiTenantTableName = schema + "." + generateUniqueName();
+ String globalViewName = schema + "." + generateUniqueName();
+ String tenantViewOnMultiTenantTable1 = schema + "." + generateUniqueName();
+ String viewName2 = generateUniqueName();
+ String tenantViewOnMultiTenantTable2 = schema + "." + viewName2;
+ String tenantViewIndex = viewName2 + "_INDEX";
+ String tenantViewOnGlobalView = schema + "." + generateUniqueName();
+
+ String multiTenantTableDDL = "CREATE TABLE " + multiTenantTableName +
+ "(TENANT_ID CHAR(10) NOT NULL, ID CHAR(10) NOT NULL, NUM BIGINT " +
+ "CONSTRAINT PK PRIMARY KEY (TENANT_ID, ID)) MULTI_TENANT=true";
+ String globalViewDDL = "CREATE VIEW " + globalViewName + "(PK1 BIGINT, PK2 BIGINT) " +
+ "AS SELECT * FROM " + multiTenantTableName + " WHERE NUM > -1";
+ String viewDDL = "CREATE VIEW %s AS SELECT * FROM %s";
+ String viewIndexDDL = "CREATE INDEX " + tenantViewIndex + " ON " +
+ tenantViewOnMultiTenantTable2 + "(NUM DESC) INCLUDE (ID)";
+
+ try (Connection conn = DriverManager.getConnection(getUrl())) {
+ conn.createStatement().execute(multiTenantTableDDL);
+ conn.createStatement().execute(globalViewDDL);
+
+ try (Connection tenantConn = DriverManager.getConnection(getUrl(), tenantProps)) {
+ tenantConn.createStatement().execute(
+ String.format(viewDDL, tenantViewOnGlobalView, globalViewName));
+ tenantConn.createStatement().execute(
+ String.format(viewDDL, tenantViewOnMultiTenantTable1, multiTenantTableName));
+ tenantConn.createStatement().execute(
+ String.format(viewDDL, tenantViewOnMultiTenantTable2, multiTenantTableName));
+ tenantConn.createStatement().execute(viewIndexDDL);
+ }
+
+ try (PhoenixConnection phoenixConnection = DriverManager.getConnection(getUrl(),
+ props).unwrap(PhoenixConnection.class)) {
+ Table catalogOrChildTable = phoenixConnection.getQueryServices().getTable(
+ SchemaUtil.getPhysicalName(catalogOrChildTableName.toBytes(),
+ phoenixConnection.getQueryServices().getProps()).getName());
+
+ assertTrue(ViewUtil.hasChildViews(catalogOrChildTable,
+ emptyTenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(multiTenantTableName).
+ getBytes(StandardCharsets.UTF_8),
+ System.currentTimeMillis()));
+ assertTrue(ViewUtil.hasChildViews(catalogOrChildTable,
+ emptyTenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(globalViewName).
+ getBytes(StandardCharsets.UTF_8)
+ , System.currentTimeMillis()));
+ assertFalse(ViewUtil.hasChildViews(catalogOrChildTable,
+ tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(tenantViewOnMultiTenantTable1).
+ getBytes(StandardCharsets.UTF_8),
+ System.currentTimeMillis()));
+ assertFalse(ViewUtil.hasChildViews(catalogOrChildTable,
+ tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(tenantViewOnMultiTenantTable2).
+ getBytes(StandardCharsets.UTF_8),
+ System.currentTimeMillis()));
+ assertFalse(ViewUtil.hasChildViews(catalogOrChildTable,
+ tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(tenantViewOnGlobalView).
+ getBytes(StandardCharsets.UTF_8),
+ System.currentTimeMillis()));
+ }
+ }
+ }
+
+ @Test
+ public void testFindAllRelativesForGlobalConnection() throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ TableName catalogOrChildTableName = ViewUtil.getSystemTableForChildLinks(0, config);
+ String schema = generateUniqueName();
+ byte[] schemaInBytes = schema.getBytes(StandardCharsets.UTF_8);
+ byte[] tenantIdInBytes = new byte[0];
+ String fullTableName = schema + "." + generateUniqueName();
+ String middleLevelViewName = schema + "." + generateUniqueName();
+ String leafViewName1 = schema + "." + generateUniqueName();
+ String leafViewName2 = schema + "." + generateUniqueName();
+ int NUMBER_OF_VIEWS = 3;
+
+ String tableDDLQuery = "CREATE TABLE " + fullTableName + " (A BIGINT PRIMARY KEY, B BIGINT)";
+ String viewDDLQuery = "CREATE VIEW %s AS SELECT * FROM %s";
+
+ try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
+ conn.createStatement().execute(tableDDLQuery);
+ conn.createStatement().execute(
+ String.format(viewDDLQuery, middleLevelViewName, fullTableName));
+ conn.createStatement().execute(
+ String.format(viewDDLQuery, leafViewName1, middleLevelViewName));
+ conn.createStatement().execute(
+ String.format(viewDDLQuery, leafViewName2, middleLevelViewName));
+
+ try (PhoenixConnection phoenixConnection = DriverManager.getConnection(getUrl(),
+ props).unwrap(PhoenixConnection.class)) {
+ Table catalogOrChildTable = phoenixConnection.getQueryServices().getTable(
+ SchemaUtil.getPhysicalName(catalogOrChildTableName.toBytes(),
+ phoenixConnection.getQueryServices().getProps()).getName());
+
+ TableViewFinderResult result = new TableViewFinderResult();
+ ViewUtil.findAllRelatives(catalogOrChildTable, tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(fullTableName).
+ getBytes(StandardCharsets.UTF_8),
+ PTable.LinkType.CHILD_TABLE, result);
+ assertEquals(NUMBER_OF_VIEWS, result.getLinks().size());
+
+ result = new TableViewFinderResult();
+ ViewUtil.findAllRelatives(catalogOrChildTable, tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(middleLevelViewName).
+ getBytes(StandardCharsets.UTF_8),
+ PTable.LinkType.CHILD_TABLE, result);
+ assertEquals(2, result.getLinks().size());
+
+ result = new TableViewFinderResult();
+ ViewUtil.findAllRelatives(catalogOrChildTable, tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(leafViewName1).
+ getBytes(StandardCharsets.UTF_8),
+ PTable.LinkType.CHILD_TABLE, result);
+ assertEquals(0, result.getLinks().size());
+
+ result = new TableViewFinderResult();
+ ViewUtil.findAllRelatives(catalogOrChildTable, tenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(leafViewName2).
+ getBytes(StandardCharsets.UTF_8),
+ PTable.LinkType.CHILD_TABLE, result);
+ assertEquals(0, result.getLinks().size());
+ }
+ }
+ }
+
+ @Test
+ public void testFindAllRelativesForTenantConnection() throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ String tenantId1 = generateUniqueName();
+ Properties tenantProps1 = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ tenantProps1.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId1);
+ String tenantId2 = generateUniqueName();
+ Properties tenantProps2 = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ tenantProps2.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId2);
+ TableName catalogOrChildTableName = ViewUtil.getSystemTableForChildLinks(0, config);
+ String schema = generateUniqueName();
+ byte[] schemaInBytes = schema.getBytes(StandardCharsets.UTF_8);
+ byte[] tenantId1InBytes = tenantId1.getBytes(StandardCharsets.UTF_8);
+ byte[] tenantId2InBytes = tenantId2.getBytes(StandardCharsets.UTF_8);
+ byte[] emptyTenantIdInBytes = new byte[0];
+ String multiTenantTableName = schema + "." + generateUniqueName();
+ String tenant1MiddleLevelViewOnMultiTenantTable = schema + "." + generateUniqueName();
+ String tenant1LeafViewName = schema + "." + generateUniqueName();
+ String tenant2LeafViewName = schema + "." + generateUniqueName();
+ int NUMBER_OF_VIEWS = 3;
+
+ String multiTenantTableDDL = "CREATE TABLE " + multiTenantTableName +
+ "(TENANT_ID CHAR(10) NOT NULL, ID CHAR(10) NOT NULL, NUM BIGINT " +
+ "CONSTRAINT PK PRIMARY KEY (TENANT_ID, ID)) MULTI_TENANT=true";
+ String viewDDL = "CREATE VIEW %s AS SELECT * FROM %s";
+
+ try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
+ conn.createStatement().execute(multiTenantTableDDL);
+
+ try (Connection tenantConn = DriverManager.getConnection(getUrl(), tenantProps1)) {
+ tenantConn.createStatement().execute(
+ String.format(viewDDL, tenant1MiddleLevelViewOnMultiTenantTable,
+ multiTenantTableName));
+ tenantConn.createStatement().execute(
+ String.format(viewDDL, tenant1LeafViewName,
+ tenant1MiddleLevelViewOnMultiTenantTable));
+ }
+ try (Connection tenantConn = DriverManager.getConnection(getUrl(), tenantProps2)) {
+ tenantConn.createStatement().execute(
+ String.format(viewDDL, tenant2LeafViewName, multiTenantTableName));
+ }
+
+ try (PhoenixConnection phoenixConnection = DriverManager.getConnection(getUrl(),
+ props).unwrap(PhoenixConnection.class)) {
+ Table catalogOrChildTable = phoenixConnection.getQueryServices().getTable(
+ SchemaUtil.getPhysicalName(catalogOrChildTableName.toBytes(),
+ phoenixConnection.getQueryServices().getProps()).getName());
+
+ TableViewFinderResult result = new TableViewFinderResult();
+ ViewUtil.findAllRelatives(catalogOrChildTable, emptyTenantIdInBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(multiTenantTableName).
+ getBytes(StandardCharsets.UTF_8),
+ PTable.LinkType.CHILD_TABLE, result);
+ assertEquals(NUMBER_OF_VIEWS, result.getLinks().size());
+
+ result = new TableViewFinderResult();
+ ViewUtil.findAllRelatives(catalogOrChildTable, tenantId1InBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(
+ tenant1MiddleLevelViewOnMultiTenantTable).
+ getBytes(StandardCharsets.UTF_8),
+ PTable.LinkType.CHILD_TABLE, result);
+ assertEquals(1, result.getLinks().size());
+
+ result = new TableViewFinderResult();
+ ViewUtil.findAllRelatives(catalogOrChildTable, tenantId1InBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(tenant1LeafViewName).
+ getBytes(StandardCharsets.UTF_8),
+ PTable.LinkType.CHILD_TABLE, result);
+ assertEquals(0, result.getLinks().size());
+
+ result = new TableViewFinderResult();
+ ViewUtil.findAllRelatives(catalogOrChildTable, tenantId2InBytes, schemaInBytes,
+ SchemaUtil.getTableNameFromFullName(tenant2LeafViewName).
+ getBytes(StandardCharsets.UTF_8),
+ PTable.LinkType.CHILD_TABLE, result);
+ assertEquals(0, result.getLinks().size());
+ }
+ }
+ }
+}