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