package database;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NavigableSet;
import java.util.Map.Entry;
import org.mapdb.DB;
import org.mapdb.Fun;
import org.mapdb.Fun.Tuple2;
import qora.naming.NameSale;
import utils.ObserverMessage;
import utils.ReverseComparator;
import database.DBSet;
public class NameExchangeMap extends DBMap<String, BigDecimal>
{
public static final int AMOUNT_INDEX = 1;
private Map<Integer, Integer> observableData = new HashMap<Integer, Integer>();
public NameExchangeMap(DBSet databaseSet, DB database)
{
super(databaseSet, database);
this.observableData.put(DBMap.NOTIFY_ADD, ObserverMessage.ADD_NAME_SALE_TYPE);
this.observableData.put(DBMap.NOTIFY_REMOVE, ObserverMessage.REMOVE_NAME_SALE_TYPE);
this.observableData.put(DBMap.NOTIFY_LIST, ObserverMessage.LIST_NAME_SALE_TYPE);
}
public NameExchangeMap(NameExchangeMap parent)
{
super(parent);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
protected void createIndexes(DB database)
{
//AMOUNT INDEX
NavigableSet<Tuple2<BigDecimal, String>> namesIndex = database.createTreeSet("namesales_index_amount")
.comparator(Fun.COMPARATOR)
.makeOrGet();
NavigableSet<Tuple2<BigDecimal, String>> descendingNamesIndex = database.createTreeSet("namesales_index_amount_descending")
.comparator(new ReverseComparator(Fun.COMPARATOR))
.makeOrGet();
createIndex(AMOUNT_INDEX, namesIndex, descendingNamesIndex, new Fun.Function2<BigDecimal, String, BigDecimal>() {
@Override
public BigDecimal run(String key, BigDecimal value) {
return value;
}
});
}
@Override
protected Map<String, BigDecimal> getMap(DB database)
{
//OPEN MAP
return database.createTreeMap("namesales")
.counterEnable()
.makeOrGet();
}
@Override
protected Map<String, BigDecimal> getMemoryMap()
{
return new HashMap<String, BigDecimal>();
}
@Override
protected BigDecimal getDefaultValue()
{
return BigDecimal.ZERO.setScale(8);
}
@Override
protected Map<Integer, Integer> getObservableData()
{
return this.observableData;
}
public List<NameSale> getNameSales()
{
List<NameSale> nameSales = new ArrayList<NameSale>();
for(Entry<String, BigDecimal> entry: this.map.entrySet())
{
nameSales.add(new NameSale(entry.getKey(), entry.getValue()));
}
return nameSales;
}
public NameSale getNameSale(String nameName)
{
return new NameSale(nameName, this.get(nameName));
}
public void add(NameSale nameSale)
{
this.set(nameSale.getKey(), nameSale.getAmount());
}
public boolean contains(NameSale nameSale)
{
return this.contains(nameSale.getKey());
}
public void delete(NameSale nameSale)
{
this.delete(nameSale.getKey());
}
}