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 {