in tephra-hbase-compat-1.1-base/sources/main/java/org/apache/tephra/hbase/TransactionAwareHTable.java [527:594]
private Delete transactionalizeAction(Delete delete) throws IOException {
long transactionTimestamp = tx.getWritePointer();
byte[] deleteRow = delete.getRow();
Delete txDelete = new Delete(deleteRow, transactionTimestamp);
Map<byte[], List<Cell>> familyToDelete = delete.getFamilyCellMap();
if (familyToDelete.isEmpty()) {
// perform a row delete if we are using row-level conflict detection
if (conflictLevel == TxConstants.ConflictDetection.ROW ||
conflictLevel == TxConstants.ConflictDetection.NONE) {
// Row delete leaves delete markers in all column families of the table
// Therefore get all the column families of the hTable from the HTableDescriptor and add them to the changeSet
for (HColumnDescriptor columnDescriptor : hTable.getTableDescriptor().getColumnFamilies()) {
// no need to identify individual columns deleted
addToChangeSet(deleteRow, columnDescriptor.getName(), null);
}
} else {
Result result = get(new Get(delete.getRow()));
// Delete everything
NavigableMap<byte[], NavigableMap<byte[], byte[]>> resultMap = result.getNoVersionMap();
for (Map.Entry<byte[], NavigableMap<byte[], byte[]>> familyEntry : resultMap.entrySet()) {
NavigableMap<byte[], byte[]> familyColumns = result.getFamilyMap(familyEntry.getKey());
for (Map.Entry<byte[], byte[]> column : familyColumns.entrySet()) {
txDelete.deleteColumns(familyEntry.getKey(), column.getKey(), transactionTimestamp);
addToChangeSet(deleteRow, familyEntry.getKey(), column.getKey());
}
}
}
} else {
for (Map.Entry<byte [], List<Cell>> familyEntry : familyToDelete.entrySet()) {
byte[] family = familyEntry.getKey();
List<Cell> entries = familyEntry.getValue();
boolean isFamilyDelete = false;
if (entries.size() == 1) {
Cell cell = entries.get(0);
isFamilyDelete = CellUtil.isDeleteFamily(cell);
}
if (isFamilyDelete) {
if (conflictLevel == TxConstants.ConflictDetection.ROW ||
conflictLevel == TxConstants.ConflictDetection.NONE) {
// no need to identify individual columns deleted
txDelete.deleteFamily(family);
addToChangeSet(deleteRow, family, null);
} else {
Result result = get(new Get(delete.getRow()).addFamily(family));
// Delete entire family
NavigableMap<byte[], byte[]> familyColumns = result.getFamilyMap(family);
for (Map.Entry<byte[], byte[]> column : familyColumns.entrySet()) {
txDelete.deleteColumns(family, column.getKey(), transactionTimestamp);
addToChangeSet(deleteRow, family, column.getKey());
}
}
} else {
for (Cell value : entries) {
txDelete.deleteColumns(value.getFamily(), value.getQualifier(), transactionTimestamp);
addToChangeSet(deleteRow, value.getFamily(), value.getQualifier());
}
}
}
}
for (Map.Entry<String, byte[]> entry : delete.getAttributesMap().entrySet()) {
txDelete.setAttribute(entry.getKey(), entry.getValue());
}
txDelete.setDurability(delete.getDurability());
addToOperation(txDelete, tx);
return txDelete;
}