From 86d306e0c8e6bb8a7c390a785e0121fef7b28056 Mon Sep 17 00:00:00 2001 From: cmaeder <c.maeder@jacobs-university.de> Date: Thu, 12 Feb 2015 20:23:50 +0100 Subject: [PATCH] command line interface for counting supports batch mode if "-q" is given on the command line The initial field to search in must be adjusted in the code (after merge with master) --- count.sh | 2 ++ src/main/scala/QueryDB.scala | 45 ++++++++++++++++++++------------ src/test/scala/TestQueryDB.scala | 6 ++--- 3 files changed, 33 insertions(+), 20 deletions(-) create mode 100755 count.sh diff --git a/count.sh b/count.sh new file mode 100755 index 0000000..a2b8ce1 --- /dev/null +++ b/count.sh @@ -0,0 +1,2 @@ +#!/bin/sh +mvn -q exec:java -Dexec.mainClass=info.kwarc.mmt.errorview.QueryDB -Dexec.args=-q < src/test/data/strings.txt diff --git a/src/main/scala/QueryDB.scala b/src/main/scala/QueryDB.scala index 5211974..e001299 100644 --- a/src/main/scala/QueryDB.scala +++ b/src/main/scala/QueryDB.scala @@ -2,7 +2,6 @@ package info.kwarc.mmt.errorview import java.util -import org.apache.camel.Exchange import org.apache.camel.model.RouteDefinition import org.apache.camel.scala.dsl.builder.RouteBuilder @@ -10,11 +9,12 @@ import scala.collection.JavaConverters._ class QueryDB extends RouteBuilder { - def body2str(dirPrefix: String, count: Boolean, subString: String, field: String, b: Object): String = { + def body2str(ask: Boolean, dirPrefix: String, count: Boolean, subString: String, field: String, b: Object): String = { try { (b.asInstanceOf[util.ArrayList[_]].asScala map { case jm if count => - // "count where " + field + " contains " + subString + ": " + + (if (ask) "occurrence count in \"" + field + "\" : " + else "") + jm.asInstanceOf[util.HashMap[String, Integer]].asScala.getOrElse("COUNT(*)", 0) + " \"" + subString + "\"" case jm if !count => @@ -27,34 +27,39 @@ class QueryDB extends RouteBuilder { } } - def queryValues(dirPrefix: String, count: Boolean, subString: String, field: String): Unit = { + def queryValues(ask: Boolean, dirPrefix: String, count: Boolean, subString: String, field: String): Unit = { val w = field + " LIKE '%" + subString.replaceAll("'", "''") + "%'" val q = "db:SELECT " + (if (count) "COUNT(*)" else "*") + " FROM " + Table.name + " WHERE " + w val d = "direct:" + q val r: RouteDefinition = d ==> { -->(q).transform(ex => - body2str(dirPrefix, count, subString, field, ex.getIn.getBody)) + body2str(ask, dirPrefix, count, subString, field, ex.getIn.getBody)) -->("stream:out") } getContext.addRouteDefinition(r) getContext.createProducerTemplate().sendBody(d, null) getContext.removeRouteDefinition(r) } - - def processIn(ex: Exchange): Unit = { - val input = ex.getIn.getBody.toString - queryValues(QueryDB.dirPrefix, false, input, QueryDB.field) - } - - // ("stream:in?scanStream=true&promptMessage=Enter field or search string: " transform processIn) --> ("log:" + this.getClass) } object QueryDB { var dirPrefix = "" var field = Table.columns(2) + // use "-q" argument to avoid questions for batch mode + def parseArgs(args: List[String]): (Boolean, List[String]) = { + args match { + case "-q" :: tl => (false, tl) + case hd :: tl => + val (b, r) = parseArgs(tl) + (b, hd :: tl) + case _ => (true, Nil) + } + } + def main(args: scala.Array[String]): Unit = { - val (context, dir) = Table.initArgs(args) + val (ask, restArgs) = parseArgs(args.toList) + val (context, dir) = Table.initArgs(restArgs.toArray) val dbBuilder = new PopulateDB() val dbSearch = new QueryDB() context.addRoutes(dbSearch) @@ -62,12 +67,18 @@ object QueryDB { dirPrefix = if (dir.endsWith("/")) dir else dir + "/" var ok = true while (ok) { - // println("Enter field or search string:") - val ln = readLine + if (ask) println("Enter field or search string:") + val ln = readLine() ok = ln != null if (ok) { - // dbSearch.queryValues(QueryDB.dirPrefix, false, ln, QueryDB.field) - dbSearch.queryValues(QueryDB.dirPrefix, true, ln, QueryDB.field) + if (Table.columns.contains(ln)) { + field = ln + 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) + } } } } diff --git a/src/test/scala/TestQueryDB.scala b/src/test/scala/TestQueryDB.scala index 3bdcc63..37a62cc 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(dirPrefix, false, "skipped", "shortMsg") - dbSearch.queryValues(dirPrefix, false, "", "errType") - dbSearch.queryValues(dirPrefix, true, "LocalError", "errType") + dbSearch.queryValues(true, dirPrefix, false, "skipped", "shortMsg") + dbSearch.queryValues(true, dirPrefix, false, "", "errType") + dbSearch.queryValues(true, dirPrefix, true, "LocalError", "errType") } } -- GitLab