1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.client;
19
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import org.apache.hadoop.hbase.classification.InterfaceAudience;
25 import org.apache.hadoop.hbase.util.Bytes;
26
27
28
29
30 @InterfaceAudience.Private
31 class CompleteScanResultCache extends ScanResultCache {
32
33 private final List<Result> partialResults = new ArrayList<>();
34
35 public CompleteScanResultCache(List<Result> cache) {
36 super(cache);
37 }
38
39 private Result combine() throws IOException {
40 Result result = Result.createCompleteResult(partialResults);
41 partialResults.clear();
42 return result;
43 }
44
45 private void prependCombinedAndCache(Result[] results, int length) throws IOException {
46 if (length == 0) {
47 checkUpdateNumberOfCompleteRowsAndCache(combine());
48 return;
49 }
50
51
52 int start = 0;
53 if (Bytes.equals(partialResults.get(0).getRow(), results[0].getRow())) {
54 partialResults.add(results[0]);
55 start = 1;
56 }
57 checkUpdateNumberOfCompleteRowsAndCache(combine());
58 addResultArrayToCache(results, start, length);
59 }
60
61 @Override
62 public void loadResultsToCache(Result[] results, boolean isHeartbeatMessage) throws IOException {
63
64
65
66 if (results.length == 0) {
67
68
69
70 if (!partialResults.isEmpty() && !isHeartbeatMessage) {
71 checkUpdateNumberOfCompleteRowsAndCache(combine());
72 }
73 return;
74 }
75
76
77 Result last = results[results.length - 1];
78 if (last.mayHaveMoreCellsInRow()) {
79 if (partialResults.isEmpty()) {
80 partialResults.add(last);
81 addResultArrayToCache(results, 0, results.length - 1);
82 return;
83 }
84
85 if (results.length == 1) {
86
87 if (Bytes.equals(partialResults.get(0).getRow(), last.getRow())) {
88 partialResults.add(last);
89 return;
90 }
91 Result completeResult = combine();
92 partialResults.add(last);
93 checkUpdateNumberOfCompleteRowsAndCache(completeResult);
94 return;
95 }
96
97 prependCombinedAndCache(results, results.length - 1);
98 partialResults.add(last);
99 return;
100 }
101 if (!partialResults.isEmpty()) {
102 prependCombinedAndCache(results, results.length);
103 return;
104 }
105 addResultArrayToCache(results, 0, results.length);
106 }
107
108 @Override
109 protected void checkUpdateNumberOfCompleteRowsAndCache(Result rs) {
110 numberOfCompleteRows++;
111 addResultToCache(rs);
112 }
113
114 @Override
115 public void clear() {
116 partialResults.clear();
117 super.clear();
118 }
119 }