def getRankingCountAsync()

in s2rest_play/app/org/apache/s2graph/rest/play/controllers/CounterController.scala [471:531]


  def getRankingCountAsync(service: String, action: String) = Action.async { implicit request =>
    lazy val intervalUnits = getQueryString("interval", getQueryString("step", "t")).split(',').toSeq
      .map(IntervalUnit.withName)
    lazy val limit = getQueryString("limit", "1").toInt
    lazy val kValue = getQueryString("k", "10").toInt

    lazy val qsSum = request.getQueryString("sum")

    lazy val optFrom = request.getQueryString("from").filter(!_.isEmpty).map(UnitConverter.toMillis)
    lazy val optTo = request.getQueryString("to").filter(!_.isEmpty).map(UnitConverter.toMillis)

    // find dimension
    lazy val dimensionMap = request.queryString.filterKeys { k => k.charAt(0) == ':' }.map { case (k, v) =>
      (k.substring(1), v.mkString(",").split(',').toList)
    }

    val dimensions = {
      for {
        values <- CartesianProduct(dimensionMap.values.toList).toSeq
      } yield {
        dimensionMap.keys.zip(values).toMap
      }
    }

    counterModel.findByServiceAction(service, action) match {
      case Some(policy) =>
        val tqs = TimedQualifier.getQualifiersToLimit(intervalUnits, limit, optTo)
        val dimKeys = {
          for {
            dimension <- dimensions
          } yield {
            dimension -> tqs.map(tq => RankingKey(policy.id, policy.version, ExactQualifier(tq, dimension)))
          }
        }

        // if tqs has only 1 tq, do not apply sum function
        try {
          val rankResult = {
            if (tqs.length > 1 && qsSum.isDefined) {
              getSumRankCounterResultAsync(policy, dimKeys, kValue, qsSum)
            } else {
              // no summary
              Future.successful(getRankCounterResult(policy, dimKeys, kValue))
            }
          }

          rankResult.map { result =>
            Ok(Json.toJson(result))
          }
        } catch {
          case e: UnsupportedOperationException =>
            Future.successful(NotImplemented(Json.toJson(
              Map("msg" -> e.getMessage)
            )))
          case e: Throwable =>
            throw e
        }
      case None =>
        Future.successful(NotFound(Json.toJson(Map("msg" -> s"$service.$action not found"))))
    }
  }