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