package database.wallet; import java.math.BigInteger; import java.util.HashMap; import java.util.List; import java.util.Map; import org.mapdb.BTreeMap; import org.mapdb.DB; import org.mapdb.DBMaker; import org.mapdb.Fun; import org.mapdb.Fun.Tuple2; import qora.account.Account; import qora.assets.Order; import utils.ObserverMessage; import database.DBMap; import database.IDB; import database.serializer.OrderSerializer; public class OrderMap extends DBMap<Tuple2<String, BigInteger>, Order> { private Map<Integer, Integer> observableData = new HashMap<Integer, Integer>(); public OrderMap(IDB databaseSet, DB database) { super(databaseSet, database); this.observableData.put(DBMap.NOTIFY_ADD, ObserverMessage.ADD_ORDER_TYPE); this.observableData.put(DBMap.NOTIFY_REMOVE, ObserverMessage.REMOVE_ORDER_TYPE); this.observableData.put(DBMap.NOTIFY_LIST, ObserverMessage.LIST_ORDER_TYPE); } public OrderMap(OrderMap parent) { super(parent); } protected void createIndexes(DB database){} @Override protected Map<Tuple2<String, BigInteger>, Order> getMap(DB database) { //OPEN MAP return this.openMap(database); } @Override protected Map<Tuple2<String, BigInteger>, Order> getMemoryMap() { DB database = DBMaker.newMemoryDB().make(); //OPEN MAP return this.openMap(database); } private Map<Tuple2<String, BigInteger>, Order> openMap(DB database) { //OPEN MAP BTreeMap<Tuple2<String, BigInteger>, Order> map = database.createTreeMap("orders") //.keySerializer(BTreeKeySerializer.TUPLE2) .valueSerializer(new OrderSerializer()) .makeOrGet(); //RETURN return map; } @Override protected Order getDefaultValue() { return null; } @Override protected Map<Integer, Integer> getObservableData() { return this.observableData; } public void add(Order order) { this.set(new Tuple2<String, BigInteger>(order.getCreator().getAddress(), order.getId()), order); } @SuppressWarnings({ "unchecked", "rawtypes" }) public void delete(Account account) { //GET ALL ORDERS THAT BELONG TO THAT ADDRESS Map<Tuple2<String, BigInteger>, Order> accountOrders = ((BTreeMap) this.map).subMap( Fun.t2(account.getAddress(), null), Fun.t2(account.getAddress(), Fun.HI())); //DELETE NAMES for(Tuple2<String, BigInteger> key: accountOrders.keySet()) { this.delete(key); } } public void delete(Order order) { this.delete(new Tuple2<String, BigInteger>(order.getCreator().getAddress(), order.getId())); } public void deleteAll(List<Account> accounts) { for(Account account: accounts) { this.delete(account); } } public void addAll(Map<Account, List<Order>> orders) { //FOR EACH ACCOUNT for(Account account: orders.keySet()) { //FOR EACH TRANSACTION for(Order order: orders.get(account)) { this.add(order); } } } }