1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver.querymatcher;
19
20 import java.io.IOException;
21
22 import org.apache.hadoop.hbase.Cell;
23 import org.apache.hadoop.hbase.CellUtil;
24 import org.apache.hadoop.hbase.KeepDeletedCells;
25 import org.apache.hadoop.hbase.classification.InterfaceAudience;
26 import org.apache.hadoop.hbase.client.Scan;
27 import org.apache.hadoop.hbase.regionserver.DeleteTracker;
28 import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;
29 import org.apache.hadoop.hbase.regionserver.ScanInfo;
30
31
32
33
34 @InterfaceAudience.Private
35 public abstract class NormalUserScanQueryMatcher extends UserScanQueryMatcher {
36
37
38 private final DeleteTracker deletes;
39
40
41 private final boolean get;
42
43
44 private final boolean seePastDeleteMarkers;
45
46 protected NormalUserScanQueryMatcher(Scan scan, ScanInfo scanInfo, ColumnTracker columns,
47 boolean hasNullColumn, DeleteTracker deletes, long oldestUnexpiredTS, long now) {
48 super(scan, scanInfo, columns, hasNullColumn, oldestUnexpiredTS, now);
49 this.deletes = deletes;
50 this.get = scan.isGetScan();
51 this.seePastDeleteMarkers = scanInfo.getKeepDeletedCells() != KeepDeletedCells.FALSE;
52 }
53
54 @Override
55 public MatchCode match(Cell cell) throws IOException {
56 if (filter != null && filter.filterAllRemaining()) {
57 return MatchCode.DONE_SCAN;
58 }
59 MatchCode returnCode = preCheck(cell);
60 if (returnCode != null) {
61 return returnCode;
62 }
63 long timestamp = cell.getTimestamp();
64 byte typeByte = cell.getTypeByte();
65 if (CellUtil.isDelete(typeByte)) {
66 boolean includeDeleteMarker = seePastDeleteMarkers ? tr.withinTimeRange(timestamp)
67 : tr.withinOrAfterTimeRange(timestamp);
68 if (includeDeleteMarker) {
69 this.deletes.add(cell);
70 }
71 return MatchCode.SKIP;
72 }
73 returnCode = checkDeleted(deletes, cell);
74 if (returnCode != null) {
75 return returnCode;
76 }
77 return matchColumn(cell, timestamp, typeByte);
78 }
79
80 @Override
81 protected void reset() {
82 deletes.reset();
83 }
84
85 @Override
86 protected boolean isGet() {
87 return get;
88 }
89
90 public static NormalUserScanQueryMatcher create(Scan scan, ScanInfo scanInfo,
91 ColumnTracker columns, boolean hasNullColumn, long oldestUnexpiredTS, long now,
92 RegionCoprocessorHost regionCoprocessorHost) throws IOException {
93 DeleteTracker deletes = instantiateDeleteTracker(regionCoprocessorHost);
94 if (scan.isReversed()) {
95 if (scan.includeStopRow()) {
96 return new NormalUserScanQueryMatcher(scan, scanInfo, columns, hasNullColumn, deletes,
97 oldestUnexpiredTS, now) {
98
99 @Override
100 protected boolean moreRowsMayExistsAfter(int cmpToStopRow) {
101 return cmpToStopRow >= 0;
102 }
103 };
104 } else {
105 return new NormalUserScanQueryMatcher(scan, scanInfo, columns, hasNullColumn, deletes,
106 oldestUnexpiredTS, now) {
107
108 @Override
109 protected boolean moreRowsMayExistsAfter(int cmpToStopRow) {
110 return cmpToStopRow > 0;
111 }
112 };
113 }
114 } else {
115 if (scan.includeStopRow()) {
116 return new NormalUserScanQueryMatcher(scan, scanInfo, columns, hasNullColumn, deletes,
117 oldestUnexpiredTS, now) {
118
119 @Override
120 protected boolean moreRowsMayExistsAfter(int cmpToStopRow) {
121 return cmpToStopRow <= 0;
122 }
123 };
124 } else {
125 return new NormalUserScanQueryMatcher(scan, scanInfo, columns, hasNullColumn, deletes,
126 oldestUnexpiredTS, now) {
127
128 @Override
129 protected boolean moreRowsMayExistsAfter(int cmpToStopRow) {
130 return cmpToStopRow < 0;
131 }
132 };
133 }
134 }
135 }
136 }