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.hadoop.hbase.HConstants;
24 import org.apache.hadoop.hbase.KeyValue;
25
26 import java.io.IOException;
27 import java.util.List;
28
29
30
31
32
33
34 public class MinorCompactingStoreScanner implements KeyValueScanner, InternalScanner {
35 private KeyValueHeap heap;
36 private KeyValue.KVComparator comparator;
37
38 MinorCompactingStoreScanner(Store store, List<? extends KeyValueScanner> scanners)
39 throws IOException {
40 comparator = store.comparator;
41 KeyValue firstKv = KeyValue.createFirstOnRow(HConstants.EMPTY_START_ROW);
42 for (KeyValueScanner scanner : scanners ) {
43 scanner.seek(firstKv);
44 }
45 heap = new KeyValueHeap(scanners, store.comparator);
46 }
47
48 MinorCompactingStoreScanner(String cfName, KeyValue.KVComparator comparator,
49 List<? extends KeyValueScanner> scanners)
50 throws IOException {
51 this.comparator = comparator;
52
53 KeyValue firstKv = KeyValue.createFirstOnRow(HConstants.EMPTY_START_ROW);
54 for (KeyValueScanner scanner : scanners ) {
55 scanner.seek(firstKv);
56 }
57
58 heap = new KeyValueHeap(scanners, comparator);
59 }
60
61 public KeyValue peek() {
62 return heap.peek();
63 }
64
65 public KeyValue next() throws IOException {
66 return heap.next();
67 }
68
69 @Override
70 public boolean seek(KeyValue key) {
71
72 throw new UnsupportedOperationException("Can't seek a MinorCompactingStoreScanner");
73 }
74
75 public boolean reseek(KeyValue key) {
76 return seek(key);
77 }
78
79
80
81
82
83
84
85 public boolean next(StoreFile.Writer writer) throws IOException {
86 KeyValue row = heap.peek();
87 if (row == null) {
88 close();
89 return false;
90 }
91 KeyValue kv;
92 while ((kv = heap.peek()) != null) {
93
94 if (comparator.compareRows(row, kv) != 0) {
95
96 return true;
97 }
98 writer.append(heap.next());
99 }
100 close();
101 return false;
102 }
103
104 @Override
105 public boolean next(List<KeyValue> results) throws IOException {
106 KeyValue row = heap.peek();
107 if (row == null) {
108 close();
109 return false;
110 }
111 KeyValue kv;
112 while ((kv = heap.peek()) != null) {
113
114 if (comparator.compareRows(row, kv) != 0) {
115
116 return true;
117 }
118 results.add(heap.next());
119 }
120 close();
121 return false;
122 }
123
124 @Override
125 public boolean next(List<KeyValue> results, int limit) throws IOException {
126
127 return next(results);
128 }
129
130 public void close() {
131 heap.close();
132 }
133 }