/coinex/coinex-backend/src/main/scala/com/coinport/coinex/ordertx/TransactionBehavior.scala

https://github.com/dong77/MatchEngine · Scala · 58 lines · 49 code · 9 blank · 0 comment · 6 complexity · 1c3d1b1e102bd2a38b5f95dcd7f4a75b MD5 · raw file

  1. package com.coinport.coinex.ordertx
  2. import com.mongodb.casbah.Imports._
  3. import com.coinport.coinex.data._
  4. import Implicits._
  5. import com.coinport.coinex.common.mongo.SimpleJsonMongoCollection
  6. import com.coinport.coinex.serializers.ThriftBinarySerializer
  7. trait TransactionBehavior {
  8. val TID = "_id"
  9. val TAKER_ID = "tid"
  10. val MAKER_ID = "mid"
  11. val TAKER_ORDER_ID = "toid"
  12. val MAKER_ORDER_ID = "moid"
  13. val TIMESTAMP = "@"
  14. val MARKET = "m"
  15. val SIDE = "s"
  16. val TRANSACTION = "t"
  17. val coll: MongoCollection
  18. val converter = new ThriftBinarySerializer
  19. def addItem(item: Transaction) = coll.insert(toBson(item))
  20. def countItems(q: QueryTransaction) = coll.count(mkQuery(q))
  21. def getItems(q: QueryTransaction): Seq[Transaction] = {
  22. coll.find(mkQuery(q)).sort(DBObject(TID -> -1)).skip(q.cursor.skip).limit(q.cursor.limit).map(toClass(_)).toSeq
  23. }
  24. private def toBson(t: Transaction) = {
  25. val market = Market(t.side._1, t.side._2)
  26. val side = t.side.ordered
  27. MongoDBObject(
  28. TID -> t.id, TAKER_ID -> t.takerUpdate.current.userId, TAKER_ORDER_ID -> t.takerUpdate.current.id,
  29. MAKER_ID -> t.makerUpdate.current.userId, MAKER_ORDER_ID -> t.makerUpdate.current.id,
  30. MARKET -> market.toString, SIDE -> side, TIMESTAMP -> t.timestamp, TIMESTAMP -> t.timestamp,
  31. TRANSACTION -> converter.toBinary(t))
  32. }
  33. private def toClass(obj: MongoDBObject) =
  34. converter.fromBinary(obj.getAs[Array[Byte]](TRANSACTION).get, Some(classOf[Transaction.Immutable])).asInstanceOf[Transaction]
  35. private def mkQuery(q: QueryTransaction): MongoDBObject = {
  36. var query = MongoDBObject()
  37. if (q.tid.isDefined) query ++= MongoDBObject(TID -> q.tid.get)
  38. if (q.oid.isDefined) query ++= $or(TAKER_ORDER_ID -> q.oid.get, MAKER_ORDER_ID -> q.oid.get)
  39. if (q.uid.isDefined) query ++= $or(TAKER_ID -> q.uid.get, MAKER_ID -> q.uid.get)
  40. if (q.side.isDefined) query ++= {
  41. val qs = q.side.get
  42. val market = Market(qs.side.inCurrency, qs.side.outCurrency).toString
  43. val side = qs.side.ordered
  44. if (qs.bothSide) MongoDBObject(MARKET -> market)
  45. else MongoDBObject(MARKET -> q.side.get.side.S, SIDE -> side)
  46. }
  47. query
  48. }
  49. }