in tephra-hbase-compat-1.1-base/sources/main/java/org/apache/tephra/hbase/coprocessor/TransactionVisibilityFilter.java [106:156]
public ReturnCode filterKeyValue(Cell cell) throws IOException {
if (!CellUtil.matchingFamily(cell, currentFamily.get(), currentFamily.getOffset(), currentFamily.getLength())) {
// column family changed
currentFamily.set(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
Long familyOldestTs = oldestTsByFamily.get(currentFamily);
currentOldestTs = familyOldestTs != null ? familyOldestTs : 0;
deleteTracker.reset();
}
// need to apply TTL for the column family here
long kvTimestamp = cell.getTimestamp();
if (TxUtils.getTimestampForTTL(kvTimestamp) < currentOldestTs) {
// passed TTL for this column, seek to next
return ReturnCode.NEXT_COL;
} else if (tx.isVisible(kvTimestamp)) {
// Return all writes done by current transaction (including deletes) for VisibilityLevel.SNAPSHOT_ALL
if (tx.getVisibilityLevel() == Transaction.VisibilityLevel.SNAPSHOT_ALL && tx.isCurrentWrite(kvTimestamp)) {
// cell is visible
// visibility SNAPSHOT_ALL needs all matches
return runSubFilter(ReturnCode.INCLUDE, cell);
}
if (DeleteTracker.isFamilyDelete(cell)) {
deleteTracker.addFamilyDelete(cell);
if (clearDeletes) {
return ReturnCode.NEXT_COL;
} else {
// cell is visible
// as soon as we find a KV to include we can move to the next column
return runSubFilter(ReturnCode.INCLUDE_AND_NEXT_COL, cell);
}
}
// check if masked by family delete
if (deleteTracker.isDeleted(cell)) {
return ReturnCode.NEXT_COL;
}
// check for column delete
if (isColumnDelete(cell)) {
if (clearDeletes) {
// skip "deleted" cell
return ReturnCode.NEXT_COL;
} else {
// keep the marker but skip any remaining versions
return runSubFilter(ReturnCode.INCLUDE_AND_NEXT_COL, cell);
}
}
// cell is visible
// as soon as we find a KV to include we can move to the next column
return runSubFilter(ReturnCode.INCLUDE_AND_NEXT_COL, cell);
} else {
return ReturnCode.SKIP;
}
}