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.DataInput;
23 import java.io.DataOutput;
24 import java.io.IOException;
25 import java.util.HashSet;
26 import java.util.Iterator;
27 import java.util.List;
28 import java.util.Set;
29
30 import org.apache.hadoop.hbase.KeyValue;
31 import org.apache.hadoop.hbase.util.Bytes;
32
33
34
35
36
37
38
39
40 public class DependentColumnFilter extends CompareFilter {
41
42 protected byte[] columnFamily;
43 protected byte[] columnQualifier;
44 protected boolean dropDependentColumn;
45
46 protected Set<Long> stampSet = new HashSet<Long>();
47
48
49
50
51 public DependentColumnFilter() {
52 }
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public DependentColumnFilter(final byte [] family, final byte[] qualifier,
67 final boolean dropDependentColumn, final CompareOp valueCompareOp,
68 final WritableByteArrayComparable valueComparator) {
69
70 super(valueCompareOp, valueComparator);
71 this.columnFamily = family;
72 this.columnQualifier = qualifier;
73 this.dropDependentColumn = dropDependentColumn;
74 }
75
76
77
78
79
80
81
82
83
84 public DependentColumnFilter(final byte [] family, final byte [] qualifier) {
85 this(family, qualifier, false);
86 }
87
88
89
90
91
92
93
94
95
96
97 public DependentColumnFilter(final byte [] family, final byte [] qualifier,
98 final boolean dropDependentColumn) {
99 this(family, qualifier, dropDependentColumn, CompareOp.NO_OP, null);
100 }
101
102
103 @Override
104 public boolean filterAllRemaining() {
105 return false;
106 }
107
108 @Override
109 public ReturnCode filterKeyValue(KeyValue v) {
110
111 if (!v.matchingColumn(this.columnFamily, this.columnQualifier)) {
112
113 return ReturnCode.INCLUDE;
114 }
115
116 if(comparator != null && doCompare(compareOp, comparator, v.getValue(), 0, v.getValueLength()))
117 return ReturnCode.SKIP;
118
119 stampSet.add(v.getTimestamp());
120 if(dropDependentColumn) {
121 return ReturnCode.SKIP;
122 }
123 return ReturnCode.INCLUDE;
124 }
125
126 @Override
127 public void filterRow(List<KeyValue> kvs) {
128 Iterator<KeyValue> it = kvs.iterator();
129 KeyValue kv;
130 while(it.hasNext()) {
131 kv = it.next();
132 if(!stampSet.contains(kv.getTimestamp())) {
133 it.remove();
134 }
135 }
136 }
137
138 @Override
139 public boolean hasFilterRow() {
140 return true;
141 }
142
143 @Override
144 public boolean filterRow() {
145 return false;
146 }
147
148 @Override
149 public boolean filterRowKey(byte[] buffer, int offset, int length) {
150 return false;
151 }
152
153 @Override
154 public void reset() {
155 stampSet.clear();
156 }
157
158 @Override
159 public void readFields(DataInput in) throws IOException {
160 super.readFields(in);
161 this.columnFamily = Bytes.readByteArray(in);
162 if(this.columnFamily.length == 0) {
163 this.columnFamily = null;
164 }
165
166 this.columnQualifier = Bytes.readByteArray(in);
167 if(this.columnQualifier.length == 0) {
168 this.columnQualifier = null;
169 }
170
171 this.dropDependentColumn = in.readBoolean();
172 }
173
174 @Override
175 public void write(DataOutput out) throws IOException {
176 super.write(out);
177 Bytes.writeByteArray(out, this.columnFamily);
178 Bytes.writeByteArray(out, this.columnQualifier);
179 out.writeBoolean(this.dropDependentColumn);
180 }
181
182 }