This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a commit to branch NLPCRAFT-30
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/NLPCRAFT-30 by this push:
     new a7a4305  WIP.
a7a4305 is described below

commit a7a43059fc64e821ee74ac140133a735417c1b37
Author: Sergey Kamov <[email protected]>
AuthorDate: Mon Apr 20 19:20:12 2020 +0300

    WIP.
---
 .../nlpcraft/examples/sql/SqlModelTest.scala       | 13 +++-
 .../nlpcraft/examples/sql/db/SqlAccess.scala       | 35 ++++++++---
 .../nlpcraft/examples/sql/db/SqlServer.scala       | 69 +++++++++++-----------
 .../mgrs/nlp/enrichers/sort/NCSortEnricher.scala   | 27 ++++++---
 4 files changed, 90 insertions(+), 54 deletions(-)

diff --git a/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModelTest.scala 
b/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModelTest.scala
index d82e758..eb60c77 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModelTest.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModelTest.scala
@@ -25,7 +25,9 @@ import com.github.vertical_blank.sqlformatter.SqlFormatter
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.jakewharton.fliptables.FlipTable
+import org.apache.nlpcraft.examples.sql.db.SqlServer
 import org.apache.nlpcraft.model.tools.test.{NCTestClient, NCTestClientBuilder}
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe
 import org.junit.jupiter.api.{AfterEach, BeforeEach, Test}
 
 import scala.collection.JavaConverters._
