1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.hadoop.hbase.regionserver;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.apache.hadoop.hbase.HConstants;
26 import org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode;
27 import org.apache.hadoop.hbase.util.Bytes;
28
29
30
31
32 public class ScanWildcardColumnTracker implements ColumnTracker {
33 private static final Log LOG =
34 LogFactory.getLog(ScanWildcardColumnTracker.class);
35 private byte [] columnBuffer = null;
36 private int columnOffset = 0;
37 private int columnLength = 0;
38 private int currentCount = 0;
39 private int maxVersions;
40
41
42 private long latestTSOfCurrentColumn;
43
44
45
46
47
48 public ScanWildcardColumnTracker(int maxVersion) {
49 this.maxVersions = maxVersion;
50 }
51
52
53
54
55
56
57
58
59
60
61
62
63 @Override
64 public MatchCode checkColumn(byte[] bytes, int offset, int length,
65 long timestamp) {
66 if (columnBuffer == null) {
67
68 columnBuffer = bytes;
69 columnOffset = offset;
70 columnLength = length;
71 currentCount = 0;
72
73 if (++currentCount > maxVersions) {
74 return ScanQueryMatcher.MatchCode.SEEK_NEXT_COL;
75 }
76 setTS(timestamp);
77 return ScanQueryMatcher.MatchCode.INCLUDE;
78 }
79 int cmp = Bytes.compareTo(bytes, offset, length,
80 columnBuffer, columnOffset, columnLength);
81 if (cmp == 0) {
82
83 if (sameAsPreviousTS(timestamp)) {
84 return ScanQueryMatcher.MatchCode.SKIP;
85 }
86 if (++currentCount > maxVersions) {
87 return ScanQueryMatcher.MatchCode.SEEK_NEXT_COL;
88 }
89 setTS(timestamp);
90 return ScanQueryMatcher.MatchCode.INCLUDE;
91 }
92
93 resetTS();
94
95
96 if (cmp > 0) {
97
98 columnBuffer = bytes;
99 columnOffset = offset;
100 columnLength = length;
101 currentCount = 0;
102 if (++currentCount > maxVersions)
103 return ScanQueryMatcher.MatchCode.SEEK_NEXT_COL;
104 setTS(timestamp);
105 return ScanQueryMatcher.MatchCode.INCLUDE;
106 }
107
108
109
110
111
112
113 LOG.error("ScanWildcardColumnTracker.checkColumn ran " +
114 "into a column actually smaller than the previous column: " +
115 Bytes.toStringBinary(bytes, offset, length));
116
117 columnBuffer = bytes;
118 columnOffset = offset;
119 columnLength = length;
120 currentCount = 0;
121 if (++currentCount > maxVersions) {
122 return ScanQueryMatcher.MatchCode.SEEK_NEXT_COL;
123 }
124 setTS(timestamp);
125 return ScanQueryMatcher.MatchCode.INCLUDE;
126 }
127
128 @Override
129 public void update() {
130
131 throw new UnsupportedOperationException(
132 "ScanWildcardColumnTracker.update should never be called!");
133 }
134
135 @Override
136 public void reset() {
137 columnBuffer = null;
138 resetTS();
139 }
140
141 private void resetTS() {
142 latestTSOfCurrentColumn = HConstants.LATEST_TIMESTAMP;
143 }
144
145 private void setTS(long timestamp) {
146 latestTSOfCurrentColumn = timestamp;
147 }
148
149 private boolean sameAsPreviousTS(long timestamp) {
150 return timestamp == latestTSOfCurrentColumn;
151 }
152
153
154
155
156
157
158
159
160 public ColumnCount getColumnHint() {
161 return null;
162 }
163
164
165
166
167
168
169 @Override
170 public boolean done() {
171 return false;
172 }
173 }