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.ArrayList;
24 import java.util.List;
25
26 import org.apache.hadoop.hbase.Cell;
27 import org.apache.hadoop.hbase.KeyValue;
28 import org.apache.hadoop.hbase.classification.InterfaceAudience;
29
30
31
32
33
34 @InterfaceAudience.Private
35 public abstract class FilterListBase extends FilterBase {
36 private static final int MAX_LOG_FILTERS = 5;
37 protected final ArrayList<Filter> filters;
38
39
40
41
42
43
44 protected ArrayList<Boolean> subFiltersIncludedCell;
45
46 public FilterListBase(List<Filter> filters) {
47 reversed = checkAndGetReversed(filters, reversed);
48 this.filters = new ArrayList<Filter>(filters);
49 }
50
51 protected static boolean isInReturnCodes(ReturnCode testRC, ReturnCode... returnCodes) {
52 for (ReturnCode rc : returnCodes) {
53 if (testRC.equals(rc)) return true;
54 }
55 return false;
56 }
57
58 protected static boolean checkAndGetReversed(List<Filter> rowFilters, boolean defaultValue) {
59 if (rowFilters.isEmpty()) {
60 return defaultValue;
61 }
62 boolean retValue = rowFilters.get(0).isReversed();
63 for (Filter filter : rowFilters) {
64 if (filter.isReversed() != retValue) {
65 throw new IllegalArgumentException("Filters in the list must have the same reversed flag");
66 }
67 }
68 return retValue;
69 }
70
71 public abstract void addFilterLists(List<Filter> filters);
72
73 public int size() {
74 return this.filters.size();
75 }
76
77 public boolean isEmpty() {
78 return this.filters.isEmpty();
79 }
80
81 public ArrayList<Filter> getFilters() {
82 return this.filters;
83 }
84
85 protected int compareCell(Cell a, Cell b) {
86 int cmp = KeyValue.COMPARATOR.compare(a, b);
87 return reversed ? -1 * cmp : cmp;
88 }
89
90
91
92
93
94
95
96
97
98
99
100 @Override
101 public Cell transformCell(Cell c) throws IOException {
102 Cell transformed = c;
103 for (int i = 0, n = filters.size(); i < n; i++) {
104 if (subFiltersIncludedCell.get(i)) {
105 transformed = filters.get(i).transformCell(transformed);
106 }
107 }
108 return transformed;
109 }
110
111
112
113
114
115 @Override
116 public void filterRowCells(List<Cell> cells) throws IOException {
117 for (int i = 0, n = filters.size(); i < n; i++) {
118 filters.get(i).filterRowCells(cells);
119 }
120 }
121
122 @Override
123 public boolean hasFilterRow() {
124 for (int i = 0, n = filters.size(); i < n; i++) {
125 if (filters.get(i).hasFilterRow()) {
126 return true;
127 }
128 }
129 return false;
130 }
131
132 @Override
133 public boolean isFamilyEssential(byte[] name) throws IOException {
134 if (this.filters.isEmpty()) {
135 return super.isFamilyEssential(name);
136 }
137 for (int i = 0, n = filters.size(); i < n; i++) {
138 if (filters.get(i).isFamilyEssential(name)) {
139 return true;
140 }
141 }
142 return false;
143 }
144
145 @Override
146 public void setReversed(boolean reversed) {
147 for (int i = 0, n = filters.size(); i < n; i++) {
148 filters.get(i).setReversed(reversed);
149 }
150 this.reversed = reversed;
151 }
152
153 @Override
154 public String toString() {
155 int endIndex = this.size() < MAX_LOG_FILTERS ? this.size() : MAX_LOG_FILTERS;
156 return formatLogFilters(filters.subList(0, endIndex));
157 }
158
159 protected abstract String formatLogFilters(List<Filter> logFilters);
160 }