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