Example #1
0
  @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);
  }