http://git-wip-us.apache.org/repos/asf/phoenix/blob/7e432be7/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java index 8c804bb..68fcae3 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java @@ -30,6 +30,8 @@ import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Properties; @@ -73,19 +75,38 @@ import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; +import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.StringUtil; import org.apache.phoenix.util.TestUtil; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; import com.google.common.collect.Maps; +@RunWith(Parameterized.class) public class LocalIndexIT extends BaseHBaseManagedTimeIT { private static CountDownLatch latch1 = new CountDownLatch(1); private static CountDownLatch latch2 = new CountDownLatch(1); private static final int WAIT_TIME_SECONDS = 60; + private String schemaName="TEST"; + private boolean isNamespaceMapped; + private String tableName = schemaName + ".T"; + private String indexTableName = schemaName + ".I"; + private String indexName = "I"; + private String indexPhysicalTableName; + private TableName physicalTableName; + public LocalIndexIT(boolean isNamespaceMapped) { + this.isNamespaceMapped = isNamespaceMapped; + this.physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped); + this.indexPhysicalTableName = Bytes + .toString(MetaDataUtil.getLocalIndexPhysicalName(physicalTableName.getName())); + } + @BeforeClass @Shadower(classBeingShadowed = BaseHBaseManagedTimeIT.class) public static void doSetup() throws Exception { @@ -97,7 +118,10 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { } private void createBaseTable(String tableName, Integer saltBuckets, String splits) throws SQLException { - Connection conn = DriverManager.getConnection(getUrl()); + Connection conn = getConnection(); + if (isNamespaceMapped) { + conn.createStatement().execute("CREATE SCHEMA IF NOT EXISTS " + schemaName); + } String ddl = "CREATE TABLE " + tableName + " (t_id VARCHAR NOT NULL,\n" + "k1 INTEGER NOT NULL,\n" + "k2 INTEGER NOT NULL,\n" + @@ -109,79 +133,94 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { conn.createStatement().execute(ddl); conn.close(); } - + + @Parameters(name = "isNamespaceMapped = {0}") + public static Collection<Boolean> data() { + return Arrays.asList(true, false); + } + @Test public void testLocalIndexRoundTrip() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, null); + createBaseTable(tableName, null, null); Connection conn1 = DriverManager.getConnection(getUrl()); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME).next(); - PTable localIndex = conn1.unwrap(PhoenixConnection.class).getTable(new PTableKey(null,TestUtil.DEFAULT_INDEX_TABLE_NAME)); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().executeQuery("SELECT * FROM " + tableName).next(); + PTable localIndex = conn1.unwrap(PhoenixConnection.class).getTable(new PTableKey(null, indexTableName)); assertEquals(IndexType.LOCAL, localIndex.getIndexType()); assertNotNull(localIndex.getViewIndexId()); } - + @Test public void testLocalIndexCreationWithSplitsShouldFail() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, null); - Connection conn1 = DriverManager.getConnection(getUrl()); - Connection conn2 = DriverManager.getConnection(getUrl()); + createBaseTable(tableName, null, null); + Connection conn1 = getConnection(); + Connection conn2 = getConnection(); try { - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"+" split on (1,2,3)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"+" split on (1,2,3)"); fail("Local index cannot be pre-split"); } catch (SQLException e) { } try { - conn2.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME).next(); - conn2.unwrap(PhoenixConnection.class).getTable(new PTableKey(null,TestUtil.DEFAULT_INDEX_TABLE_NAME)); + conn2.createStatement().executeQuery("SELECT * FROM " + tableName).next(); + conn2.unwrap(PhoenixConnection.class).getTable(new PTableKey(null,indexName)); fail("Local index should not be created."); } catch (TableNotFoundException e) { } } @Test public void testLocalIndexCreationWithSaltingShouldFail() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, null); - Connection conn1 = DriverManager.getConnection(getUrl()); - Connection conn2 = DriverManager.getConnection(getUrl()); + createBaseTable(tableName, null, null); + Connection conn1 = getConnection(); + Connection conn2 = getConnection(); try { - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"+" salt_buckets=16"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"+" salt_buckets=16"); fail("Local index cannot be salted."); } catch (SQLException e) { } try { - conn2.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME).next(); - conn2.unwrap(PhoenixConnection.class).getTable(new PTableKey(null,TestUtil.DEFAULT_INDEX_TABLE_NAME)); + conn2.createStatement().executeQuery("SELECT * FROM " + tableName).next(); + conn2.unwrap(PhoenixConnection.class).getTable(new PTableKey(null,indexName)); fail("Local index should not be created."); } catch (TableNotFoundException e) { } } @Test public void testLocalIndexTableRegionSplitPolicyAndSplitKeys() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null,"('e','i','o')"); - Connection conn1 = DriverManager.getConnection(getUrl()); - Connection conn2 = DriverManager.getConnection(getUrl()); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn2.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME).next(); + createBaseTable(tableName, null,"('e','i','o')"); + Connection conn1 = getConnection(); + Connection conn2 = getConnection(); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn2.createStatement().executeQuery("SELECT * FROM " + tableName).next(); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - HTableDescriptor htd = admin.getTableDescriptor(TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME))); + HTableDescriptor htd = admin + .getTableDescriptor(Bytes.toBytes(indexPhysicalTableName)); assertEquals(IndexRegionSplitPolicy.class.getName(), htd.getValue(HTableDescriptor.SPLIT_POLICY)); - try (HTable userTable = new HTable(admin.getConfiguration(),TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME))) { - try (HTable indexTable = new HTable(admin.getConfiguration(),TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)))) { - assertArrayEquals("Both user table and index table should have same split keys.", userTable.getStartKeys(), indexTable.getStartKeys()); + try (HTable userTable = new HTable(admin.getConfiguration(), + SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped))) { + try (HTable indexTable = new HTable(admin.getConfiguration(), Bytes.toBytes(indexPhysicalTableName))) { + assertArrayEquals("Both user table and index table should have same split keys.", + userTable.getStartKeys(), indexTable.getStartKeys()); } } } + + public Connection getConnection() throws SQLException{ + Properties props = new Properties(); + props.put(QueryServices.DROP_METADATA_ATTRIB, Boolean.toString(true)); + props.put(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(isNamespaceMapped)); + return DriverManager.getConnection(getUrl(),props); + } @Test public void testDropLocalIndexTable() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, null); - Connection conn1 = DriverManager.getConnection(getUrl()); - Connection conn2 = DriverManager.getConnection(getUrl()); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn2.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME).next(); + createBaseTable(tableName, null, null); + Connection conn1 = getConnection(); + Connection conn2 = getConnection(); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn2.createStatement().executeQuery("SELECT * FROM " + tableName).next(); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - assertTrue("Local index table should be present.", admin.tableExists(TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)))); - conn1.createStatement().execute("DROP TABLE "+ TestUtil.DEFAULT_DATA_TABLE_NAME); + assertTrue("Local index table should be present.", admin.tableExists(indexPhysicalTableName)); + conn1.createStatement().execute("DROP TABLE "+ tableName); admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - assertFalse("Local index table should be deleted.", admin.tableExists(TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)))); + assertFalse("Local index table should be deleted.", admin.tableExists(indexPhysicalTableName)); ResultSet rs = conn2.createStatement().executeQuery("SELECT " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + "," + PhoenixDatabaseMetaData.SEQUENCE_NAME @@ -191,19 +230,19 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testPutsToLocalIndexTable() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); - Connection conn1 = DriverManager.getConnection(getUrl()); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('f',1,2,3,'z')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('q',3,1,1,'c')"); + createBaseTable(tableName, null, "('e','i','o')"); + Connection conn1 = getConnection(); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('f',1,2,3,'z')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('q',3,1,1,'c')"); conn1.commit(); - ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_INDEX_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + indexTableName); assertTrue(rs.next()); assertEquals(4, rs.getInt(1)); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - HTable indexTable = new HTable(admin.getConfiguration() ,TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME))); + HTable indexTable = new HTable(admin.getConfiguration(), indexPhysicalTableName); Pair<byte[][], byte[][]> startEndKeys = indexTable.getStartEndKeys(); byte[][] startKeys = startEndKeys.getFirst(); byte[][] endKeys = startEndKeys.getSecond(); @@ -224,19 +263,19 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testBuildIndexWhenUserTableAlreadyHasData() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); + createBaseTable(tableName, null, "('e','i','o')"); Connection conn1 = DriverManager.getConnection(getUrl()); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('f',1,2,3,'z')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('q',3,1,1,'c')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('f',1,2,3,'z')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('q',3,1,1,'c')"); conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_INDEX_TABLE_NAME); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + indexTableName); assertTrue(rs.next()); assertEquals(4, rs.getInt(1)); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - HTable indexTable = new HTable(admin.getConfiguration() ,TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME))); + HTable indexTable = new HTable(admin.getConfiguration(),Bytes.toBytes(indexPhysicalTableName)); Pair<byte[][], byte[][]> startEndKeys = indexTable.getStartEndKeys(); byte[][] startKeys = startEndKeys.getFirst(); byte[][] endKeys = startEndKeys.getSecond(); @@ -257,30 +296,30 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexScan() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); + createBaseTable(tableName, null, "('e','i','o')"); Connection conn1 = DriverManager.getConnection(getUrl()); try{ - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('a',1,2,5,'y')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('f',1,2,3,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('e',1,2,3,'b')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('q',3,1,1,'c')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('a',1,2,5,'y')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('f',1,2,3,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('e',1,2,3,'b')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('q',3,1,1,'c')"); conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); - ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_INDEX_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + indexTableName); assertTrue(rs.next()); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - int numRegions = admin.getTableRegions(TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME)).size(); + int numRegions = admin.getTableRegions(physicalTableName).size(); - String query = "SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME +" where v1 like 'a%'"; + String query = "SELECT * FROM " + tableName +" where v1 like 'a%'"; rs = conn1.createStatement().executeQuery("EXPLAIN "+ query); assertEquals( "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME) + " [-32768,'a'] - [-32768,'b']\n" + + indexPhysicalTableName + " [-32768,'a'] - [-32768,'b']\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); @@ -299,12 +338,12 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { assertEquals("a", rs.getString("v1")); assertEquals(2, rs.getInt("k3")); assertFalse(rs.next()); - query = "SELECT t_id, k1, k2,V1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME +" where v1='a'"; + query = "SELECT t_id, k1, k2,V1 FROM " + tableName +" where v1='a'"; rs = conn1.createStatement().executeQuery("EXPLAIN "+ query); assertEquals( "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME) + " [-32768,'a']\n" + + indexPhysicalTableName + " [-32768,'a']\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); @@ -319,14 +358,12 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { assertEquals(2, rs.getInt("k1")); assertEquals(4, rs.getInt("k2")); assertFalse(rs.next()); - query = "SELECT t_id, k1, k2,V1, k3 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME +" where v1<='z' order by k3"; + query = "SELECT t_id, k1, k2,V1, k3 FROM " + tableName +" where v1<='z' order by k3"; rs = conn1.createStatement().executeQuery("EXPLAIN "+ query); - assertEquals( - "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME) + " [-32768,*] - [-32768,'z']\n" - + " SERVER FILTER BY FIRST KEY ONLY\n" - + " SERVER SORTED BY [\"K3\"]\n" + - "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); + assertEquals("CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " + indexPhysicalTableName + + " [-32768,*] - [-32768,'z']\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + + " SERVER SORTED BY [\"K3\"]\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); rs = conn1.createStatement().executeQuery(query); assertTrue(rs.next()); @@ -343,12 +380,12 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { assertEquals(5, rs.getInt("k3")); assertFalse(rs.next()); - query = "SELECT t_id, k1, k2,v1 from " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " order by V1,t_id"; + query = "SELECT t_id, k1, k2,v1 from " + tableName + " order by V1,t_id"; rs = conn1.createStatement().executeQuery("EXPLAIN " + query); assertEquals( "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)+" [-32768]\n" + + indexPhysicalTableName +" [-32768]\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); @@ -391,28 +428,28 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexScanJoinColumnsFromDataTable() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); - Connection conn1 = DriverManager.getConnection(getUrl()); + createBaseTable(tableName, null, "('e','i','o')"); + Connection conn1 = getConnection(); try{ - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('f',1,2,3,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('q',3,1,1,'c')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('f',1,2,3,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('q',3,1,1,'c')"); conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); - ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_INDEX_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + indexTableName); assertTrue(rs.next()); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - int numRegions = admin.getTableRegions(TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME)).size(); + int numRegions = admin.getTableRegions(physicalTableName).size(); - String query = "SELECT t_id, k1, k2, k3, V1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME +" where v1='a'"; + String query = "SELECT t_id, k1, k2, k3, V1 FROM " + tableName +" where v1='a'"; rs = conn1.createStatement().executeQuery("EXPLAIN "+ query); assertEquals( "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME) + " [-32768,'a']\n" + + indexPhysicalTableName + " [-32768,'a']\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); @@ -430,12 +467,12 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { assertEquals(2, rs.getInt("k3")); assertFalse(rs.next()); - query = "SELECT t_id, k1, k2, k3, V1 from " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " where v1<='z' order by V1,t_id"; + query = "SELECT t_id, k1, k2, k3, V1 from " + tableName + " where v1<='z' order by V1,t_id"; rs = conn1.createStatement().executeQuery("EXPLAIN " + query); assertEquals( "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)+" [-32768,*] - [-32768,'z']\n" + + indexPhysicalTableName +" [-32768,*] - [-32768,'z']\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); @@ -466,12 +503,12 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { assertEquals(4, rs.getInt("k3")); assertEquals("z", rs.getString("V1")); - query = "SELECT t_id, V1, k3 from " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " where v1 <='z' group by v1,t_id, k3"; + query = "SELECT t_id, V1, k3 from " + tableName + " where v1 <='z' group by v1,t_id, k3"; rs = conn1.createStatement().executeQuery("EXPLAIN " + query); assertEquals( "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)+" [-32768,*] - [-32768,'z']\n" + + indexPhysicalTableName +" [-32768,*] - [-32768,'z']\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + " SERVER AGGREGATE INTO DISTINCT ROWS BY [\"V1\", \"T_ID\", \"K3\"]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); @@ -494,12 +531,12 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { assertEquals(4, rs.getInt("k3")); assertEquals("z", rs.getString("V1")); - query = "SELECT v1,sum(k3) from " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME + " where v1 <='z' group by v1 order by v1"; + query = "SELECT v1,sum(k3) from " + tableName + " where v1 <='z' group by v1 order by v1"; rs = conn1.createStatement().executeQuery("EXPLAIN " + query); assertEquals( "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)+" [-32768,*] - [-32768,'z']\n" + + indexPhysicalTableName +" [-32768,*] - [-32768,'z']\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + " SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"V1\"]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); @@ -507,7 +544,7 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { PhoenixStatement stmt = conn1.createStatement().unwrap(PhoenixStatement.class); rs = stmt.executeQuery(query); QueryPlan plan = stmt.getQueryPlan(); - assertEquals(TestUtil.DEFAULT_INDEX_TABLE_NAME, plan.getContext().getCurrentTable().getTable().getName().getString()); + assertEquals(indexTableName, plan.getContext().getCurrentTable().getTable().getName().getString()); assertEquals(BaseScannerRegionObserver.KEY_ORDERED_GROUP_BY_EXPRESSIONS, plan.getGroupBy().getScanAttribName()); assertTrue(rs.next()); assertEquals("a", rs.getString(1)); @@ -525,36 +562,37 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testIndexPlanSelectionIfBothGlobalAndLocalIndexesHasSameColumnsAndOrder() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); - Connection conn1 = DriverManager.getConnection(getUrl()); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('f',1,2,3,'a')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('j',2,4,3,'a')"); - conn1.createStatement().execute("UPSERT INTO "+TestUtil.DEFAULT_DATA_TABLE_NAME+" values('q',3,1,1,'c')"); + createBaseTable(tableName, null, "('e','i','o')"); + Connection conn1 = getConnection(); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('f',1,2,3,'a')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('j',2,4,3,'a')"); + conn1.createStatement().execute("UPSERT INTO "+tableName+" values('q',3,1,1,'c')"); conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("CREATE INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + "2" + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - String query = "SELECT t_id, k1, k2,V1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME +" where v1='a'"; + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("CREATE INDEX " + indexName + "2" + " ON " + tableName + "(v1)"); + String query = "SELECT t_id, k1, k2,V1 FROM " + tableName +" where v1='a'"; ResultSet rs1 = conn1.createStatement().executeQuery("EXPLAIN "+ query); - assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + TestUtil.DEFAULT_INDEX_TABLE_NAME + "2" + " ['a']\n" - + " SERVER FILTER BY FIRST KEY ONLY",QueryUtil.getExplainPlan(rs1)); + assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + + SchemaUtil.getPhysicalTableName(Bytes.toBytes(indexTableName), isNamespaceMapped) + "2" + " ['a']\n" + + " SERVER FILTER BY FIRST KEY ONLY", QueryUtil.getExplainPlan(rs1)); conn1.close(); } @Test public void testDropLocalIndexShouldDeleteDataFromLocalIndexTable() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); + createBaseTable(tableName, null, "('e','i','o')"); Connection conn1 = DriverManager.getConnection(getUrl()); try { - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('f',1,2,3,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('q',3,1,1,'c')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('f',1,2,3,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('q',3,1,1,'c')"); conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("DROP INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("DROP INDEX " + indexName + " ON " + tableName); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - HTable indexTable = new HTable(admin.getConfiguration() ,TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME))); + HTable indexTable = new HTable(admin.getConfiguration() ,TableName.valueOf(MetaDataUtil.getLocalIndexTableName(tableName))); Pair<byte[][], byte[][]> startEndKeys = indexTable.getStartEndKeys(); byte[][] startKeys = startEndKeys.getFirst(); byte[][] endKeys = startEndKeys.getSecond(); @@ -579,19 +617,19 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexRowsShouldBeDeletedWhenUserTableRowsDeleted() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); + createBaseTable(tableName, null, "('e','i','o')"); Connection conn1 = DriverManager.getConnection(getUrl()); try { - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('f',1,2,3,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('q',3,1,1,'c')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('f',1,2,3,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('q',3,1,1,'c')"); conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("DELETE FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME + " where v1='a'"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("DELETE FROM " + tableName + " where v1='a'"); conn1.commit(); conn1 = DriverManager.getConnection(getUrl()); - ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_INDEX_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + indexTableName); assertTrue(rs.next()); assertEquals(2, rs.getInt(1)); } finally { @@ -601,19 +639,19 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testScanWhenATableHasMultipleLocalIndexes() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); + createBaseTable(tableName, null, "('e','i','o')"); Connection conn1 = DriverManager.getConnection(getUrl()); try { - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('f',1,2,3,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('q',3,1,1,'c')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('f',1,2,3,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('q',3,1,1,'c')"); conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + "2 ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(k3)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + "2 ON " + tableName + "(k3)"); conn1.commit(); conn1 = DriverManager.getConnection(getUrl()); - ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + tableName); assertTrue(rs.next()); assertEquals(4, rs.getInt(1)); } finally { @@ -623,23 +661,23 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexesOnTableWithImmutableRows() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); - Connection conn1 = DriverManager.getConnection(getUrl()); + createBaseTable(tableName, null, "('e','i','o')"); + Connection conn1 = getConnection(); try { - conn1.createStatement().execute("ALTER TABLE "+ TestUtil.DEFAULT_DATA_TABLE_NAME + " SET IMMUTABLE_ROWS=true"); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("CREATE INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + "2 ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(k3)"); + conn1.createStatement().execute("ALTER TABLE "+ tableName + " SET IMMUTABLE_ROWS=true"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("CREATE INDEX " + indexName + "2 ON " + tableName + "(k3)"); conn1.commit(); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('f',1,2,3,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('q',3,1,1,'c')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('f',1,2,3,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('q',3,1,1,'c')"); conn1.commit(); conn1 = DriverManager.getConnection(getUrl()); - ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + tableName); assertTrue(rs.next()); assertEquals(4, rs.getInt(1)); - rs = conn1.createStatement().executeQuery("SELECT v1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); + rs = conn1.createStatement().executeQuery("SELECT v1 FROM " + tableName); assertTrue(rs.next()); assertEquals("a", rs.getString("v1")); assertTrue(rs.next()); @@ -649,7 +687,7 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { assertTrue(rs.next()); assertEquals("z", rs.getString("v1")); assertFalse(rs.next()); - rs = conn1.createStatement().executeQuery("SELECT k3 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); + rs = conn1.createStatement().executeQuery("SELECT k3 FROM " + tableName); assertTrue(rs.next()); assertEquals(1, rs.getInt("k3")); assertTrue(rs.next()); @@ -666,20 +704,20 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexScanWithInList() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','i','o')"); + createBaseTable(tableName, null, "('e','i','o')"); Connection conn1 = DriverManager.getConnection(getUrl()); try{ - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('b',1,2,4,'z')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('f',1,2,3,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('j',2,4,2,'a')"); - conn1.createStatement().execute("UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('q',3,1,1,'c')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('b',1,2,4,'z')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('f',1,2,3,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('j',2,4,2,'a')"); + conn1.createStatement().execute("UPSERT INTO " + tableName + " values('q',3,1,1,'c')"); conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1) include (k3)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1) include (k3)"); - ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + TestUtil.DEFAULT_INDEX_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT COUNT(*) FROM " + indexTableName); assertTrue(rs.next()); - String query = "SELECT t_id FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME +" where (v1,k3) IN (('z',4),('a',2))"; + String query = "SELECT t_id FROM " + tableName +" where (v1,k3) IN (('z',4),('a',2))"; rs = conn1.createStatement().executeQuery(query); assertTrue(rs.next()); assertEquals("j", rs.getString("t_id")); @@ -711,36 +749,37 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexScanAfterRegionSplit() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','j','o')"); - Connection conn1 = DriverManager.getConnection(getUrl()); + if (isNamespaceMapped) { return; } + createBaseTable(tableName, null, "('e','j','o')"); + Connection conn1 = getConnection(); try{ String[] strings = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; for (int i = 0; i < 26; i++) { conn1.createStatement().execute( - "UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('"+strings[i]+"'," + i + "," + "UPSERT INTO " + tableName + " values('"+strings[i]+"'," + i + "," + (i + 1) + "," + (i + 2) + ",'" + strings[25 - i] + "')"); } conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + "_2 ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(k3)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + "_2 ON " + tableName + "(k3)"); - ResultSet rs = conn1.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT * FROM " + tableName); assertTrue(rs.next()); - HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); + HBaseAdmin admin = conn1.unwrap(PhoenixConnection.class).getQueryServices().getAdmin(); for (int i = 1; i < 5; i++) { CatalogTracker ct = new CatalogTracker(admin.getConfiguration()); - admin.split(Bytes.toBytes(TestUtil.DEFAULT_DATA_TABLE_NAME), ByteUtil.concat(Bytes.toBytes(strings[3*i]))); + admin.split(physicalTableName.getName(), ByteUtil.concat(Bytes.toBytes(strings[3*i]))); List<HRegionInfo> regionsOfUserTable = - MetaReader.getTableRegions(ct, TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME), false); + MetaReader.getTableRegions(ct, physicalTableName, false); while (regionsOfUserTable.size() != (4+i)) { Thread.sleep(100); - regionsOfUserTable = MetaReader.getTableRegions(ct, TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME), false); + regionsOfUserTable = MetaReader.getTableRegions(ct, physicalTableName, false); } assertEquals(4+i, regionsOfUserTable.size()); TableName indexTable = - TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)); + TableName.valueOf(indexPhysicalTableName); List<HRegionInfo> regionsOfIndexTable = MetaReader.getTableRegions(ct, indexTable, false); @@ -749,7 +788,7 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { regionsOfIndexTable = MetaReader.getTableRegions(ct, indexTable, false); } assertEquals(4 + i, regionsOfIndexTable.size()); - String query = "SELECT t_id,k1,v1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME; + String query = "SELECT t_id,k1,v1 FROM " + tableName; rs = conn1.createStatement().executeQuery(query); Thread.sleep(1000); for (int j = 0; j < 26; j++) { @@ -761,17 +800,17 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { rs = conn1.createStatement().executeQuery("EXPLAIN " + query); assertEquals( "CLIENT PARALLEL " + (4 + i) + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME) + " [-32768]\n" + + indexPhysicalTableName + " [-32768]\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - query = "SELECT t_id,k1,k3 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME; + query = "SELECT t_id,k1,k3 FROM " + tableName; rs = conn1.createStatement().executeQuery("EXPLAIN "+query); assertEquals( "CLIENT PARALLEL " + ((strings[3 * i].compareTo("j") < 0) ? (4 + i) : (4 + i - 1)) + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME) + " [-32767]\n" + + indexPhysicalTableName + " [-32767]\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); rs = conn1.createStatement().executeQuery(query); @@ -790,25 +829,26 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexScanWithSmallChunks() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, 3, null); + createBaseTable(tableName, 3, null); Properties props = new Properties(); props.setProperty(QueryServices.SCAN_RESULT_CHUNK_SIZE, "2"); + props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(isNamespaceMapped)); Connection conn1 = DriverManager.getConnection(getUrl(), props); try{ String[] strings = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; for (int i = 0; i < 26; i++) { conn1.createStatement().execute( - "UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('"+strings[i]+"'," + i + "," + "UPSERT INTO " + tableName + " values('"+strings[i]+"'," + i + "," + (i + 1) + "," + (i + 2) + ",'" + strings[25 - i] + "')"); } conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + "_2 ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(k3)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + "_2 ON " + tableName + "(k3)"); - ResultSet rs = conn1.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT * FROM " + tableName); assertTrue(rs.next()); - String query = "SELECT t_id,k1,v1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME; + String query = "SELECT t_id,k1,v1 FROM " + tableName; rs = conn1.createStatement().executeQuery(query); for (int j = 0; j < 26; j++) { assertTrue(rs.next()); @@ -816,7 +856,7 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { assertEquals(25 - j, rs.getInt("k1")); assertEquals(strings[j], rs.getString("V1")); } - query = "SELECT t_id,k1,k3 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME; + query = "SELECT t_id,k1,k3 FROM " + tableName; rs = conn1.createStatement().executeQuery(query); Thread.sleep(1000); for (int j = 0; j < 26; j++) { @@ -832,43 +872,43 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexScanAfterRegionsMerge() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, null, "('e','j','o')"); - Connection conn1 = DriverManager.getConnection(getUrl()); + if (isNamespaceMapped) { return; } + createBaseTable(tableName, null, "('e','j','o')"); + Connection conn1 = getConnection(); try{ String[] strings = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; for (int i = 0; i < 26; i++) { conn1.createStatement().execute( - "UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME + " values('"+strings[i]+"'," + i + "," + "UPSERT INTO " + tableName + " values('"+strings[i]+"'," + i + "," + (i + 1) + "," + (i + 2) + ",'" + strings[25 - i] + "')"); } conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(v1)"); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + "_2 ON " + TestUtil.DEFAULT_DATA_TABLE_NAME + "(k3)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + "_2 ON " + tableName + "(k3)"); - ResultSet rs = conn1.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); + ResultSet rs = conn1.createStatement().executeQuery("SELECT * FROM " + tableName); assertTrue(rs.next()); - HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); + HBaseAdmin admin = conn1.unwrap(PhoenixConnection.class).getQueryServices().getAdmin(); CatalogTracker ct = new CatalogTracker(admin.getConfiguration()); List<HRegionInfo> regionsOfUserTable = MetaReader.getTableRegions(ct, - TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME), false); + physicalTableName, false); admin.mergeRegions(regionsOfUserTable.get(0).getEncodedNameAsBytes(), regionsOfUserTable.get(1).getEncodedNameAsBytes(), false); regionsOfUserTable = MetaReader.getTableRegions(ct, - TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME), false); + physicalTableName, false); while (regionsOfUserTable.size() != 3) { Thread.sleep(100); regionsOfUserTable = MetaReader.getTableRegions(ct, - TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME), false); + physicalTableName, false); } assertEquals(3, regionsOfUserTable.size()); TableName indexTable = - TableName.valueOf(MetaDataUtil - .getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)); + TableName.valueOf(indexPhysicalTableName); List<HRegionInfo> regionsOfIndexTable = MetaReader.getTableRegions(ct, indexTable, false); @@ -877,7 +917,7 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { regionsOfIndexTable = MetaReader.getTableRegions(ct, indexTable, false); } assertEquals(3, regionsOfIndexTable.size()); - String query = "SELECT t_id,k1,v1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME; + String query = "SELECT t_id,k1,v1 FROM " + tableName; rs = conn1.createStatement().executeQuery(query); Thread.sleep(1000); for (int j = 0; j < 26; j++) { @@ -889,15 +929,15 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { rs = conn1.createStatement().executeQuery("EXPLAIN " + query); assertEquals( "CLIENT PARALLEL " + 3 + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME) + + indexPhysicalTableName + " [-32768]\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); - query = "SELECT t_id,k1,k3 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME; + query = "SELECT t_id,k1,k3 FROM " + tableName; rs = conn1.createStatement().executeQuery("EXPLAIN " + query); assertEquals( "CLIENT PARALLEL " + 3 + "-WAY RANGE SCAN OVER " - + MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME) + + indexPhysicalTableName + " [-32767]\n" + " SERVER FILTER BY FIRST KEY ONLY\n" + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs)); @@ -916,31 +956,32 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { @Test public void testLocalIndexStateWhenSplittingInProgress() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME+"2", null, "('e','j','o')"); - Connection conn1 = DriverManager.getConnection(getUrl()); + if (isNamespaceMapped) { return; } + createBaseTable(tableName+"2", null, "('e','j','o')"); + Connection conn1 = getConnection(); try{ String[] strings = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; for (int i = 0; i < 26; i++) { conn1.createStatement().execute( - "UPSERT INTO " + TestUtil.DEFAULT_DATA_TABLE_NAME+"2" + " values('"+strings[i]+"'," + i + "," + "UPSERT INTO " + tableName+"2" + " values('"+strings[i]+"'," + i + "," + (i + 1) + "," + (i + 2) + ",'" + strings[25 - i] + "')"); } conn1.commit(); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + TestUtil.DEFAULT_DATA_TABLE_NAME+"2" + "(v1)"); - conn1.createStatement().execute("CREATE LOCAL INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + "_2 ON " + TestUtil.DEFAULT_DATA_TABLE_NAME+"2" + "(k3)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName+"2" + "(v1)"); + conn1.createStatement().execute("CREATE LOCAL INDEX " + indexName + "_2 ON " + tableName+"2" + "(k3)"); - ResultSet rs = conn1.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME+"2"); + ResultSet rs = conn1.createStatement().executeQuery("SELECT * FROM " + tableName+"2"); assertTrue(rs.next()); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - HTableDescriptor tableDesc = admin.getTableDescriptor(TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME+"2")); + HTableDescriptor tableDesc = admin.getTableDescriptor(SchemaUtil.getPhysicalTableName((tableName+"2").getBytes(),isNamespaceMapped)); tableDesc.removeCoprocessor(LocalIndexSplitter.class.getName()); tableDesc.addCoprocessor(MockedLocalIndexSplitter.class.getName(), null, 1, null); admin.disableTable(tableDesc.getTableName()); admin.modifyTable(tableDesc.getTableName(), tableDesc); admin.enableTable(tableDesc.getTableName()); - TableName indexTable = - TableName.valueOf(MetaDataUtil.getLocalIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME+"2")); + TableName indexTable = TableName.valueOf(MetaDataUtil.getLocalIndexTableName( + SchemaUtil.getPhysicalTableName((tableName + "2").getBytes(), isNamespaceMapped).getNameAsString())); HTableDescriptor indexTableDesc = admin.getTableDescriptor(indexTable); indexTableDesc.removeCoprocessor(IndexHalfStoreFileReaderGenerator.class.getName()); indexTableDesc.addCoprocessor(MockedIndexHalfStoreFileReaderGenerator.class.getName(), null, @@ -949,13 +990,14 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { admin.modifyTable(indexTable, indexTableDesc); admin.enableTable(indexTable); - admin.split(Bytes.toBytes(TestUtil.DEFAULT_DATA_TABLE_NAME+"2"), ByteUtil.concat(Bytes.toBytes(strings[3]))); + admin.split(SchemaUtil.getPhysicalTableName(Bytes.toBytes(tableName + "2"), isNamespaceMapped).getName(), + ByteUtil.concat(Bytes.toBytes(strings[3]))); List<HRegionInfo> regionsOfUserTable = - admin.getTableRegions(TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME+"2")); + admin.getTableRegions(SchemaUtil.getPhysicalTableName(Bytes.toBytes(tableName + "2"), isNamespaceMapped)); while (regionsOfUserTable.size() != 5) { Thread.sleep(100); - regionsOfUserTable = admin.getTableRegions(TableName.valueOf(TestUtil.DEFAULT_DATA_TABLE_NAME+"2")); + regionsOfUserTable = admin.getTableRegions(SchemaUtil.getPhysicalTableName(Bytes.toBytes(tableName + "2"), isNamespaceMapped)); } assertEquals(5, regionsOfUserTable.size()); @@ -970,22 +1012,22 @@ public class LocalIndexIT extends BaseHBaseManagedTimeIT { boolean success = latch1.await(WAIT_TIME_SECONDS, TimeUnit.SECONDS); assertTrue("Timed out waiting for MockedLocalIndexSplitter.preSplitAfterPONR to complete", success); // Verify the metadata for index is correct. - rs = conn1.getMetaData().getTables(null, StringUtil.escapeLike(TestUtil.DEFAULT_SCHEMA_NAME), TestUtil.DEFAULT_INDEX_TABLE_NAME, + rs = conn1.getMetaData().getTables(null, StringUtil.escapeLike(schemaName), indexName, new String[] { PTableType.INDEX.toString() }); assertTrue(rs.next()); - assertEquals(TestUtil.DEFAULT_INDEX_TABLE_NAME, rs.getString(3)); + assertEquals(indexName, rs.getString(3)); assertEquals(PIndexState.INACTIVE.toString(), rs.getString("INDEX_STATE")); assertFalse(rs.next()); - rs = conn1.getMetaData().getTables(null, StringUtil.escapeLike(TestUtil.DEFAULT_SCHEMA_NAME), TestUtil.DEFAULT_INDEX_TABLE_NAME+"_2", + rs = conn1.getMetaData().getTables(null, StringUtil.escapeLike(schemaName), indexName+"_2", new String[] { PTableType.INDEX.toString() }); assertTrue(rs.next()); - assertEquals(TestUtil.DEFAULT_INDEX_TABLE_NAME+"_2", rs.getString(3)); + assertEquals(indexName+"_2", rs.getString(3)); assertEquals(PIndexState.INACTIVE.toString(), rs.getString("INDEX_STATE")); assertFalse(rs.next()); - String query = "SELECT t_id,k1,v1 FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME+"2"; + String query = "SELECT t_id,k1,v1 FROM " + tableName+"2"; rs = conn1.createStatement().executeQuery("EXPLAIN " + query); - assertEquals("CLIENT PARALLEL " + 1 + "-WAY FULL SCAN OVER " + TestUtil.DEFAULT_DATA_TABLE_NAME+"2", + assertEquals("CLIENT PARALLEL " + 1 + "-WAY FULL SCAN OVER " + tableName+"2", QueryUtil.getExplainPlan(rs)); latch2.countDown(); } finally {
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7e432be7/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java index ebc6988..7818bcc 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java @@ -41,6 +41,7 @@ import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; import org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver; import org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress; +import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.end2end.BaseOwnClusterHBaseManagedTimeIT; import org.apache.phoenix.end2end.NeedsOwnMiniClusterTest; import org.apache.phoenix.query.QueryServices; @@ -83,15 +84,19 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { private final boolean transactional; private final boolean localIndex; private final String tableDDLOptions; + private final boolean isNamespaceMapped; + private String schema = "TEST"; - public MutableIndexFailureIT(boolean transactional, boolean localIndex) { + public MutableIndexFailureIT(boolean transactional, boolean localIndex, boolean isNamespaceMapped) { this.transactional = transactional; this.localIndex = localIndex; this.tableDDLOptions = transactional ? " TRANSACTIONAL=true " : ""; - this.tableName = (localIndex ? "L_" : "") + TestUtil.DEFAULT_DATA_TABLE_NAME + (transactional ? "_TXN" : ""); + this.tableName = (localIndex ? "L_" : "") + TestUtil.DEFAULT_DATA_TABLE_NAME + (transactional ? "_TXN" : "") + + (isNamespaceMapped ? "_NM" : ""); this.indexName = INDEX_NAME; - this.fullTableName = SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, tableName); - this.fullIndexName = SchemaUtil.getTableName(TestUtil.DEFAULT_SCHEMA_NAME, indexName); + this.fullTableName = SchemaUtil.getTableName(schema, tableName); + this.fullIndexName = SchemaUtil.getTableName(schema, indexName); + this.isNamespaceMapped = isNamespaceMapped; } @BeforeClass @@ -108,9 +113,11 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { setUpTestDriver(new ReadOnlyProps(serverProps.entrySet().iterator()), new ReadOnlyProps(clientProps.entrySet().iterator())); } - @Parameters(name = "transactional = {0}, localIndex = {1}") + @Parameters(name = "transactional = {0}, localIndex = {1}, isNamespaceMapped = {2}") public static Collection<Boolean[]> data() { - return Arrays.asList(new Boolean[][] { { false, false }, { false, true }, { true, false }, { true, true } }); + return Arrays.asList(new Boolean[][] { { false, false, true }, { false, false, false }, { false, true, true }, + { false, true, false }, { true, false, true }, { true, true, true }, { true, false, false }, + { true, true, false } }); } @Test @@ -120,12 +127,16 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { public void helpTestWriteFailureDisablesIndex() throws Exception { Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.put(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, String.valueOf(isNamespaceMapped)); try (Connection conn = driver.connect(url, props)) { String query; ResultSet rs; conn.setAutoCommit(false); - conn.createStatement().execute( - "CREATE TABLE " + fullTableName + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR) "+tableDDLOptions); + if (isNamespaceMapped) { + conn.createStatement().execute("CREATE SCHEMA IF NOT EXISTS " + schema); + } + conn.createStatement().execute("CREATE TABLE " + fullTableName + + " (k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR) " + tableDDLOptions); query = "SELECT * FROM " + fullTableName; rs = conn.createStatement().executeQuery(query); assertFalse(rs.next()); @@ -139,7 +150,7 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { assertFalse(rs.next()); // Verify the metadata for index is correct. - rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(TestUtil.DEFAULT_SCHEMA_NAME), indexName, + rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(schema), indexName, new String[] { PTableType.INDEX.toString() }); assertTrue(rs.next()); assertEquals(indexName, rs.getString(3)); @@ -163,8 +174,8 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { query = "SELECT /*+ NO_INDEX */ k,v1 FROM " + fullTableName; rs = conn.createStatement().executeQuery("EXPLAIN " + query); - String expectedPlan = - "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + fullTableName; + String expectedPlan = "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + + SchemaUtil.getPhysicalTableName(fullTableName.getBytes(), isNamespaceMapped); assertEquals(expectedPlan, QueryUtil.getExplainPlan(rs)); rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); @@ -202,7 +213,7 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { } // Verify the metadata for index is correct. - rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(TestUtil.DEFAULT_SCHEMA_NAME), indexName, + rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(schema), indexName, new String[] { PTableType.INDEX.toString() }); assertTrue(rs.next()); assertEquals(indexName, rs.getString(3)); @@ -230,8 +241,8 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { // Verify previous writes succeeded to data table query = "SELECT /*+ NO_INDEX */ k,v1 FROM " + fullTableName; rs = conn.createStatement().executeQuery("EXPLAIN " + query); - expectedPlan = - "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + fullTableName; + expectedPlan = "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + + SchemaUtil.getPhysicalTableName(fullTableName.getBytes(), isNamespaceMapped); assertEquals(expectedPlan, QueryUtil.getExplainPlan(rs)); rs = conn.createStatement().executeQuery(query); assertTrue(rs.next()); @@ -257,7 +268,7 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { int maxTries = 3, nTries = 0; do { Thread.sleep(15 * 1000); // sleep 15 secs - rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(TestUtil.DEFAULT_SCHEMA_NAME), indexName, + rs = conn.getMetaData().getTables(null, StringUtil.escapeLike(schema), indexName, new String[] { PTableType.INDEX.toString() }); assertTrue(rs.next()); if(PIndexState.ACTIVE.toString().equals(rs.getString("INDEX_STATE"))){ @@ -279,8 +290,11 @@ public class MutableIndexFailureIT extends BaseOwnClusterHBaseManagedTimeIT { // verify index table has correct data query = "SELECT /*+ INDEX(" + indexName + ") */ k,v1 FROM " + fullTableName; rs = conn.createStatement().executeQuery("EXPLAIN " + query); - expectedPlan = - " OVER " + (localIndex ? MetaDataUtil.LOCAL_INDEX_TABLE_PREFIX + tableName : fullIndexName); + expectedPlan = " OVER " + + (localIndex + ? Bytes.toString(MetaDataUtil.getLocalIndexPhysicalName(SchemaUtil + .getPhysicalTableName(fullTableName.getBytes(), isNamespaceMapped).getName())) + : SchemaUtil.getPhysicalTableName(fullIndexName.getBytes(), isNamespaceMapped).getNameAsString()); String explainPlan = QueryUtil.getExplainPlan(rs); assertTrue(explainPlan.contains(expectedPlan)); rs = conn.createStatement().executeQuery(query); http://git-wip-us.apache.org/repos/asf/phoenix/blob/7e432be7/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java index 34094d5..450cffa 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java @@ -26,6 +26,8 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Arrays; +import java.util.Collection; import java.util.Map; import java.util.Properties; @@ -38,16 +40,26 @@ import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.QueryUtil; import org.apache.phoenix.util.ReadOnlyProps; +import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.TestUtil; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; import com.google.common.collect.Maps; - +@RunWith(Parameterized.class) public class ViewIndexIT extends BaseHBaseManagedTimeIT { private String VIEW_NAME = "MY_VIEW"; + private String schemaName="TEST"; + private boolean isNamespaceMapped; + private String tableName = schemaName + ".T"; + private String indexName = "I"; + private String viewIndexPhysicalTableName; + private TableName physicalTableName; @BeforeClass @Shadower(classBeingShadowed = BaseHBaseManagedTimeIT.class) @@ -59,8 +71,17 @@ public class ViewIndexIT extends BaseHBaseManagedTimeIT { setUpTestDriver(new ReadOnlyProps(props.entrySet().iterator())); } - private void createBaseTable(String tableName, boolean multiTenant, Integer saltBuckets, String splits) throws SQLException { - Connection conn = DriverManager.getConnection(getUrl()); + @Parameters(name = "isNamespaceMapped = {0}") + public static Collection<Boolean> data() { + return Arrays.asList(true, false); + } + + private void createBaseTable(String tableName, boolean multiTenant, Integer saltBuckets, String splits) + throws SQLException { + Connection conn = getConnection(); + if (isNamespaceMapped) { + conn.createStatement().execute("CREATE SCHEMA IF NOT EXISTS " + schemaName); + } String ddl = "CREATE TABLE " + tableName + " (t_id VARCHAR NOT NULL,\n" + "k1 VARCHAR NOT NULL,\n" + "k2 INTEGER NOT NULL,\n" + @@ -81,20 +102,34 @@ public class ViewIndexIT extends BaseHBaseManagedTimeIT { conn.createStatement().execute(ddl + ddlOptions); conn.close(); } + + public Connection getConnection() throws SQLException{ + Properties props = new Properties(); + props.put(QueryServices.DROP_METADATA_ATTRIB, Boolean.toString(true)); + props.put(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(isNamespaceMapped)); + return DriverManager.getConnection(getUrl(),props); + } + + public ViewIndexIT(boolean isNamespaceMapped) { + this.isNamespaceMapped = isNamespaceMapped; + this.physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped); + this.viewIndexPhysicalTableName = MetaDataUtil.getLocalIndexTableName(physicalTableName.getNameAsString()); + } + @Test public void testDeleteViewIndexSequences() throws Exception { - createBaseTable(TestUtil.DEFAULT_DATA_TABLE_NAME, false, null, null); - Connection conn1 = DriverManager.getConnection(getUrl()); - Connection conn2 = DriverManager.getConnection(getUrl()); - conn1.createStatement().execute("CREATE VIEW " + VIEW_NAME + " AS SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_NAME); - conn1.createStatement().execute("CREATE INDEX " + TestUtil.DEFAULT_INDEX_TABLE_NAME + " ON " + VIEW_NAME + " (v1)"); - conn2.createStatement().executeQuery("SELECT * FROM " + TestUtil.DEFAULT_DATA_TABLE_FULL_NAME).next(); + createBaseTable(tableName, false, null, null); + Connection conn1 = getConnection(); + Connection conn2 = getConnection(); + conn1.createStatement().execute("CREATE VIEW " + VIEW_NAME + " AS SELECT * FROM " + tableName); + conn1.createStatement().execute("CREATE INDEX " + indexName + " ON " + VIEW_NAME + " (v1)"); + conn2.createStatement().executeQuery("SELECT * FROM " + tableName).next(); HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); conn1.createStatement().execute("DROP VIEW " + VIEW_NAME); - conn1.createStatement().execute("DROP TABLE "+ TestUtil.DEFAULT_DATA_TABLE_NAME); + conn1.createStatement().execute("DROP TABLE "+ tableName); admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin(); - assertFalse("View index table should be deleted.", admin.tableExists(TableName.valueOf(MetaDataUtil.getViewIndexTableName(TestUtil.DEFAULT_DATA_TABLE_NAME)))); + assertFalse("View index table should be deleted.", admin.tableExists(TableName.valueOf(viewIndexPhysicalTableName))); ResultSet rs = conn2.createStatement().executeQuery("SELECT " + PhoenixDatabaseMetaData.SEQUENCE_SCHEMA + "," + PhoenixDatabaseMetaData.SEQUENCE_NAME http://git-wip-us.apache.org/repos/asf/phoenix/blob/7e432be7/phoenix-core/src/it/java/org/apache/phoenix/tx/TxCheckpointIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/tx/TxCheckpointIT.java b/phoenix-core/src/it/java/org/apache/phoenix/tx/TxCheckpointIT.java index e9ba592..c7fc053 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/tx/TxCheckpointIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/tx/TxCheckpointIT.java @@ -37,6 +37,7 @@ import org.apache.phoenix.end2end.BaseHBaseManagedTimeIT; import org.apache.phoenix.end2end.Shadower; import org.apache.phoenix.execute.MutationState; import org.apache.phoenix.jdbc.PhoenixConnection; +import org.apache.phoenix.query.BaseTest; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.util.PropertiesUtil; import org.apache.phoenix.util.ReadOnlyProps; @@ -48,10 +49,10 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; -import co.cask.tephra.Transaction.VisibilityLevel; - import com.google.common.collect.Maps; +import co.cask.tephra.Transaction.VisibilityLevel; + @RunWith(Parameterized.class) public class TxCheckpointIT extends BaseHBaseManagedTimeIT { http://git-wip-us.apache.org/repos/asf/phoenix/blob/7e432be7/phoenix-core/src/main/antlr3/PhoenixSQL.g ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/antlr3/PhoenixSQL.g b/phoenix-core/src/main/antlr3/PhoenixSQL.g index a042090..99f8029 100644 --- a/phoenix-core/src/main/antlr3/PhoenixSQL.g +++ b/phoenix-core/src/main/antlr3/PhoenixSQL.g @@ -71,6 +71,7 @@ tokens ALTER='alter'; COLUMN='column'; TABLE='table'; + SCHEMA='schema'; ADD='add'; SPLIT='split'; EXPLAIN='explain'; @@ -125,6 +126,7 @@ tokens LIST = 'list'; JARS='jars'; ROW_TIMESTAMP='row_timestamp'; + USE='use'; OFFSET ='offset'; FETCH = 'fetch'; ROW = 'row'; @@ -397,6 +399,7 @@ oneStatement returns [BindableStatement ret] | s=upsert_node | s=delete_node | s=create_table_node + | s=create_schema_node | s=create_view_node | s=create_index_node | s=drop_table_node @@ -411,6 +414,8 @@ oneStatement returns [BindableStatement ret] | s=delete_jar_node | s=create_sequence_node | s=drop_sequence_node + | s=drop_schema_node + | s=use_schema_node | s=update_statistics_node | s=explain_node) { $ret = s; } ; @@ -428,6 +433,12 @@ create_table_node returns [CreateTableStatement ret] (SPLIT ON s=value_expression_list)? {ret = factory.createTable(t, p, c, pk, s, PTableType.TABLE, ex!=null, null, null, getBindCount()); } ; + +// Parse a create schema statement. +create_schema_node returns [CreateSchemaStatement ret] + : CREATE SCHEMA (IF NOT ex=EXISTS)? s=identifier + {ret = factory.createSchema(s, ex!=null); } + ; // Parse a create view statement. create_view_node returns [CreateTableStatement ret] @@ -533,6 +544,12 @@ drop_table_node returns [DropTableStatement ret] {ret = factory.dropTable(t, v==null ? (QueryConstants.SYSTEM_SCHEMA_NAME.equals(t.getSchemaName()) ? PTableType.SYSTEM : PTableType.TABLE) : PTableType.VIEW, ex!=null, c!=null); } ; +drop_schema_node returns [DropSchemaStatement ret] + : DROP SCHEMA (IF ex=EXISTS)? s=identifier (c=CASCADE)? + {ret = factory.dropSchema(s, ex!=null, c!=null); } + ; + + // Parse a drop index statement drop_index_node returns [DropIndexStatement ret] : DROP INDEX (IF ex=EXISTS)? i=index_name ON t=from_table_name @@ -869,6 +886,11 @@ multiply_divide_modulo_expression returns [ParseNode ret] { $ret = lhs; } ; +use_schema_node returns [UseSchemaStatement ret] + : USE s=identifier + {ret = factory.useSchema(s); } + ; + negate_expression returns [ParseNode ret] : m=MINUS? e=array_expression { $ret = m==null ? e : factory.negate(e); } ; http://git-wip-us.apache.org/repos/asf/phoenix/blob/7e432be7/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/controller/MetadataRpcController.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/controller/MetadataRpcController.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/controller/MetadataRpcController.java index ab463e9..df833f9 100644 --- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/controller/MetadataRpcController.java +++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/controller/MetadataRpcController.java @@ -25,6 +25,7 @@ import org.apache.hadoop.hbase.ipc.DelegatingPayloadCarryingRpcController; import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController; import org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; +import org.apache.phoenix.util.SchemaUtil; import com.google.common.collect.ImmutableList; @@ -36,7 +37,16 @@ class MetadataRpcController extends DelegatingPayloadCarryingRpcController { .add(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME) .add(PhoenixDatabaseMetaData.SYSTEM_STATS_NAME) .add(PhoenixDatabaseMetaData.SYSTEM_SEQUENCE_NAME) - .add(PhoenixDatabaseMetaData.SYSTEM_FUNCTION_NAME).build(); + .add(PhoenixDatabaseMetaData.SYSTEM_FUNCTION_NAME) + .add(SchemaUtil.getPhysicalTableName(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES, true) + .getNameAsString()) + .add(SchemaUtil.getPhysicalTableName(PhoenixDatabaseMetaData.SYSTEM_STATS_NAME_BYTES, true) + .getNameAsString()) + .add(SchemaUtil.getPhysicalTableName(PhoenixDatabaseMetaData.SYSTEM_SEQUENCE_NAME_BYTES, true) + .getNameAsString()) + .add(SchemaUtil.getPhysicalTableName(PhoenixDatabaseMetaData.SYSTEM_FUNCTION_NAME_BYTES, true) + .getNameAsString()) + .build(); public MetadataRpcController(PayloadCarryingRpcController delegate, Configuration conf) { http://git-wip-us.apache.org/repos/asf/phoenix/blob/7e432be7/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnResolver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnResolver.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnResolver.java index 55253ea..6c91123 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnResolver.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnResolver.java @@ -20,7 +20,12 @@ package org.apache.phoenix.compile; import java.sql.SQLException; import java.util.List; +import org.apache.hadoop.hbase.TableNotFoundException; import org.apache.phoenix.parse.PFunction; +import org.apache.phoenix.parse.PSchema; +import org.apache.phoenix.schema.AmbiguousColumnException; +import org.apache.phoenix.schema.AmbiguousTableException; +import org.apache.phoenix.schema.ColumnNotFoundException; import org.apache.phoenix.schema.ColumnRef; import org.apache.phoenix.schema.TableRef; @@ -77,4 +82,9 @@ public interface ColumnResolver { public PFunction resolveFunction(String functionName) throws SQLException; public boolean hasUDFs(); + + public PSchema resolveSchema(String schemaName) throws SQLException; + + public List<PSchema> getSchemas(); + }