}
batch := m.db.NewBatch()
- tradePairsCnt := make(map[common.TradePair]int)
+ tradePairsCnt := make(map[string]*common.TradePair)
if err := m.addOrders(batch, addOrders, tradePairsCnt); err != nil {
return err
}
return nil
}
-func (m *LevelDBMovStore) addOrders(batch dbm.Batch, orders []*common.Order, tradePairsCnt map[common.TradePair]int) error {
+func (m *LevelDBMovStore) addOrders(batch dbm.Batch, orders []*common.Order, tradePairsCnt map[string]*common.TradePair) error {
for _, order := range orders {
data, err := json.Marshal(order.Utxo)
if err != nil {
key := calcOrderKey(order.FromAssetID, order.ToAssetID, calcUTXOHash(order), order.Rate)
batch.Set(key, data)
- tradePair := common.TradePair{
+ tradePair := &common.TradePair{
FromAssetID: order.FromAssetID,
ToAssetID: order.ToAssetID,
}
- tradePairsCnt[tradePair] += 1
+ if _, ok := tradePairsCnt[tradePair.Key()]; !ok {
+ tradePairsCnt[tradePair.Key()] = tradePair
+ }
+ tradePairsCnt[tradePair.Key()].Count++
}
return nil
}
-func (m *LevelDBMovStore) deleteOrders(batch dbm.Batch, orders []*common.Order, tradePairsCnt map[common.TradePair]int) {
+func (m *LevelDBMovStore) deleteOrders(batch dbm.Batch, orders []*common.Order, tradePairsCnt map[string]*common.TradePair) {
for _, order := range orders {
key := calcOrderKey(order.FromAssetID, order.ToAssetID, calcUTXOHash(order), order.Rate)
batch.Delete(key)
- tradePair := common.TradePair{
+ tradePair := &common.TradePair{
FromAssetID: order.FromAssetID,
ToAssetID: order.ToAssetID,
}
- tradePairsCnt[tradePair] -= 1
+ if _, ok := tradePairsCnt[tradePair.Key()]; !ok {
+ tradePairsCnt[tradePair.Key()] = tradePair
+ }
+ tradePairsCnt[tradePair.Key()].Count--
}
}
return tradePairs, nil
}
-func (m *LevelDBMovStore) updateTradePairs(batch dbm.Batch, tradePairs map[common.TradePair]int) error {
- for k, v := range tradePairs {
- key := calcTradePairKey(k.FromAssetID, k.ToAssetID)
+func (m *LevelDBMovStore) updateTradePairs(batch dbm.Batch, tradePairs map[string]*common.TradePair) error {
+ for _, v := range tradePairs {
+ key := calcTradePairKey(v.FromAssetID, v.ToAssetID)
tradePairData := &tradePairData{}
if value := m.db.Get(key); value != nil {
if err := json.Unmarshal(value, tradePairData); err != nil {
return err
}
- } else if v < 0 {
+ } else if v.Count < 0 {
return errors.New("don't find trade pair")
}
- tradePairData.Count += v
+ tradePairData.Count += v.Count
if tradePairData.Count > 0 {
value, err := json.Marshal(tradePairData)
if err != nil {
}
batch := movStore.db.NewBatch()
- tradePairsCnt := make(map[common.TradePair]int)
+ tradePairsCnt := make(map[string]*common.TradePair)
movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
if len(c.beforeOrders) > 0 {
- tradePairsCnt = make(map[common.TradePair]int)
+ tradePairsCnt = make(map[string]*common.TradePair)
for _, tradePair := range c.beforeTradePairs {
- tradePairsCnt[*tradePair] = tradePair.Count
+ tradePairsCnt[tradePair.Key()] = tradePair
}
movStore.updateTradePairs(batch, tradePairsCnt)
movStore.saveMovDatabaseState(batch, c.beforeDBStatus)
}
batch := movStore.db.NewBatch()
- tradePairsCnt := make(map[common.TradePair]int)
+ tradePairsCnt := make(map[string]*common.TradePair)
movStore.addOrders(batch, c.storeOrders, tradePairsCnt)
movStore.updateTradePairs(batch, tradePairsCnt)
batch.Write()
}
batch := movStore.db.NewBatch()
- tradePairsCnt := make(map[common.TradePair]int)
+ tradePairsCnt := make(map[string]*common.TradePair)
movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
movStore.updateTradePairs(batch, tradePairsCnt)
batch.Write()
- tradePairsCnt = make(map[common.TradePair]int)
+ tradePairsCnt = make(map[string]*common.TradePair)
movStore.addOrders(batch, c.addOrders, tradePairsCnt)
batch.Write()
}
batch := movStore.db.NewBatch()
- tradePairsCnt := make(map[common.TradePair]int)
+ tradePairsCnt := make(map[string]*common.TradePair)
movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
movStore.updateTradePairs(batch, tradePairsCnt)
batch.Write()
- tradePairsCnt = make(map[common.TradePair]int)
+ tradePairsCnt = make(map[string]*common.TradePair)
movStore.deleteOrders(batch, c.delOrders, tradePairsCnt)
movStore.updateTradePairs(batch, tradePairsCnt)
batch.Write()
func TestListTradePairsWithStart(t *testing.T) {
cases := []struct {
desc string
- storeTradePairs map[common.TradePair]int
+ storeTradePairs map[string]*common.TradePair
query *common.TradePair
wantTradePairs []*common.TradePair
}{
},
{
desc: "query from first",
- storeTradePairs: map[common.TradePair]int{
- common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
- common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
- common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
- common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
+ storeTradePairs: map[string]*common.TradePair{
+ (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+ (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+ (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+ (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
},
query: &common.TradePair{},
wantTradePairs: []*common.TradePair{
},
{
desc: "query from middle",
- storeTradePairs: map[common.TradePair]int{
- common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
- common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
- common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
- common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
- common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8}: 7,
+ storeTradePairs: map[string]*common.TradePair{
+ (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+ (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+ (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+ (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
+ (&common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8}).Key(): {FromAssetID: assetID6, ToAssetID: assetID8, Count: 7},
},
query: &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
wantTradePairs: []*common.TradePair{
func TestUpdateTradePairs(t *testing.T) {
cases := []struct {
desc string
- beforeTradePairs map[common.TradePair]int
- addTradePairs map[common.TradePair]int
- delTradePairs map[common.TradePair]int
+ beforeTradePairs map[string]*common.TradePair
+ addTradePairs map[string]*common.TradePair
+ delTradePairs map[string]*common.TradePair
wantTradePairs []*common.TradePair
}{
{
desc: "empty",
- addTradePairs: map[common.TradePair]int{
- common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
- common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
- common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
- common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
+ addTradePairs: map[string]*common.TradePair{
+ (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+ (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+ (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+ (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
},
wantTradePairs: []*common.TradePair{
&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
},
{
desc: "Stored data already exists",
- beforeTradePairs: map[common.TradePair]int{
- common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
- common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
- common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
+ beforeTradePairs: map[string]*common.TradePair{
+ (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+ (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+ (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
},
- addTradePairs: map[common.TradePair]int{
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
- common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
+ addTradePairs: map[string]*common.TradePair{
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+ (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
},
wantTradePairs: []*common.TradePair{
&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
},
{
desc: "delete some data",
- beforeTradePairs: map[common.TradePair]int{
- common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
- common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
- common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
- common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
+ beforeTradePairs: map[string]*common.TradePair{
+ (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
+ (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
+ (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
+ (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
},
- delTradePairs: map[common.TradePair]int{
- common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: -1,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: -4,
- common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: -2,
- common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: -4,
+ delTradePairs: map[string]*common.TradePair{
+ (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: -1},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: -4},
+ (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: -2},
+ (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: -4},
},
wantTradePairs: []*common.TradePair{
&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},