PageRenderTime 28ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/src/main/scala/com/theintelligentbook/ibmodel/mongo/ChatComment.scala

https://bitbucket.org/wbillingsley/ibmongo-2012-old-version-duct-tape-not-maintained
Scala | 218 lines | 154 code | 51 blank | 13 comment | 0 complexity | c755f7e110354c8c4361b224006f3445 MD5 | raw file
  1. package com.theintelligentbook.ibmodel.mongo
  2. import com.mongodb.casbah.Imports._
  3. import java.util.Date
  4. import com.novus.salat._
  5. import com.novus.salat.global._
  6. import com.novus.salat.dao.SalatDAO
  7. import com.wbillingsley.handy.{RefItself, RefNone, RefById, Ref}
  8. import com.mongodb.util.JSON
  9. import com.novus.salat.annotations._
  10. case class ChatComment(
  11. _id:ObjectId = new ObjectId(),
  12. val anonymous:Boolean = true,
  13. @Key("book") _book:Option[ObjectId] = None,
  14. @Key("createdBy") _createdBy:Option[ObjectId] = None,
  15. val session:Option[String] = None,
  16. val comment:Option[String] = None,
  17. val topics:Seq[String] = Seq.empty[String],
  18. val created:Date = new Date()
  19. ) extends HasObjectId {
  20. def id = _id
  21. def book = Ref.fromOptionId(classOf[Book], _book)
  22. def createdBy = Ref.fromOptionId(classOf[Reader], _createdBy)
  23. }
  24. object ChatCommentDAO extends AbstractDAO[ChatComment]("chatComment") {
  25. /**
  26. * Gets chat comments for a book, optionally providing cursors for the range required.
  27. * @param book
  28. * @param after
  29. * @param before
  30. * @return
  31. */
  32. def findByBook(book:Ref[Book], after:Ref[ChatComment], before:Ref[ChatComment], maxElements:Option[Int]):Seq[ChatComment] = {
  33. book.getId match {
  34. case Some(bid) => {
  35. var map = MongoDBObject("book" -> bid)
  36. after.getId.foreach{afterId =>
  37. map ++= ("_id" $gt afterId)
  38. }
  39. before.getId.foreach{beforeId =>
  40. map ++= ("_id" $lt beforeId)
  41. }
  42. val cursor = sdao.find(map).sort(MongoDBObject("_id" -> -1))
  43. maxElements.foreach {max => cursor.limit(max)}
  44. cursor.toSeq
  45. }
  46. case None => Seq.empty[ChatComment]
  47. }
  48. }
  49. def newChatComment(
  50. anonymous:Boolean = true,
  51. book:Ref[Book] = RefNone,
  52. createdBy:Ref[Reader] = RefNone,
  53. session:Option[String] = None,
  54. comment:Option[String] = None,
  55. topics:Seq[String] = Seq.empty[String]
  56. ) = {
  57. val cc = new ChatComment(
  58. anonymous = anonymous,
  59. _book = book.getId.asInstanceOf[Option[ObjectId]],
  60. _createdBy = createdBy.getId.asInstanceOf[Option[ObjectId]],
  61. session = session,
  62. comment = comment,
  63. topics = topics
  64. )
  65. DAO.cache(RefById(classOf[ChatComment], cc.id), RefItself(cc))
  66. cc
  67. }
  68. def save(c:ChatComment) {
  69. DAO.cache(RefById(classOf[ChatComment], c.id), RefItself(c))
  70. sdao.save(c)
  71. }
  72. def updateStatsByDay(b:Ref[Book]) = {
  73. val mapJs = """
  74. function m() {
  75. var t = this.created
  76. t.setMinutes(0)
  77. t.setSeconds(0)
  78. t.setMilliseconds(0)
  79. var v = {
  80. book: this.book,
  81. time: t,
  82. readers: {},
  83. sessions: {},
  84. anonymous: 0,
  85. total: 1,
  86. kinds: {},
  87. sites: {},
  88. adjs: {},
  89. nouns: {},
  90. topics: {}
  91. }
  92. if (this.reader) { v.readers[this.reader] = 1 } else { v.anonymous = 1 }
  93. if (this.session) { v.sessions[this.session] = 1 }
  94. if (this.kind) { v.kinds[this.kind] = 1 }
  95. if (this.site) { v.sites[this.site] = 1 }
  96. if (this.adjs) { this.adjs.forEach(function(adj) { v.adjs[adj] = 1 }) }
  97. if (this.nouns) { this.nouns.forEach(function(noun) { v.nouns[noun] = 1 }) }
  98. if (this.topics) { this.topics.forEach(function(topic) { v.topics[topic] = 1 }) }
  99. emit( { book: this.book, time: t }, v )
  100. }
  101. """
  102. val reduceJs = """
  103. function r(k, values) {
  104. var n = { book: k.book, time: k.time, readers: {}, anonymous: 0, total: 0, sessions: {}, kinds: {}, sites: {}, adjs: {}, nouns: {}, topics: {}, ces: {} }
  105. values.forEach(function(value) {
  106. n.total += value.total
  107. n.anonymous += value.anonymous
  108. function accrue(from, into) {
  109. for (var k in from) {
  110. into[k] = (into[k] || 0) + from[k]
  111. }
  112. }
  113. accrue(value.readers, n.readers)
  114. accrue(value.sessions, n.sessions)
  115. accrue(value.kinds, n.kinds)
  116. accrue(value.sites, n.sites)
  117. accrue(value.adjs, n.adjs)
  118. accrue(value.nouns, n.nouns)
  119. accrue(value.topics, n.topics)
  120. })
  121. return n
  122. }
  123. """
  124. val bookId = b.getId.getOrElse(new ObjectId())
  125. val result = sdao.collection.mapReduce(mapJs, reduceJs, MapReduceMergeOutput("aggChats"), Some(Map("book" -> bookId)), sort=None, limit=None, finalizeFunction=None, jsScope=None, verbose=false)
  126. result.cursor
  127. }
  128. }
  129. /*
  130. * Below is temporary stuff for charting chat comments
  131. */
  132. case class AggChatCC(
  133. value:AggChatVal
  134. )
  135. /**
  136. * An Aggregated Events entry
  137. */
  138. case class AggChatVal(
  139. book:Option[ObjectId] = None,
  140. time:Date = new Date,
  141. sessions:Map[String, Int] = Map.empty[String, Int],
  142. readers:Map[String, Int] = Map.empty[String, Int],
  143. anonymous:Int = 0,
  144. kinds:Map[String, Int] = Map.empty[String, Int],
  145. sites:Map[String, Int] = Map.empty[String, Int],
  146. adjs:Map[String, Int] = Map.empty[String, Int],
  147. nouns:Map[String, Int] = Map.empty[String, Int],
  148. topics:Map[String, Int] = Map.empty[String, Int],
  149. ces:Map[String, Int] = Map.empty[String, Int]
  150. )
  151. object AggChatDAO {
  152. val collName = "aggChats"
  153. lazy val sdao = new SalatDAO[AggChatCC, ObjectId](DAO.getCollection(collName)) {
  154. }
  155. def aggEventsCC(b:Ref[Book]) = {
  156. sdao.find(Map("_id.book" -> b.getId.getOrElse(new ObjectId())))
  157. }
  158. def aggEventsJson(b:Ref[Book]):Seq[String] = {
  159. val c = DAO.getCollection("aggChats").find(Map("_id.book" -> b.getId.getOrElse(new ObjectId())))
  160. c.toSeq.map(o => JSON.serialize(o.get("value")))
  161. }
  162. }