in newswires/app/db/FingerpostWireEntry.scala [418:454]
def getKeywords(
maybeInLastHours: Option[Int] = None,
maybeLimit: Option[Int] = None,
additionalWhereClauses: List[SQLSyntax] = Nil
): Map[String, Int] = {
DB readOnly { implicit session =>
val innerWhereClause = additionalWhereClauses ++ maybeInLastHours
.map(inLastHours =>
sqls"ingested_at > now() - ($inLastHours::text || ' hours')::interval"
) match {
case Nil => sqls""
case whereParts => sqls"WHERE ${sqls.joinWithAnd(whereParts: _*)}"
}
val limitClause = maybeLimit
.map(limit => sqls"LIMIT $limit")
.orElse(maybeInLastHours.map(_ => sqls"LIMIT 10"))
.getOrElse(sqls"")
sql"""| SELECT distinct keyword, count(*)
| FROM (
| SELECT jsonb_array_elements_text(${FingerpostWireEntry.syn
.column(
"content"
)} -> 'keywords') as keyword
| FROM ${FingerpostWireEntry as syn}
| $innerWhereClause
| ) as all_keywords
| GROUP BY keyword
| ORDER BY "count" DESC
| $limitClause
| """.stripMargin
.map(rs => rs.string("keyword") -> rs.int("count"))
.list()
.apply()
.toMap // TODO would a list be better?
}
}