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.hbql.filter;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.apache.hadoop.conf.Configuration;
25 import org.apache.hadoop.hbase.HBaseConfiguration;
26 import org.apache.hadoop.hbase.KeyValue;
27 import org.apache.hadoop.hbase.filter.Filter;
28 import org.apache.hadoop.hbase.io.HbaseObjectWritable;
29 import org.apache.hadoop.io.Writable;
30
31 import java.io.DataInput;
32 import java.io.DataOutput;
33 import java.io.IOException;
34 import java.util.ArrayList;
35 import java.util.List;
36
37
38
39
40
41
42
43
44
45
46 public class RecordFilterList implements Filter {
47
48 private static final Log LOG = LogFactory.getLog(RecordFilterList.class);
49
50
51
52
53 public static enum Operator {
54
55
56
57 MUST_PASS_ALL,
58
59
60
61 MUST_PASS_ONE
62 }
63
64 private Operator operator = Operator.MUST_PASS_ALL;
65 private List<Filter> filters = new ArrayList<Filter>();
66
67
68
69
70
71 public RecordFilterList() {
72 super();
73 }
74
75
76
77
78
79
80
81 public RecordFilterList(final List<Filter> rowFilters) {
82 this.filters = rowFilters;
83 }
84
85
86
87
88
89
90 public RecordFilterList(final Operator operator) {
91 this.operator = operator;
92 }
93
94
95
96
97
98
99
100 public RecordFilterList(final Operator operator, final List<Filter> rowFilters) {
101 this.filters = rowFilters;
102 this.operator = operator;
103 }
104
105
106
107
108
109
110 public Operator getOperator() {
111 return operator;
112 }
113
114
115
116
117
118
119 public List<Filter> getFilters() {
120 return filters;
121 }
122
123
124
125
126
127
128 public void addFilter(Filter filter) {
129 this.filters.add(filter);
130 }
131
132 public void reset() {
133 for (Filter filter : filters) {
134 filter.reset();
135 }
136 }
137
138 public boolean filterRowKey(byte[] rowKey, int offset, int length) {
139 for (Filter filter : filters) {
140 if (this.operator == Operator.MUST_PASS_ALL) {
141 if (filter.filterAllRemaining() ||
142 filter.filterRowKey(rowKey, offset, length)) {
143 return true;
144 }
145 }
146 else if (this.operator == Operator.MUST_PASS_ONE) {
147 if (!filter.filterAllRemaining() &&
148 !filter.filterRowKey(rowKey, offset, length)) {
149 return false;
150 }
151 }
152 }
153 return this.operator == Operator.MUST_PASS_ONE;
154 }
155
156 public boolean filterAllRemaining() {
157 for (Filter filter : filters) {
158 if (filter.filterAllRemaining()) {
159 if (operator == Operator.MUST_PASS_ALL) {
160 return true;
161 }
162 }
163 else {
164 if (operator == Operator.MUST_PASS_ONE) {
165 return false;
166 }
167 }
168 }
169 return operator == Operator.MUST_PASS_ONE;
170 }
171
172 public ReturnCode filterKeyValue(KeyValue v) {
173
174 for (Filter filter : filters) {
175 if (operator == Operator.MUST_PASS_ALL) {
176 if (filter.filterAllRemaining()) {
177 return ReturnCode.NEXT_ROW;
178 }
179 switch (filter.filterKeyValue(v)) {
180 case INCLUDE:
181 continue;
182 case NEXT_ROW:
183 return ReturnCode.NEXT_ROW;
184 case SKIP:
185 return ReturnCode.SKIP;
186 }
187 }
188 else if (operator == Operator.MUST_PASS_ONE) {
189 if (filter.filterAllRemaining()) {
190 continue;
191 }
192
193 switch (filter.filterKeyValue(v)) {
194 case INCLUDE:
195
196 case NEXT_ROW:
197 case SKIP:
198 continue;
199 }
200 }
201 }
202 return
203 }
204
205 public boolean filterRow() {
206 for (Filter filter : filters) {
207 if (operator == Operator.MUST_PASS_ALL) {
208 if (filter.filterAllRemaining() || filter.filterRow()) {
209 return true;
210 }
211 }
212 else if (operator == Operator.MUST_PASS_ONE) {
213 if (!filter.filterAllRemaining()
214 && !filter.filterRow()) {
215 return false;
216 }
217 }
218 }
219 return operator == Operator.MUST_PASS_ONE;
220 }
221
222 public void readFields(final DataInput in) throws IOException {
223 Configuration conf = new HBaseConfiguration();
224 byte opByte = in.readByte();
225 operator = Operator.values()[opByte];
226 int size = in.readInt();
227 if (size > 0) {
228 filters = new ArrayList<Filter>(size);
229 for (int i = 0; i < size; i++) {
230 Filter filter = (Filter)HbaseObjectWritable.readObject(in, conf);
231 filters.add(filter);
232 }
233 }
234 }
235
236 public void write(final DataOutput out) throws IOException {
237 Configuration conf = new HBaseConfiguration();
238 out.writeByte(operator.ordinal());
239 out.writeInt(filters.size());
240 for (Filter filter : filters) {
241 HbaseObjectWritable.writeObject(out, filter, Writable.class, conf);
242 }
243 }
244 }