[
https://issues.apache.org/jira/browse/PHOENIX-1311?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15225340#comment-15225340
]
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_r58469369
--- 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
+ //skip already migrated tables
+ continue;
+ }
+ String destTableName = null;
+ String phoenixTableName = index.getName().getString();
+ boolean updateLink = false;
+ if
(srcTableName.startsWith(MetaDataUtil.LOCAL_INDEX_TABLE_PREFIX)) {
+ destTableName = Bytes
+
.toString(MetaDataUtil.getLocalIndexPhysicalName(newPhysicalTablename.getBytes()));
+ //update parent_table property in local index
table descriptor
+ conn.createStatement()
+ .execute(String.format("ALTER TABLE %s set
" + MetaDataUtil.PARENT_TABLE_KEY + "='%s'",
+ phoenixTableName,
table.getPhysicalName()));
+ updateLink = true;
+ } else if
(srcTableName.startsWith(MetaDataUtil.VIEW_INDEX_TABLE_PREFIX)) {
+ destTableName = Bytes
+
.toString(MetaDataUtil.getViewIndexPhysicalName(newPhysicalTablename.getBytes()));
+ updateLink = true;
+ } else {
+ destTableName = SchemaUtil
+
.getPhysicalTableName(index.getPhysicalName().getString(), readOnlyProps)
+ .getNameAsString();
+ }
+ if (updateLink) {
+ updateLink(conn, srcTableName, destTableName);
+ }
+ UpgradeUtil.mapTableToNamespace(admin, metatable,
srcTableName, destTableName, readOnlyProps,
+ PhoenixRuntime.getCurrentScn(readOnlyProps),
phoenixTableName, index.getType());
+ }
+ conn.getQueryServices().clearCache();
--- End diff --
Similarly here. Call clearTableFromCache.
> 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)