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