@Override public PMetaData addTable(PTable table) throws SQLException { Map<String, PTable> tables = Maps.newHashMap(metaData); PTable oldTable = tables.put(table.getName().getString(), table); if (table.getParentName() != null) { // Upsert new index table into parent data table list String parentName = table.getParentName().getString(); PTable parentTable = tables.get(parentName); // If parentTable isn't cached, that's ok we can skip this if (parentTable != null) { List<PTable> oldIndexes = parentTable.getIndexes(); List<PTable> newIndexes = Lists.newArrayListWithExpectedSize(oldIndexes.size() + 1); newIndexes.addAll(oldIndexes); if (oldTable != null) { newIndexes.remove(oldTable); } newIndexes.add(table); tables.put( parentName, PTableImpl.makePTable(parentTable, table.getTimeStamp(), newIndexes)); } } for (PTable index : table.getIndexes()) { tables.put(index.getName().getString(), index); } return new PMetaDataImpl(tables); }
@Override public PMetaData removeTable( PName tenantId, String tableName, String parentTableName, long tableTimeStamp) throws SQLException { PMetaDataCache tables = null; PTableRef parentTableRef = null; PTableKey key = new PTableKey(tenantId, tableName); if (metaData.get(key) == null) { if (parentTableName != null) { parentTableRef = metaData.get(new PTableKey(tenantId, parentTableName)); } if (parentTableRef == null) { return this; } } else { tables = metaData.clone(); PTable table = tables.remove(key); for (PTable index : table.getIndexes()) { tables.remove(index.getKey()); } if (table.getParentName() != null) { parentTableRef = tables.get(new PTableKey(tenantId, table.getParentName().getString())); } } // also remove its reference from parent table if (parentTableRef != null) { List<PTable> oldIndexes = parentTableRef.getTable().getIndexes(); if (oldIndexes != null && !oldIndexes.isEmpty()) { List<PTable> newIndexes = Lists.newArrayListWithExpectedSize(oldIndexes.size()); newIndexes.addAll(oldIndexes); for (int i = 0; i < newIndexes.size(); i++) { PTable index = newIndexes.get(i); if (index.getName().getString().equals(tableName)) { newIndexes.remove(i); PTable parentTable = PTableImpl.makePTable( parentTableRef.getTable(), tableTimeStamp == HConstants.LATEST_TIMESTAMP ? parentTableRef.getTable().getTimeStamp() : tableTimeStamp, newIndexes); if (tables == null) { tables = metaData.clone(); } tables.put(parentTable.getKey(), parentTable, parentTableRef.getResolvedTimeStamp()); break; } } } } return tables == null ? this : new PMetaDataImpl(tables); }
@Override public PMetaData addTable(PTable table, long resolvedTime) throws SQLException { int netGain = 0; PTableKey key = table.getKey(); PTableRef oldTableRef = metaData.get(key); if (oldTableRef != null) { netGain -= oldTableRef.getEstSize(); } PTable newParentTable = null; long parentResolvedTimestamp = resolvedTime; if (table.getParentName() != null) { // Upsert new index table into parent data table list String parentName = table.getParentName().getString(); PTableRef oldParentRef = metaData.get(new PTableKey(table.getTenantId(), parentName)); // If parentTable isn't cached, that's ok we can skip this if (oldParentRef != null) { List<PTable> oldIndexes = oldParentRef.getTable().getIndexes(); List<PTable> newIndexes = Lists.newArrayListWithExpectedSize(oldIndexes.size() + 1); newIndexes.addAll(oldIndexes); for (int i = 0; i < newIndexes.size(); i++) { PTable index = newIndexes.get(i); if (index.getName().equals(table.getName())) { newIndexes.remove(i); break; } } newIndexes.add(table); netGain -= oldParentRef.getEstSize(); newParentTable = PTableImpl.makePTable(oldParentRef.getTable(), table.getTimeStamp(), newIndexes); netGain += newParentTable.getEstimatedSize(); } } if (newParentTable == null) { // Don't count in gain if we found a parent table, as its accounted for in // newParentTable netGain += table.getEstimatedSize(); } long overage = metaData.getCurrentSize() + netGain - metaData.getMaxSize(); PMetaDataCache newMetaData = overage <= 0 ? metaData.clone() : metaData.cloneMinusOverage(overage); if (newParentTable != null) { // Upsert new index table into parent data table list newMetaData.put(newParentTable.getKey(), newParentTable, parentResolvedTimestamp); newMetaData.putDuplicate(table.getKey(), table, resolvedTime); } else { newMetaData.put(table.getKey(), table, resolvedTime); } for (PTable index : table.getIndexes()) { newMetaData.putDuplicate(index.getKey(), index, resolvedTime); } return new PMetaDataImpl(newMetaData); }