diff --git a/src/main/scala/QueryDB.scala b/src/main/scala/QueryDB.scala index 3f70b18c99e5851351dccd31e8e4e155f2a1b17b..a5a939052a268c28ef3835e207d20f4dcb2d4563 100644 --- a/src/main/scala/QueryDB.scala +++ b/src/main/scala/QueryDB.scala @@ -9,13 +9,23 @@ import scala.collection.JavaConverters._ class QueryDB extends RouteBuilder { - def body2str(ask: Boolean, dirPrefix: String, count: Boolean, subString: String, field: String, b: Object): String = { + def body2str(ask: Boolean, dirPrefix: String, count: Boolean, + subString: String, field: String, group: String, b: Object): String = { try { (b.asInstanceOf[util.ArrayList[_]].asScala map { + case jm if group.nonEmpty => + val sm = jm.asInstanceOf[util.HashMap[String, Object]].asScala + val groupVal = sm.get(group) + val countVal = sm.get("count") + (groupVal, countVal) match { + case (Some(str: String), Some(c: Integer)) => + "occurrence count in \"" + group + "\" : " + c + " \"" + str + "\"" + case _ => "unexpected result: " + sm + } case jm if count => (if (ask) "occurrence count in \"" + field + "\" : " else "") + - jm.asInstanceOf[util.HashMap[String, Integer]].asScala.getOrElse("COUNT(*)", 0) + + jm.asInstanceOf[util.HashMap[String, Integer]].asScala.getOrElse("count", 0) + " \"" + subString + "\"" case jm if !count => val sm = jm.asInstanceOf[util.HashMap[String, String]].asScala @@ -27,13 +37,21 @@ class QueryDB extends RouteBuilder { } } - def queryValues(ask: Boolean, dirPrefix: String, count: Boolean, subString: String, field: String): Unit = { + def queryValues(ask: Boolean, dirPrefix: String, count: Boolean, + subString: String, field: String, group: String): Unit = { val w = field + " LIKE '%" + subString.replaceAll("'", "''") + "%'" - val q = "db:SELECT " + (if (count) "COUNT(*)" else "*") + " FROM " + Table.name + " WHERE " + w + val q = "db:SELECT " + (group match { + case "" if count => "COUNT(*) as count" + case "" if !count => "*" + case _ => assert(Table.columns.contains(group)) + group + ", COUNT(" + group + ") as count" + }) + + " FROM " + Table.name + " WHERE " + w + + (if (group.isEmpty) "" else " GROUP BY " + group + " ORDER BY count DESC") val d = "direct:" + q val r: RouteDefinition = d ==> { -->(q).transform(ex => - body2str(ask, dirPrefix, count, subString, field, ex.getIn.getBody)) + body2str(ask, dirPrefix, count, subString, field, group, ex.getIn.getBody)) -->("stream:out") } getContext.addRouteDefinition(r) @@ -76,8 +94,8 @@ object QueryDB { println("next search in field: " + field) } else { - if (ask) dbSearch.queryValues(ask, QueryDB.dirPrefix, count = false, ln, field) - dbSearch.queryValues(ask, QueryDB.dirPrefix, count = true, ln, field) + if (ask) dbSearch.queryValues(ask, QueryDB.dirPrefix, count = false, ln, field, "") + dbSearch.queryValues(ask, QueryDB.dirPrefix, count = true, ln, field, "") } } } diff --git a/src/test/scala/TestQueryDB.scala b/src/test/scala/TestQueryDB.scala index 37a62ccdbe0d65f6f669f427b129bafa23f91ae6..7e0a7541ab1786a1dc80067f3467d2b6bd85efb6 100644 --- a/src/test/scala/TestQueryDB.scala +++ b/src/test/scala/TestQueryDB.scala @@ -7,8 +7,8 @@ object TestQueryDB { context.addRoutes(dbSearch) context.start() val dirPrefix = if (dir.endsWith("/")) dir else dir + "/" - dbSearch.queryValues(true, dirPrefix, false, "skipped", "shortMsg") - dbSearch.queryValues(true, dirPrefix, false, "", "errType") - dbSearch.queryValues(true, dirPrefix, true, "LocalError", "errType") + dbSearch.queryValues(true, dirPrefix, false, "skipped", "shortMsg", "") + dbSearch.queryValues(true, dirPrefix, true, "", "errType", "shortMsg") + dbSearch.queryValues(true, dirPrefix, true, "LocalError", "errType", "") } }