package com.alibaba.doris.dataserver.store;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import com.alibaba.doris.common.data.Key;
import com.alibaba.doris.common.data.Pair;
import com.alibaba.doris.common.data.Value;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public abstract class BaseStorage implements Storage {
public Map<Key, Value> getAll(Iterable<Key> keyIterator) {
int size = ((Collection<?>) keyIterator).size();
Map<Key, Value> result = new HashMap<Key, Value>(size);
for (Key key : keyIterator) {
Value value = get(key);
if (value != null) {
result.put(key, value);
}
}
return result;
}
protected static class MultiDataBaseIterator<T extends Storage> implements ClosableIterator<Pair> {
public MultiDataBaseIterator(Iterator<T> dbItr, List<Integer> vnodeList) {
this.dbItr = dbItr;
this.vnodeList = vnodeList;
}
public boolean hasNext() {
Iterator<Pair> localIteraotrPair = getNextIterator();
if (null == localIteraotrPair) {
return false;
}
return localIteraotrPair.hasNext();
}
private Iterator<Pair> getNextIterator() {
if (null == innerPairIter) {
if (dbItr.hasNext()) {
Storage db = dbItr.next();
innerPairIter = (ClosableIterator<Pair>) db.iterator(vnodeList);
return innerPairIter;
} else {
return null;
}
} else {
boolean hasNext = innerPairIter.hasNext();
if (!hasNext) {
innerPairIter.close();
if (dbItr.hasNext()) {
Storage db = dbItr.next();
innerPairIter = (ClosableIterator<Pair>) db.iterator(vnodeList);
} else {
innerPairIter = null;
}
}
return innerPairIter;
}
}
public Pair next() {
if (innerPairIter == null) {
throw new NoSuchElementException();
}
return innerPairIter.next();
}
public void remove() {
if (innerPairIter == null) {
throw new NoSuchElementException();
}
innerPairIter.remove();
}
public void close() {
if (null != innerPairIter) {
innerPairIter.close();
}
}
private ClosableIterator<Pair> innerPairIter;
private Iterator<T> dbItr;
private List<Integer> vnodeList;
}
}