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 public byte [] toByteArray() {
86 FilterProtos.FirstKeyValueMatchingQualifiersFilter.Builder builder =
87 FilterProtos.FirstKeyValueMatchingQualifiersFilter.newBuilder();
88 for (byte[] qualifier : qualifiers) {
89 if (qualifier != null) builder.addQualifiers(ByteStringer.wrap(qualifier));
90 }
91 return builder.build().toByteArray();
92 }
93
94
95
96
97
98
99
100 public static FirstKeyValueMatchingQualifiersFilter parseFrom(final byte [] pbBytes)
101 throws DeserializationException {
102 FilterProtos.FirstKeyValueMatchingQualifiersFilter proto;
103 try {
104 proto = FilterProtos.FirstKeyValueMatchingQualifiersFilter.parseFrom(pbBytes);
105 } catch (InvalidProtocolBufferException e) {
106 throw new DeserializationException(e);
107 }
108
109 TreeSet<byte []> qualifiers = new TreeSet<byte []>(Bytes.BYTES_COMPARATOR);
110 for (ByteString qualifier : proto.getQualifiersList()) {
111 qualifiers.add(qualifier.toByteArray());
112 }
113 return new FirstKeyValueMatchingQualifiersFilter(qualifiers);
114 }
115
116
117
118
119
120
121 boolean areSerializedFieldsEqual(Filter o) {
122 if (o == this) return true;
123 if (!(o instanceof FirstKeyValueMatchingQualifiersFilter)) return false;
124
125 FirstKeyValueMatchingQualifiersFilter other = (FirstKeyValueMatchingQualifiersFilter)o;
126 return this.qualifiers.equals(other.qualifiers);
127 }
128 }