You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@esme.apache.org by vd...@apache.org on 2009/11/17 01:16:59 UTC

svn commit: r881067 - /incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/PopStatsActor.scala

Author: vdichev
Date: Tue Nov 17 00:16:58 2009
New Revision: 881067

URL: http://svn.apache.org/viewvc?rev=881067&view=rev
Log:
Fixes in popularity stats actor

Modified:
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/PopStatsActor.scala

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/PopStatsActor.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/PopStatsActor.scala?rev=881067&r1=881066&r2=881067&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/PopStatsActor.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/PopStatsActor.scala Tue Nov 17 00:16:58 2009
@@ -31,8 +31,6 @@
 
 object PopStatsActor extends LiftActor {
 
-  // immutable maps of maps doesn't work well
-  // FIXME dpp asks why not?
   import scala.collection.mutable.Map
   
   private val actors: Map[StatParam,Map[Long,PopStatsActor]] = Map()
@@ -50,12 +48,12 @@
     }
     
     case StopStats(what, period) => // TODO: not used
-      case TopStats(what, n, period) =>
-        (for (stat <- actors.get(what);
-              availableActor <- stat.get(period)) yield availableActor) match {
-		case Some(statActor) => forwardMessageTo(Top(n), statActor)
-		case _ => reply(Nil)
-              }
+    case TopStats(what, n, period) =>
+      (for (stat <- actors.get(what);
+            availableActor <- stat.get(period)) yield availableActor) match {
+              case Some(statActor) => forwardMessageTo(Top(n), statActor)
+              case _ => reply(Nil)
+            }
 
     case IncrStats(what, hitItem) =>
       for (stat <- actors.get(what);
@@ -79,37 +77,33 @@
   case class IncrStats(what: StatParam, hitItem: Long)
 
   private class PopStatsActor(period: Long,
-			      refreshInterval: Long) extends LiftActor {
+                              refreshInterval: Long) extends LiftActor {
     private var queue: List[StatEvent] = List()
     private var stats: Map[Long,Int] = Map()
     private var running = true
 
     protected def messageHandler = {
-      case StartUp =>
+      case StartUp => ActorPing.schedule(this, Expire, refreshInterval)
 
-    case ByeBye =>
-      running = false
-
-    case Hit(id) =>
-      // FIXME this is an O(n) operation.
-      // use LiftBuffer or prepend (using ::)
-      queue += StatEvent(id, now)
-      stats += (id -> (stats.getOrElse(id,0) + 1))
-      
+      case ByeBye =>
+        running = false
+  
+      case Hit(id) =>
+        queue ::= StatEvent(id, now)
+        stats += (id -> (stats.getOrElse(id,0) + 1))
+        
       case Top(n) =>
-	val topList = stats.toList.sort{
+        val topList = stats.toList.sort{
           case ((_,freq1),(_,freq2)) =>
             freq2 < freq1
-	}.take(n)
+        }.take(n)
       reply(topList)
       
       case Expire => {
-	queue = queue.dropWhile{ event =>
-          val expired_? = event.when < now
-				if (expired_?) stats -= event.id
-				expired_?
-			      }.toList
-	}
+        val (live, expired) = queue.partition(_.when < now)
+        expired.foreach(stats -= _.id)
+        live
+      }
     }
     
     case class StatEvent(id: Long, when: Long)