1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.filter;
21
22 import com.google.protobuf.InvalidProtocolBufferException;
23 import org.apache.hadoop.classification.InterfaceAudience;
24 import org.apache.hadoop.classification.InterfaceStability;
25 import org.apache.hadoop.hbase.KeyValue;
26 import org.apache.hadoop.hbase.client.Scan;
27 import org.apache.hadoop.hbase.exceptions.DeserializationException;
28 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
29 import org.apache.hadoop.hbase.protobuf.generated.FilterProtos;
30
31 import java.io.IOException;
32 import java.util.ArrayList;
33
34
35
36
37
38
39
40
41
42
43
44
45
46 @InterfaceAudience.Public
47 @InterfaceStability.Stable
48 public class RowFilter extends CompareFilter {
49
50 private boolean filterOutRow = false;
51
52
53
54
55
56
57 public RowFilter(final CompareOp rowCompareOp,
58 final ByteArrayComparable rowComparator) {
59 super(rowCompareOp, rowComparator);
60 }
61
62 @Override
63 public void reset() {
64 this.filterOutRow = false;
65 }
66
67 @Override
68 public ReturnCode filterKeyValue(KeyValue v) {
69 if(this.filterOutRow) {
70 return ReturnCode.NEXT_ROW;
71 }
72 return ReturnCode.INCLUDE;
73 }
74
75 @Override
76 public boolean filterRowKey(byte[] data, int offset, int length) {
77 if(doCompare(this.compareOp, this.comparator, data, offset, length)) {
78 this.filterOutRow = true;
79 }
80 return this.filterOutRow;
81 }
82
83 @Override
84 public boolean filterRow() {
85 return this.filterOutRow;
86 }
87
88 public static Filter createFilterFromArguments(ArrayList<byte []> filterArguments) {
89 ArrayList arguments = CompareFilter.extractArguments(filterArguments);
90 CompareOp compareOp = (CompareOp)arguments.get(0);
91 ByteArrayComparable comparator = (ByteArrayComparable)arguments.get(1);
92 return new RowFilter(compareOp, comparator);
93 }
94
95
96
97
98 public byte [] toByteArray() {
99 FilterProtos.RowFilter.Builder builder =
100 FilterProtos.RowFilter.newBuilder();
101 builder.setCompareFilter(super.convert());
102 return builder.build().toByteArray();
103 }
104
105
106
107
108
109
110
111 public static RowFilter parseFrom(final byte [] pbBytes)
112 throws DeserializationException {
113 FilterProtos.RowFilter proto;
114 try {
115 proto = FilterProtos.RowFilter.parseFrom(pbBytes);
116 } catch (InvalidProtocolBufferException e) {
117 throw new DeserializationException(e);
118 }
119 final CompareOp valueCompareOp =
120 CompareOp.valueOf(proto.getCompareFilter().getCompareOp().name());
121 ByteArrayComparable valueComparator = null;
122 try {
123 if (proto.getCompareFilter().hasComparator()) {
124 valueComparator = ProtobufUtil.toComparator(proto.getCompareFilter().getComparator());
125 }
126 } catch (IOException ioe) {
127 throw new DeserializationException(ioe);
128 }
129 return new RowFilter(valueCompareOp,valueComparator);
130 }
131
132
133
134
135
136
137 boolean areSerializedFieldsEqual(Filter o) {
138 if (o == this) return true;
139 if (!(o instanceof RowFilter)) return false;
140
141 return super.areSerializedFieldsEqual(o);
142 }
143 }