package com.alibaba.doris.dataserver.store.mock;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import com.alibaba.doris.common.data.Key;
import com.alibaba.doris.common.data.Pair;
import com.alibaba.doris.common.data.Value;
import com.alibaba.doris.common.data.impl.PairImpl;
import com.alibaba.doris.common.data.impl.ValueImpl;
import com.alibaba.doris.common.data.util.ByteUtils;
import com.alibaba.doris.dataserver.store.ClosableIterator;
import com.alibaba.doris.dataserver.store.Storage;
import com.alibaba.doris.dataserver.store.StorageType;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class MockStorage implements Storage {
public MockStorage(boolean isStoreDataInMem) {
this.isStoreDataInMem = isStoreDataInMem;
}
public MockStorage() {
this(true);
}
public void close() {
storage = null;
}
public boolean delete(Key key) {
sleep();
if (isStoreDataInMem) {
return storage.remove(new KeyWrapper(key)) != null;
}
return true;
}
public boolean delete(Key key, Value value) {
sleep();
return delete(key);
}
private void sleep() {
// try {
// Thread.sleep(60);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
public boolean delete(List<Integer> vnodeList) {
return false;
}
public Value get(Key key) {
sleep();
if (isStoreDataInMem) {
return storage.get(new KeyWrapper(key));
}
return new ValueImpl(ByteUtils.stringToByte(key.getKey() + "sleep60"));
}
public Map<Key, Value> getAll(Iterable<Key> keyIterator) {
sleep();
if (isStoreDataInMem) {
Map<Key, Value> retMap = new HashMap<Key, Value>();
Iterator<Key> keyItr = keyIterator.iterator();
while (keyItr.hasNext()) {
Key key = keyItr.next();
retMap.put(key, get(key));
}
return retMap;
}
return new HashMap<Key, Value>();
}
public StorageType getType() {
return MockStorageType.MOCK_STORAGE;
}
public Iterator<Pair> iterator() {
if (isStoreDataInMem) {
final Iterator<Entry<KeyWrapper, Value>> localMapItr = storage.entrySet().iterator();
Iterator<Pair> returnItr = new ClosableIterator<Pair>() {
public boolean hasNext() {
return localMapItr.hasNext();
}
public Pair next() {
Entry<KeyWrapper, Value> entry = localMapItr.next();
return new PairImpl(entry.getKey().key, entry.getValue());
}
public void remove() {
localMapItr.remove();
}
public void close() {
}
};
return returnItr;
}
return null;
}
public Iterator<Pair> iterator(List<Integer> vnodeList) {
return iterator();
}
public void open() {
storage = new ConcurrentHashMap<KeyWrapper, Value>();
}
public void set(Key key, Value value) {
sleep();
if (isStoreDataInMem) {
storage.put(new KeyWrapper(key), value);
}
}
public void set(Key key, Value value, boolean isSetWithCompareVersion) {
sleep();
if (isStoreDataInMem) {
storage.put(new KeyWrapper(key), value);
}
}
private Map<KeyWrapper, Value> storage = new HashMap<KeyWrapper, Value>();
private static class KeyWrapper {
public KeyWrapper(Key key) {
this.key = key;
}
public Key getKey() {
return key;
}
public void setKey(Key key) {
this.key = key;
}
@Override
public boolean equals(Object obj) {
KeyWrapper keyObj = (KeyWrapper) obj;
return this.key.getPhysicalKey().equals(keyObj.key.getPhysicalKey());
}
@Override
public int hashCode() {
return key.getPhysicalKey().hashCode();
}
@Override
public String toString() {
return "[Key:" + key.getPhysicalKey() + "]";
}
private Key key;
}
private boolean isStoreDataInMem = true;
}