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 java.io.IOException;
23 import java.util.Objects;
24
25 import org.apache.hadoop.hbase.classification.InterfaceAudience;
26 import org.apache.hadoop.hbase.classification.InterfaceStability;
27 import org.apache.hadoop.hbase.Cell;
28 import org.apache.hadoop.hbase.exceptions.DeserializationException;
29 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
30 import org.apache.hadoop.hbase.protobuf.generated.FilterProtos;
31
32 import com.google.protobuf.InvalidProtocolBufferException;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 @InterfaceAudience.Public
56 @InterfaceStability.Stable
57 public class SkipFilter extends FilterBase {
58 private boolean filterRow = false;
59 private Filter filter;
60
61 public SkipFilter(Filter filter) {
62 this.filter = filter;
63 }
64
65 public Filter getFilter() {
66 return filter;
67 }
68
69 @Override
70 public void reset() throws IOException {
71 filter.reset();
72 filterRow = false;
73 }
74
75 private void changeFR(boolean value) {
76 filterRow = filterRow || value;
77 }
78
79 @Override
80 public ReturnCode filterKeyValue(Cell v) throws IOException {
81 ReturnCode c = filter.filterKeyValue(v);
82 changeFR(c != ReturnCode.INCLUDE);
83 return c;
84 }
85
86 @Override
87 public Cell transformCell(Cell v) throws IOException {
88 return filter.transformCell(v);
89 }
90
91 @Override
92 public boolean filterRow() {
93 return filterRow;
94 }
95
96 @Override
97 public boolean hasFilterRow() {
98 return true;
99 }
100
101
102
103
104 @Override
105 public byte[] toByteArray() throws IOException {
106 FilterProtos.SkipFilter.Builder builder =
107 FilterProtos.SkipFilter.newBuilder();
108 builder.setFilter(ProtobufUtil.toFilter(this.filter));
109 return builder.build().toByteArray();
110 }
111
112
113
114
115
116
117
118 public static SkipFilter parseFrom(final byte [] pbBytes)
119 throws DeserializationException {
120 FilterProtos.SkipFilter proto;
121 try {
122 proto = FilterProtos.SkipFilter.parseFrom(pbBytes);
123 } catch (InvalidProtocolBufferException e) {
124 throw new DeserializationException(e);
125 }
126 try {
127 return new SkipFilter(ProtobufUtil.toFilter(proto.getFilter()));
128 } catch (IOException ioe) {
129 throw new DeserializationException(ioe);
130 }
131 }
132
133
134
135
136
137
138 @Override
139 boolean areSerializedFieldsEqual(Filter o) {
140 if (o == this) return true;
141 if (!(o instanceof SkipFilter)) return false;
142
143 SkipFilter other = (SkipFilter)o;
144 return getFilter().areSerializedFieldsEqual(other.getFilter());
145 }
146
147 @Override
148 public boolean isFamilyEssential(byte[] name) throws IOException {
149 return filter.isFamilyEssential(name);
150 }
151
152 @Override
153 public String toString() {
154 return this.getClass().getSimpleName() + " " + this.filter.toString();
155 }
156
157 @Override
158 public boolean equals(Object obj) {
159 return obj instanceof Filter && areSerializedFieldsEqual((Filter) obj);
160 }
161
162 @Override
163 public int hashCode() {
164 return Objects.hash(this.filter);
165 }
166 }