[ https://issues.apache.org/jira/browse/PHOENIX-1311?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15225336#comment-15225336 ]
ASF GitHub Bot commented on PHOENIX-1311: ----------------------------------------- Github user samarthjain commented on a diff in the pull request: https://github.com/apache/phoenix/pull/153#discussion_r58469125 --- Diff: phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java --- @@ -1279,4 +1304,129 @@ public static boolean truncateStats(HTableInterface metaTable, HTableInterface s } return false; } + + public static void mapTableToNamespace(HBaseAdmin admin, HTableInterface metatable, String srcTableName, + String destTableName, ReadOnlyProps props, Long ts, String phoenixTableName, PTableType pTableType) + throws SnapshotCreationException, IllegalArgumentException, IOException, InterruptedException, + SQLException { + srcTableName = SchemaUtil.normalizeIdentifier(srcTableName); + if (!SchemaUtil.isNamespaceMappingEnabled( + SchemaUtil.isSystemTable(srcTableName.getBytes()) ? PTableType.SYSTEM : null, + props)) { throw new IllegalArgumentException(SchemaUtil.isSystemTable(srcTableName.getBytes()) + ? "For system table " + QueryServices.IS_SYSTEM_TABLE_MAPPED_TO_NAMESPACE + + " also needs to be enabled along with " + QueryServices.IS_NAMESPACE_MAPPING_ENABLED + : QueryServices.IS_NAMESPACE_MAPPING_ENABLED + " is not enabled"); } + + if (PTableType.TABLE.equals(pTableType) || PTableType.INDEX.equals(pTableType)) { + admin.snapshot(srcTableName, srcTableName); + admin.cloneSnapshot(srcTableName.getBytes(), destTableName.getBytes()); + admin.disableTable(srcTableName); + admin.deleteTable(srcTableName); + } + if (phoenixTableName == null) { + phoenixTableName = srcTableName; + } + Put put = new Put(SchemaUtil.getTableKey(null, SchemaUtil.getSchemaNameFromFullName(phoenixTableName), + SchemaUtil.getTableNameFromFullName(phoenixTableName)), ts); + put.addColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, PhoenixDatabaseMetaData.IS_NAMESPACE_MAPPED_BYTES, + PBoolean.INSTANCE.toBytes(Boolean.TRUE)); + metatable.put(put); + } + + public static void mapTableToNamespace(HBaseAdmin admin, HTableInterface metatable, String tableName, + ReadOnlyProps props, Long ts) throws SnapshotCreationException, IllegalArgumentException, IOException, + InterruptedException, SQLException { + String destTablename = SchemaUtil + .normalizeIdentifier(SchemaUtil.getPhysicalTableName(tableName, props).getNameAsString()); + mapTableToNamespace(admin, metatable, tableName, destTablename, props, ts, null, PTableType.TABLE); + } + + public static void upgradeTable(PhoenixConnection conn, String srcTable) throws SQLException, + SnapshotCreationException, IllegalArgumentException, IOException, InterruptedException { + ReadOnlyProps readOnlyProps = conn.getQueryServices().getProps(); + if (conn.getClientInfo(PhoenixRuntime.TENANT_ID_ATTRIB) != null) { throw new SQLException( + "May not specify the TENANT_ID_ATTRIB property when upgrading"); } + try (HBaseAdmin admin = conn.getQueryServices().getAdmin(); + HTableInterface metatable = conn.getQueryServices() + .getTable(SchemaUtil + .getPhysicalName(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES, readOnlyProps) + .getName());) { + String tableName = SchemaUtil.normalizeIdentifier(srcTable); + String schemaName = SchemaUtil.getSchemaNameFromFullName(tableName); + + // Upgrade is not required if schemaName is not present. + if (schemaName.equals("")) { throw new IllegalArgumentException("Table doesn't have schema name"); } + + // Confirm table is not already upgraded + PTable table = PhoenixRuntime.getTable(conn, tableName); + if (table.isNamespaceMapped()) { throw new IllegalArgumentException("Table is already upgraded"); } + conn.createStatement().execute("CREATE SCHEMA IF NOT EXISTS " + schemaName); + String newPhysicalTablename = SchemaUtil + .normalizeIdentifier(SchemaUtil.getPhysicalTableName(table.getPhysicalName().getString(), readOnlyProps).getNameAsString()); + + // Upgrade the data or main table + UpgradeUtil.mapTableToNamespace(admin, metatable, tableName, newPhysicalTablename, readOnlyProps, + PhoenixRuntime.getCurrentScn(readOnlyProps), tableName, table.getType()); + + // clear the cache and get new table + conn.getQueryServices().clearCache(); + MetaDataMutationResult result = new MetaDataClient(conn).updateCache(schemaName, + SchemaUtil.getTableNameFromFullName(tableName)); + if (result.getMutationCode() != MutationCode.TABLE_ALREADY_EXISTS) { throw new TableNotFoundException( + tableName); } + table = result.getTable(); + // check whether table is properly upgraded before upgrading indexes + if (table.isNamespaceMapped()) { + for (PTable index : table.getIndexes()) { + String srcTableName = index.getPhysicalName().getString(); + if(srcTableName.contains(QueryConstants.NAMESPACE_SEPARATOR)){ + //this condition occurs in case of multiple views on table --- End diff -- Not sure I follow the comment here. Can you please elaborate? > HBase namespaces surfaced in phoenix > ------------------------------------ > > Key: PHOENIX-1311 > URL: https://issues.apache.org/jira/browse/PHOENIX-1311 > Project: Phoenix > Issue Type: New Feature > Reporter: nicolas maillard > Assignee: Ankit Singhal > Priority: Minor > Fix For: 4.8.0 > > Attachments: PHOENIX-1311.docx, PHOENIX-1311_v1.patch, > PHOENIX-1311_v2.patch, PHOENIX-1311_wip.patch, PHOENIX-1311_wip_2.patch > > > Hbase (HBASE-8015) has the concept of namespaces in the form of > myNamespace:MyTable it would be great if Phoenix leveraged this feature to > give a database like feature on top of the table. > Maybe to stay close to Hbase it could also be a create DB:Table... > or DB.Table which is a more standard annotation? -- This message was sent by Atlassian JIRA (v6.3.4#6332)