1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.client;
20
21
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.NavigableSet;
28 import java.util.Set;
29 import java.util.TreeMap;
30 import java.util.TreeSet;
31
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34 import org.apache.hadoop.hbase.classification.InterfaceAudience;
35 import org.apache.hadoop.hbase.classification.InterfaceStability;
36 import org.apache.hadoop.hbase.HConstants;
37 import org.apache.hadoop.hbase.filter.Filter;
38 import org.apache.hadoop.hbase.io.TimeRange;
39 import org.apache.hadoop.hbase.security.access.Permission;
40 import org.apache.hadoop.hbase.security.visibility.Authorizations;
41 import org.apache.hadoop.hbase.util.Bytes;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 @InterfaceAudience.Public
67 @InterfaceStability.Stable
68 public class Get extends Query
69 implements Row, Comparable<Row> {
70 private static final Log LOG = LogFactory.getLog(Get.class);
71
72 private byte [] row = null;
73 private int maxVersions = 1;
74 private boolean cacheBlocks = true;
75 private int storeLimit = -1;
76 private int storeOffset = 0;
77 private TimeRange tr = new TimeRange();
78 private boolean checkExistenceOnly = false;
79 private boolean closestRowBefore = false;
80 private Map<byte [], NavigableSet<byte []>> familyMap =
81 new TreeMap<byte [], NavigableSet<byte []>>(Bytes.BYTES_COMPARATOR);
82
83
84
85
86
87
88
89
90 public Get(byte [] row) {
91 Mutation.checkRow(row);
92 this.row = row;
93 }
94
95
96
97
98
99
100 public Get(Get get) {
101 this(get.getRow());
102
103 this.setFilter(get.getFilter());
104 this.setReplicaId(get.getReplicaId());
105 this.setConsistency(get.getConsistency());
106
107 this.cacheBlocks = get.getCacheBlocks();
108 this.maxVersions = get.getMaxVersions();
109 this.storeLimit = get.getMaxResultsPerColumnFamily();
110 this.storeOffset = get.getRowOffsetPerColumnFamily();
111 this.tr = get.getTimeRange();
112 this.checkExistenceOnly = get.isCheckExistenceOnly();
113 this.loadColumnFamiliesOnDemand = get.getLoadColumnFamiliesOnDemandValue();
114 this.closestRowBefore = get.isClosestRowBefore();
115 Map<byte[], NavigableSet<byte[]>> fams = get.getFamilyMap();
116 for (Map.Entry<byte[],NavigableSet<byte[]>> entry : fams.entrySet()) {
117 byte [] fam = entry.getKey();
118 NavigableSet<byte[]> cols = entry.getValue();
119 if (cols != null && cols.size() > 0) {
120 for (byte[] col : cols) {
121 addColumn(fam, col);
122 }
123 } else {
124 addFamily(fam);
125 }
126 }
127 for (Map.Entry<String, byte[]> attr : get.getAttributesMap().entrySet()) {
128 setAttribute(attr.getKey(), attr.getValue());
129 }
130 for (Map.Entry<byte[], TimeRange> entry : get.getColumnFamilyTimeRange().entrySet()) {
131 TimeRange tr = entry.getValue();
132 setColumnFamilyTimeRange(entry.getKey(), tr.getMin(), tr.getMax());
133 }
134 super.setPriority(get.getPriority());
135 }
136
137 public boolean isCheckExistenceOnly() {
138 return checkExistenceOnly;
139 }
140
141 public Get setCheckExistenceOnly(boolean checkExistenceOnly) {
142 this.checkExistenceOnly = checkExistenceOnly;
143 return this;
144 }
145
146 public boolean isClosestRowBefore() {
147 return closestRowBefore;
148 }
149
150 public Get setClosestRowBefore(boolean closestRowBefore) {
151 this.closestRowBefore = closestRowBefore;
152 return this;
153 }
154
155
156
157
158
159
160
161
162 public Get addFamily(byte [] family) {
163 familyMap.remove(family);
164 familyMap.put(family, null);
165 return this;
166 }
167
168
169
170
171
172
173
174
175
176 public Get addColumn(byte [] family, byte [] qualifier) {
177 NavigableSet<byte []> set = familyMap.get(family);
178 if(set == null) {
179 set = new TreeSet<byte []>(Bytes.BYTES_COMPARATOR);
180 familyMap.put(family, set);
181 }
182 if (qualifier == null) {
183 qualifier = HConstants.EMPTY_BYTE_ARRAY;
184 }
185 set.add(qualifier);
186 return this;
187 }
188
189
190
191
192
193
194
195
196
197 public Get setTimeRange(long minStamp, long maxStamp) throws IOException {
198 tr = new TimeRange(minStamp, maxStamp);
199 return this;
200 }
201
202
203
204
205
206
207 public Get setTimeStamp(long timestamp)
208 throws IOException {
209 try {
210 tr = new TimeRange(timestamp, timestamp+1);
211 } catch(Exception e) {
212
213 LOG.error("TimeRange failed, likely caused by integer overflow. ", e);
214 throw e;
215 }
216 return this;
217 }
218
219 @Override public Get setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp) {
220 return (Get) super.setColumnFamilyTimeRange(cf, minStamp, maxStamp);
221 }
222
223
224
225
226
227 public Get setMaxVersions() {
228 this.maxVersions = Integer.MAX_VALUE;
229 return this;
230 }
231
232
233
234
235
236
237
238 public Get setMaxVersions(int maxVersions) throws IOException {
239 if(maxVersions <= 0) {
240 throw new IOException("maxVersions must be positive");
241 }
242 this.maxVersions = maxVersions;
243 return this;
244 }
245
246 @Override
247 public Get setLoadColumnFamiliesOnDemand(boolean value) {
248 return (Get) super.setLoadColumnFamiliesOnDemand(value);
249 }
250
251
252
253
254
255
256 public Get setMaxResultsPerColumnFamily(int limit) {
257 this.storeLimit = limit;
258 return this;
259 }
260
261
262
263
264
265
266
267 public Get setRowOffsetPerColumnFamily(int offset) {
268 this.storeOffset = offset;
269 return this;
270 }
271
272 @Override
273 public Get setFilter(Filter filter) {
274 super.setFilter(filter);
275 return this;
276 }
277
278
279
280
281
282
283
284
285
286
287
288
289
290 public Get setCacheBlocks(boolean cacheBlocks) {
291 this.cacheBlocks = cacheBlocks;
292 return this;
293 }
294
295
296
297
298
299
300 public boolean getCacheBlocks() {
301 return cacheBlocks;
302 }
303
304
305
306
307
308 @Override
309 public byte [] getRow() {
310 return this.row;
311 }
312
313
314
315
316
317 public int getMaxVersions() {
318 return this.maxVersions;
319 }
320
321
322
323
324
325
326 public int getMaxResultsPerColumnFamily() {
327 return this.storeLimit;
328 }
329
330
331
332
333
334
335 public int getRowOffsetPerColumnFamily() {
336 return this.storeOffset;
337 }
338
339
340
341
342
343 public TimeRange getTimeRange() {
344 return this.tr;
345 }
346
347
348
349
350
351 public Set<byte[]> familySet() {
352 return this.familyMap.keySet();
353 }
354
355
356
357
358
359 public int numFamilies() {
360 return this.familyMap.size();
361 }
362
363
364
365
366
367 public boolean hasFamilies() {
368 return !this.familyMap.isEmpty();
369 }
370
371
372
373
374
375 public Map<byte[],NavigableSet<byte[]>> getFamilyMap() {
376 return this.familyMap;
377 }
378
379
380
381
382
383
384
385 @Override
386 public Map<String, Object> getFingerprint() {
387 Map<String, Object> map = new HashMap<String, Object>();
388 List<String> families = new ArrayList<String>();
389 map.put("families", families);
390 for (Map.Entry<byte [], NavigableSet<byte[]>> entry :
391 this.familyMap.entrySet()) {
392 families.add(Bytes.toStringBinary(entry.getKey()));
393 }
394 return map;
395 }
396
397
398
399
400
401
402
403
404 @Override
405 public Map<String, Object> toMap(int maxCols) {
406
407 Map<String, Object> map = getFingerprint();
408
409
410 Map<String, List<String>> columns = new HashMap<String, List<String>>();
411 map.put("families", columns);
412
413 map.put("row", Bytes.toStringBinary(this.row));
414 map.put("maxVersions", this.maxVersions);
415 map.put("cacheBlocks", this.cacheBlocks);
416 List<Long> timeRange = new ArrayList<Long>();
417 timeRange.add(this.tr.getMin());
418 timeRange.add(this.tr.getMax());
419 map.put("timeRange", timeRange);
420 int colCount = 0;
421
422 for (Map.Entry<byte [], NavigableSet<byte[]>> entry :
423 this.familyMap.entrySet()) {
424 List<String> familyList = new ArrayList<String>();
425 columns.put(Bytes.toStringBinary(entry.getKey()), familyList);
426 if(entry.getValue() == null) {
427 colCount++;
428 --maxCols;
429 familyList.add("ALL");
430 } else {
431 colCount += entry.getValue().size();
432 if (maxCols <= 0) {
433 continue;
434 }
435 for (byte [] column : entry.getValue()) {
436 if (--maxCols <= 0) {
437 continue;
438 }
439 familyList.add(Bytes.toStringBinary(column));
440 }
441 }
442 }
443 map.put("totalColumns", colCount);
444 if (this.filter != null) {
445 map.put("filter", this.filter.toString());
446 }
447
448 if (getId() != null) {
449 map.put("id", getId());
450 }
451 return map;
452 }
453
454
455 @Override
456 public int compareTo(Row other) {
457
458 return Bytes.compareTo(this.getRow(), other.getRow());
459 }
460
461 @Override
462 public int hashCode() {
463
464
465 return Bytes.hashCode(this.getRow());
466 }
467
468 @Override
469 public boolean equals(Object obj) {
470 if (this == obj) {
471 return true;
472 }
473 if (obj == null || getClass() != obj.getClass()) {
474 return false;
475 }
476 Row other = (Row) obj;
477
478 return compareTo(other) == 0;
479 }
480
481 @Override
482 public Get setAttribute(String name, byte[] value) {
483 return (Get) super.setAttribute(name, value);
484 }
485
486 @Override
487 public Get setId(String id) {
488 return (Get) super.setId(id);
489 }
490
491 @Override
492 public Get setAuthorizations(Authorizations authorizations) {
493 return (Get) super.setAuthorizations(authorizations);
494 }
495
496 @Override
497 public Get setACL(Map<String, Permission> perms) {
498 return (Get) super.setACL(perms);
499 }
500
501 @Override
502 public Get setACL(String user, Permission perms) {
503 return (Get) super.setACL(user, perms);
504 }
505
506 @Override
507 public Get setConsistency(Consistency consistency) {
508 return (Get) super.setConsistency(consistency);
509 }
510
511 @Override
512 public Get setReplicaId(int Id) {
513 return (Get) super.setReplicaId(Id);
514 }
515
516 @Override
517 public Get setIsolationLevel(IsolationLevel level) {
518 return (Get) super.setIsolationLevel(level);
519 }
520
521 @Override
522 public Get setPriority(int priority) {
523 return (Get) super.setPriority(priority);
524 }
525
526 }