@@ -56,16 +58,25 @@ class SqlModelTest {
 
     @BeforeEach
     def setUp(): Unit = {
+        SqlServer.start()
+
+        NCEmbeddedProbe.start(classOf[SqlModel])
+
         client = new 
NCTestClientBuilder().newBuilder.setResponseLog(false).build
 
         client.open("sql.model.id")
     }
 
     @AfterEach
-    def tearDown(): Unit =
+    def tearDown(): Unit = {
         if (client != null)
             client.close()
 
+        NCEmbeddedProbe.stop()
+
+        SqlServer.stop()
+    }
+
     private def normalize(s: String): String =
         NORM.
             foldLeft(s) { (res, s) ⇒ res.replaceAll(s, " ") }.
diff --git a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala 
b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
index ca8cbca..6e1651c 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
@@ -17,16 +17,17 @@
 
 package org.apache.nlpcraft.examples.sql.db
 
-import java.sql.{Connection, SQLException}
+import java.sql.{Connection, PreparedStatement, SQLException}
 
 import com.github.vertical_blank.sqlformatter.SqlFormatter
 import com.jakewharton.fliptables.FlipTable
 import com.typesafe.scalalogging.LazyLogging
+import org.h2.jdbc.JdbcSQLException
 import org.h2.jdbcx.JdbcDataSource
 import resource.managed
 
 /**
-  * Database access service, single thread implementation.
+  * H2 Database access service, single thread implementation.
   */
 object SqlAccess extends LazyLogging {
     private final val LOG_ROWS = 10
@@ -34,17 +35,35 @@ object SqlAccess extends LazyLogging {
     private var conn: Connection = _
 
     def select(qry: SqlQuery, logResult: Boolean): SqlResult = {
-        if (conn == null)
-            conn = {
-                val ds = new JdbcDataSource
+        def getConnection: Connection = {
+            val ds = new JdbcDataSource
 
-                ds.setUrl(SqlServer.H2_URL)
+            ds.setUrl(SqlServer.H2_URL)
 
-                ds.getConnection("", "")
+            ds.getConnection("", "")
+        }
+
+        def getPs: PreparedStatement = {
+            if (conn == null)
+                conn = getConnection
+
+            try
+                conn.prepareStatement(qry.sql)
+            catch {
+                case e: JdbcSQLException ⇒
+                    // Connection broken. 
https://www.h2database.com/javadoc/org/h2/api/ErrorCode.html
+                    if (e.getErrorCode != 90067)
+                        throw e
+
+                    // Connection recreated.
+                    conn = getConnection
+
+                    conn.prepareStatement(qry.sql)
             }
+        }
 
         try {
-            managed { conn.prepareStatement(qry.sql) } acquireAndGet { ps ⇒
+            managed { getPs } acquireAndGet { ps ⇒
                 qry.parameters.zipWithIndex.foreach { case (p, idx) ⇒ 
ps.setObject(idx + 1, p) }
 
                 managed { ps.executeQuery() } acquireAndGet { rs ⇒
diff --git a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlServer.scala 
b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlServer.scala
index fba0751..600d959 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlServer.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlServer.scala
@@ -57,53 +57,50 @@ object SqlServer extends LazyLogging {
     @volatile private var srv: Server = _
     @volatile private var started: Boolean = false
 
-    def start(): Unit =
-        mux.synchronized {
-            if (started)
-                throw new IllegalStateException("Server already started")
+    def start(): Unit = {
+        if (started)
+            throw new IllegalStateException("Server already started")
 
-            srv = Server.createTcpServer(SRV_PARAMS:_*).start
+        srv = Server.createTcpServer(SRV_PARAMS:_*).start
 
-            logger.info(s"H2 server start parameters: ${SRV_PARAMS.mkString(" 
")}")
-            logger.info(s"H2 server status: ${srv.getStatus}")
+        logger.info(s"H2 server start parameters: ${SRV_PARAMS.mkString(" ")}")
+        logger.info(s"H2 server status: ${srv.getStatus}")
 
-            val ds = new JdbcDataSource()
+        val ds = new JdbcDataSource()
 
-            ds.setUrl(s"$H2_URL;INIT=RUNSCRIPT FROM '${new 
File(INIT_FILE).getAbsolutePath}'")
+        ds.setUrl(s"$H2_URL;INIT=RUNSCRIPT FROM '${new 
File(INIT_FILE).getAbsolutePath}'")
 
-            try {
-                ds.getConnection
+        try {
+            ds.getConnection
 
-                logger.info(s"Database schema initialized for: $H2_URL")
-            }
-            catch {
-                case e: SQLException ⇒
-                    // 
https://www.h2database.com/javadoc/org/h2/api/ErrorCode.html
-                    if (e.getErrorCode != 42101)
-                        throw e
+            logger.info(s"Database schema initialized for: $H2_URL")
+        }
+        catch {
+            case e: SQLException ⇒
+                // Table or view already exists. 
https://www.h2database.com/javadoc/org/h2/api/ErrorCode.html
+                if (e.getErrorCode != 42101)
+                    throw e
+
+                logger.info(
+                    s"Database '$H2_URL' is NOT initialized because data 
already exists. " +
+                    s"To re-initialize - delete files in '$H2_BASEDIR' folder 
and start again. "
+                )
+        }
 
-                    logger.info(
-                        s"Database '$H2_URL' is NOT initialized because data 
already exists. " +
-                        s"To re-initialize - delete files in '$H2_BASEDIR' 
folder and start again. "
-                    )
-            }
+        started = true
+    }
 
-            started = true
+    def stop(): Unit = {
+        if (!started)
+            throw new IllegalStateException("Server already stopped")
 
-            while (started) {
-                mux.wait()
-            }
-        }
+        if (srv != null)
+            srv.stop()
 
-    def stop(): Unit =
-        mux.synchronized {
-            if (!started)
-                throw new IllegalStateException("Server already stopped")
+        started = false
 
-            started = false
-
-            mux.notifyAll()
-        }
+        logger.info(s"H2 server stopped.")
+    }
 }
 
 /**
diff --git 
a/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
 
b/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
index e5b91ea..282ad72 100644
--- 
a/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
+++ 
b/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
@@ -283,15 +283,17 @@ object NCSortEnricher extends NCProbeEnricher {
 
             val all = sortToks ++ byToks ++ orderToks
 
-            def getKeyWordType(t: NCNlpSentenceToken): Option[String] =
+            def getKeyWordType(t: NCNlpSentenceToken): String =
                 if (sortToks.contains(t))
-                    Some("SORT")
+                    "SORT"
                 else if (byToks.contains(t))
-                    Some("BY")
+                    "BY"
                 else if (orderToks.contains(t))
-                    Some("ORDER")
+                    "ORDER"
+                else if (t.isUser)
+                    "x"
                 else
-                    None
+                    "-"
 
             val others = toks.filter(t ⇒ !all.contains(t))
 
@@ -304,8 +306,7 @@ object NCSortEnricher extends NCProbeEnricher {
                         forall(p ⇒ (p.isStopWord || p.stem == STEM_AND) && 
!MASK_WORDS.contains(p.stem))
                 ) {
                     // It removes duplicates (`SORT x x ORDER x x x` converts 
to `SORT x ORDER x`)
-                    val mask = toks.map(t ⇒
-                        getKeyWordType(t).getOrElse("x")).
+                    val mask = toks.map(getKeyWordType).
                         foldLeft("")((x, y) ⇒ if (x.endsWith(y)) x else s"$x 
$y").trim
 
                     MASKS.get(mask) match {
@@ -328,8 +329,16 @@ object NCSortEnricher extends NCProbeEnricher {
                             val data2 = if (part2.isEmpty) Seq.empty else 
toNoteData(part2)
 
                             if (data1.nonEmpty || data2.nonEmpty) {
-                                val seq1 = split(part1, data1, nullable = 
false)
-                                val seq2 = if (data2.isEmpty) Seq.empty else 
split(part2, data2, nullable = true)
+                                val seq1 =
+                                    if (data1.nonEmpty)
+                                        split(part1, data1, nullable = false)
+                                    else
+                                        split(part2, data2, nullable = false)
+                                val seq2 =
+                                    if (data1.nonEmpty && data2.nonEmpty)
+                                        split(part2, data2, nullable = true)
+                                    else
+                                        Seq.empty
                                 val asc = orderOpt.flatMap(order ⇒ 
Some(ORDER(order.synonymIndex)._2))
 
                                 typ match {

Reply via email to