| package org.apache.hadoop.hbase.filter; |
| |
| import java.io.DataInput; |
| import java.io.DataOutput; |
| import java.io.IOException; |
| import java.util.List; |
| import java.util.TreeSet; |
| |
| import org.apache.hadoop.hbase.KeyValue; |
| |
| /** |
| * Filter that returns only cells whose timestamp (version) is |
| * in the specified list of timestamps (versions). |
| * <p> |
| * Note: Use of this filter overrides any time range/time stamp |
| * options specified using {@link org.apache.hadoop.hbase.client.Get#setTimeRange(long, long)}, |
| * {@link org.apache.hadoop.hbase.client.Scan#setTimeRange(long, long)}, {@link org.apache.hadoop.hbase.client.Get#setTimeStamp(long)}, |
| * or {@link org.apache.hadoop.hbase.client.Scan#setTimeStamp(long)}. |
| */ |
| public class TimestampsFilter extends FilterBase { |
| |
| TreeSet<Long> timestamps; |
| |
| // Used during scans to hint the scan to stop early |
| // once the timestamps fall below the minTimeStamp. |
| long minTimeStamp = Long.MAX_VALUE; |
| |
| /** |
| * Used during deserialization. Do not use otherwise. |
| */ |
| public TimestampsFilter() { |
| super(); |
| } |
| |
| /** |
| * Constructor for filter that retains only those |
| * cells whose timestamp (version) is in the specified |
| * list of timestamps. |
| * |
| * @param timestamps |
| */ |
| public TimestampsFilter(List<Long> timestamps) { |
| this.timestamps = new TreeSet<Long>(timestamps); |
| init(); |
| } |
| |
| private void init() { |
| if (this.timestamps.size() > 0) { |
| minTimeStamp = this.timestamps.first(); |
| } |
| } |
| |
| /** |
| * Gets the minimum timestamp requested by filter. |
| * @return minimum timestamp requested by filter. |
| */ |
| public long getMin() { |
| return minTimeStamp; |
| } |
| |
| @Override |
| public ReturnCode filterKeyValue(KeyValue v) { |
| if (this.timestamps.contains(v.getTimestamp())) { |
| return ReturnCode.INCLUDE; |
| } else if (v.getTimestamp() < minTimeStamp) { |
| // The remaining versions of this column are guaranteed |
| // to be lesser than all of the other values. |
| return ReturnCode.NEXT_COL; |
| } |
| return ReturnCode.SKIP; |
| } |
| |
| @Override |
| public void readFields(DataInput in) throws IOException { |
| int numTimestamps = in.readInt(); |
| this.timestamps = new TreeSet<Long>(); |
| for (int idx = 0; idx < numTimestamps; idx++) { |
| this.timestamps.add(in.readLong()); |
| } |
| init(); |
| } |
| |
| @Override |
| public void write(DataOutput out) throws IOException { |
| int numTimestamps = this.timestamps.size(); |
| out.writeInt(numTimestamps); |
| for (Long timestamp : this.timestamps) { |
| out.writeLong(timestamp); |
| } |
| } |
| } |