1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.util;
20
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.Iterator;
24 import java.util.List;
25 import java.util.SortedSet;
26
27 import org.apache.hadoop.hbase.classification.InterfaceAudience;
28 import org.apache.hadoop.hbase.KeyValue;
29 import org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner;
30
31
32
33
34
35 @InterfaceAudience.Private
36 public class CollectionBackedScanner extends NonReversedNonLazyKeyValueScanner {
37 final private Iterable<KeyValue> data;
38 final KeyValue.KVComparator comparator;
39 private Iterator<KeyValue> iter;
40 private KeyValue current;
41
42 public CollectionBackedScanner(SortedSet<KeyValue> set) {
43 this(set, KeyValue.COMPARATOR);
44 }
45
46 public CollectionBackedScanner(SortedSet<KeyValue> set,
47 KeyValue.KVComparator comparator) {
48 this.comparator = comparator;
49 data = set;
50 init();
51 }
52
53 public CollectionBackedScanner(List<KeyValue> list) {
54 this(list, KeyValue.COMPARATOR);
55 }
56
57 public CollectionBackedScanner(List<KeyValue> list,
58 KeyValue.KVComparator comparator) {
59 Collections.sort(list, comparator);
60 this.comparator = comparator;
61 data = list;
62 init();
63 }
64
65 public CollectionBackedScanner(KeyValue.KVComparator comparator,
66 KeyValue... array) {
67 this.comparator = comparator;
68
69 List<KeyValue> tmp = new ArrayList<KeyValue>(array.length);
70 Collections.addAll(tmp, array);
71 Collections.sort(tmp, comparator);
72 data = tmp;
73 init();
74 }
75
76 private void init() {
77 iter = data.iterator();
78 if(iter.hasNext()){
79 current = iter.next();
80 }
81 }
82
83 @Override
84 public KeyValue peek() {
85 return current;
86 }
87
88 @Override
89 public KeyValue next() {
90 KeyValue oldCurrent = current;
91 if(iter.hasNext()){
92 current = iter.next();
93 } else {
94 current = null;
95 }
96 return oldCurrent;
97 }
98
99 @Override
100 public boolean seek(KeyValue seekKv) {
101
102 iter = data.iterator();
103 return reseek(seekKv);
104 }
105
106 @Override
107 public boolean reseek(KeyValue seekKv) {
108 while(iter.hasNext()){
109 KeyValue next = iter.next();
110 int ret = comparator.compare(next, seekKv);
111 if(ret >= 0){
112 current = next;
113 return true;
114 }
115 }
116 return false;
117 }
118
119 @Override
120 public long getSequenceID() {
121 return 0;
122 }
123
124 @Override
125 public void close() {
126
127 }
128 }