@Override protected void undo(NavigableMap<byte[], NavigableMap<byte[], Update>> persisted) throws Exception { if (persisted.isEmpty()) { return; } // NOTE: we use Delete with the write pointer as the specific version to delete. List<Delete> deletes = Lists.newArrayList(); for (Map.Entry<byte[], NavigableMap<byte[], Update>> row : persisted.entrySet()) { DeleteBuilder delete = tableUtil.buildDelete(row.getKey()); delete.setAttribute(TX_MAX_LIFETIME_MILLIS_KEY, txMaxLifetimeMillis); for (Map.Entry<byte[], Update> column : row.getValue().entrySet()) { // we want support tx and non-tx modes if (tx != null) { delete.setAttribute(TxConstants.TX_ROLLBACK_ATTRIBUTE_KEY, new byte[0]); // TODO: hijacking timestamp... bad delete.deleteColumn(columnFamily, column.getKey(), tx.getWritePointer()); } else { delete.deleteColumns(columnFamily, column.getKey()); } } deletes.add(delete.build()); } if (!deletes.isEmpty()) { hbaseDelete(deletes); } }
@Override public void delete(byte[] row, byte[][] columns) { byte[] distributedKey = createDistributedRowKey(row); DeleteBuilder delete = tableUtil.buildDelete(distributedKey); for (byte[] column : columns) { delete.deleteColumns(columnFamily, column); } try { hTable.delete(delete.build()); } catch (IOException e) { throw new DataSetException("Delete failed on table " + tableId, e); } }
.deleteColumns(FAMILY, col) .build(); table.delete(delete); .deleteFamily(FAMILY) .build(); delete = tableUtil.buildDelete(row1).build(); table.delete(delete);
@WriteOnly @Override public void put(byte[] key, @Nullable byte[] value) { try { if (value == null) { table.delete(tableUtil.buildDelete(key).build()); } else { Put put = tableUtil.buildPut(key) .add(DATA_COLUMN_FAMILY, DEFAULT_COLUMN, value) .build(); table.put(put); } } catch (IOException e) { throw Throwables.propagate(e); } }
@Override public void delete(byte[] row, byte[][] columns) { byte[] distributedKey = createDistributedRowKey(row); DeleteBuilder delete = tableUtil.buildDelete(distributedKey); for (byte[] column : columns) { delete.deleteColumns(columnFamily, column); } try { hTable.delete(delete.build()); } catch (IOException e) { throw new DataSetException("Delete failed on table " + tableId, e); } }
@WriteOnly @Override public void put(byte[] key, @Nullable byte[] value) { try { if (value == null) { table.delete(tableUtil.buildDelete(key).build()); } else { Put put = tableUtil.buildPut(key) .add(DATA_COLUMN_FAMILY, DEFAULT_COLUMN, value) .build(); table.put(put); } } catch (IOException e) { throw Throwables.propagate(e); } }
@Override protected void undo(NavigableMap<byte[], NavigableMap<byte[], Update>> persisted) throws Exception { if (persisted.isEmpty()) { return; } // NOTE: we use Delete with the write pointer as the specific version to delete. List<Delete> deletes = Lists.newArrayList(); for (Map.Entry<byte[], NavigableMap<byte[], Update>> row : persisted.entrySet()) { DeleteBuilder delete = tableUtil.buildDelete(row.getKey()); delete.setAttribute(TX_MAX_LIFETIME_MILLIS_KEY, txMaxLifetimeMillis); for (Map.Entry<byte[], Update> column : row.getValue().entrySet()) { // we want support tx and non-tx modes if (tx != null) { delete.setAttribute(TxConstants.TX_ROLLBACK_ATTRIBUTE_KEY, new byte[0]); // TODO: hijacking timestamp... bad delete.deleteColumn(columnFamily, column.getKey(), tx.getWritePointer()); } else { delete.deleteColumns(columnFamily, column.getKey()); } } deletes.add(delete.build()); } if (!deletes.isEmpty()) { hbaseDelete(deletes); } }
@Override public boolean swap(byte[] row, byte[] column, byte[] oldValue, byte[] newValue) { try { byte[] distributedKey = createDistributedRowKey(row); if (newValue == null) { // HBase API weirdness: we must use deleteColumns() because deleteColumn() deletes only the last version. Delete delete = tableUtil.buildDelete(distributedKey) .deleteColumns(columnFamily, column) .build(); return hTable.checkAndDelete(distributedKey, columnFamily, column, oldValue, delete); } else { Put put = tableUtil.buildPut(distributedKey) .add(columnFamily, column, newValue) .build(); return hTable.checkAndPut(distributedKey, columnFamily, column, oldValue, put); } } catch (IOException e) { throw new DataSetException("Swap failed on table " + tableId, e); } }
@Override public boolean swap(byte[] row, byte[] column, byte[] oldValue, byte[] newValue) { try { byte[] distributedKey = createDistributedRowKey(row); if (newValue == null) { // HBase API weirdness: we must use deleteColumns() because deleteColumn() deletes only the last version. Delete delete = tableUtil.buildDelete(distributedKey) .deleteColumns(columnFamily, column) .build(); return hTable.checkAndDelete(distributedKey, columnFamily, column, oldValue, delete); } else { Put put = tableUtil.buildPut(distributedKey) .add(columnFamily, column, newValue) .build(); return hTable.checkAndPut(distributedKey, columnFamily, column, oldValue, put); } } catch (IOException e) { throw new DataSetException("Swap failed on table " + tableId, e); } }