private void getLatestVersionOfCell(byte[] row, Key key, Iterator<Entry<Key, byte[]>> cellIter, long timestamp, @Output Map<Cell, Value> result) { Entry<Key, byte[]> lastEntry = null; while (cellIter.hasNext()) { Entry<Key, byte[]> curEntry = cellIter.next(); if (curEntry.getKey().ts >= timestamp) { break; } lastEntry = curEntry; } if (lastEntry != null) { long ts = lastEntry.getKey().ts; byte[] value = lastEntry.getValue(); result.put(Cell.create(row, key.col), Value.createWithCopyOfData(value, ts)); } }
@Override public ClosableIterator<RowResult<Value>> getRange( TableReference tableRef, final RangeRequest range, final long timestamp) { boolean reversed = range.isReverse(); return getRangeInternal(tableRef, range, entries -> { Entry<Key, byte[]> lastEntry = null; while (entries.hasNext()) { Entry<Key, byte[]> entry = entries.next(); if (reversed && entry.getKey().ts < timestamp) { lastEntry = entry; break; } else if (!reversed && entry.getKey().ts >= timestamp) { break; } lastEntry = entry; } if (lastEntry != null) { long ts = lastEntry.getKey().ts; return Value.createWithCopyOfData(lastEntry.getValue(), ts); } else { return null; } }); }
@Override public Map<Cell, Value> get(TableReference tableRef, Map<Cell, Long> timestampByCell) { ConcurrentSkipListMap<Key, byte[]> table = getTableMap(tableRef).entries; Map<Cell, Value> result = Maps.newHashMap(); for (Map.Entry<Cell, Long> e : timestampByCell.entrySet()) { Cell cell = e.getKey(); Entry<Key, byte[]> lastEntry = table.lowerEntry(new Key(cell, e.getValue())); if (lastEntry != null) { Key key = lastEntry.getKey(); if (key.matchesCell(cell)) { long ts = lastEntry.getKey().ts; result.put(cell, Value.createWithCopyOfData(lastEntry.getValue(), ts)); } } } return result; }
private void getLatestVersionOfCell(byte[] row, Key key, Iterator<Entry<Key, byte[]>> cellIter, long timestamp, @Output Map<Cell, Value> result) { Entry<Key, byte[]> lastEntry = null; while (cellIter.hasNext()) { Entry<Key, byte[]> curEntry = cellIter.next(); if (curEntry.getKey().ts >= timestamp) { break; } lastEntry = curEntry; } if (lastEntry != null) { long ts = lastEntry.getKey().ts; byte[] value = lastEntry.getValue(); result.put(Cell.create(row, key.col), Value.createWithCopyOfData(value, ts)); } }
@Override public Map<Cell, Value> get(TableReference tableRef, Map<Cell, Long> timestampByCell) { ConcurrentSkipListMap<Key, byte[]> table = getTableMap(tableRef).entries; Map<Cell, Value> result = Maps.newHashMap(); for (Map.Entry<Cell, Long> e : timestampByCell.entrySet()) { Cell cell = e.getKey(); Entry<Key, byte[]> lastEntry = table.lowerEntry(new Key(cell, e.getValue())); if (lastEntry != null) { Key key = lastEntry.getKey(); if (key.matchesCell(cell)) { long ts = lastEntry.getKey().ts; result.put(cell, Value.createWithCopyOfData(lastEntry.getValue(), ts)); } } } return result; }
@Override public ClosableIterator<RowResult<Value>> getRange( TableReference tableRef, final RangeRequest range, final long timestamp) { boolean reversed = range.isReverse(); return getRangeInternal(tableRef, range, entries -> { Entry<Key, byte[]> lastEntry = null; while (entries.hasNext()) { Entry<Key, byte[]> entry = entries.next(); if (reversed && entry.getKey().ts < timestamp) { lastEntry = entry; break; } else if (!reversed && entry.getKey().ts >= timestamp) { break; } lastEntry = entry; } if (lastEntry != null) { long ts = lastEntry.getKey().ts; return Value.createWithCopyOfData(lastEntry.getValue(), ts); } else { return null; } }); }