1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.filter;
20
21 import org.apache.hadoop.hbase.classification.InterfaceAudience;
22 import org.apache.hadoop.hbase.classification.InterfaceStability;
23 import org.apache.hadoop.hbase.Cell;
24 import org.apache.hadoop.hbase.CellUtil;
25 import org.apache.hadoop.hbase.exceptions.DeserializationException;
26 import org.apache.hadoop.hbase.protobuf.generated.FilterProtos;
27 import org.apache.hadoop.hbase.util.ByteStringer;
28 import org.apache.hadoop.hbase.util.Bytes;
29
30 import com.google.protobuf.ByteString;
31 import com.google.protobuf.InvalidProtocolBufferException;
32
33 import java.util.Set;
34 import java.util.TreeSet;
35
36
37
38
39
40
41
42
43
44
45
46
47 @InterfaceAudience.Public
48 @InterfaceStability.Stable
49 public class FirstKeyValueMatchingQualifiersFilter extends FirstKeyOnlyFilter {
50
51 private Set<byte []> qualifiers;
52
53
54
55
56
57
58
59 public FirstKeyValueMatchingQualifiersFilter(Set<byte []> qualifiers) {
60 this.qualifiers = qualifiers;
61 }
62
63 @Override
64 public ReturnCode filterKeyValue(Cell v) {
65 if (hasFoundKV()) {
66 return ReturnCode.NEXT_ROW;
67 } else if (hasOneMatchingQualifier(v)) {
68 setFoundKV(true);
69 }
70 return ReturnCode.INCLUDE;
71 }
72
73 private boolean hasOneMatchingQualifier(Cell v) {
74 for (byte[] q : qualifiers) {
75 if (CellUtil.matchingQualifier(v, q)) {
76 return true;
77 }
78 }
79 return false;
80 }
81
82
83
84
85 @Override
86 public byte [] toByteArray() {
87 FilterProtos.FirstKeyValueMatchingQualifiersFilter.Builder builder =
88 FilterProtos.FirstKeyValueMatchingQualifiersFilter.newBuilder();
89 for (byte[] qualifier : qualifiers) {
90 if (qualifier != null) builder.addQualifiers(ByteStringer.wrap(qualifier));
91 }
92 return builder.build().toByteArray();
93 }
94
95
96
97
98
99
100
101 public static FirstKeyValueMatchingQualifiersFilter parseFrom(final byte [] pbBytes)
102 throws DeserializationException {
103 FilterProtos.FirstKeyValueMatchingQualifiersFilter proto;
104 try {
105 proto = FilterProtos.FirstKeyValueMatchingQualifiersFilter.parseFrom(pbBytes);
106 } catch (InvalidProtocolBufferException e) {
107 throw new DeserializationException(e);
108 }
109
110 TreeSet<byte []> qualifiers = new TreeSet<byte []>(Bytes.BYTES_COMPARATOR);
111 for (ByteString qualifier : proto.getQualifiersList()) {
112 qualifiers.add(qualifier.toByteArray());
113 }
114 return new FirstKeyValueMatchingQualifiersFilter(qualifiers);
115 }
116
117
118
119
120
121
122 @Override
123 boolean areSerializedFieldsEqual(Filter o) {
124 if (o == this) return true;
125 if (!(o instanceof FirstKeyValueMatchingQualifiersFilter)) return false;
126
127 FirstKeyValueMatchingQualifiersFilter other = (FirstKeyValueMatchingQualifiersFilter)o;
128 return this.qualifiers.equals(other.qualifiers);
129 }
130 }