This is an automated email from the ASF dual-hosted git repository.
sergeykamov pushed a commit to branch NLPCRAFT-477
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
The following commit(s) were added to refs/heads/NLPCRAFT-477 by this push:
new 5e51781 WIP.
5e51781 is described below
commit 5e5178104c71975df6b5e87b8435d12efe998173
Author: Sergey Kamov <[email protected]>
AuthorDate: Fri Feb 18 11:00:03 2022 +0300
WIP.
---
.../conversation/NCConversationManager.scala | 10 +-
.../internal/dialogflow/NCDialogFlowManager.scala | 11 +-
.../nlpcraft/internal/impl/NCModelClientImpl.scala | 105 +++++++++-----
...rocessor.scala => NCModelPipelineManager.scala} | 154 +++++++++------------
...NCIntentSolver.scala => NCIntentsManager.scala} | 2 +-
.../conversation/NCConversationManagerSpec.scala | 2 +-
.../dialogflow/NCDialogFlowManagerSpec.scala | 4 +-
...Spec.scala => NCModelPipelineManagerSpec.scala} | 51 +------
8 files changed, 152 insertions(+), 187 deletions(-)
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationManager.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationManager.scala
index a121057..cc6ba84 100644
---
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationManager.scala
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationManager.scala
@@ -27,7 +27,7 @@ import scala.jdk.CollectionConverters.*
/**
* Conversation manager.
*/
-class NCConversationManager(mdlCfg: NCModelConfig) extends LazyLogging:
+class NCConversationManager(cfg: NCModelConfig) extends LazyLogging:
case class Value(conv: NCConversationHolder, var tstamp: Long = 0)
private final val convs: mutable.Map[String, Value] =
mutable.HashMap.empty[String, Value]
@volatile private var gc: Thread = _
@@ -37,7 +37,7 @@ class NCConversationManager(mdlCfg: NCModelConfig) extends
LazyLogging:
* @return
*/
def start(): Unit =
- gc = NCUtils.mkThread("conv-mgr-gc", mdlCfg.getId) { t =>
+ gc = NCUtils.mkThread("conv-mgr-gc", cfg.getId) { t =>
while (!t.isInterrupted)
try
convs.synchronized {
@@ -55,7 +55,7 @@ class NCConversationManager(mdlCfg: NCModelConfig) extends
LazyLogging:
/**
*
*/
- def stop(): Unit =
+ def close(): Unit =
NCUtils.stopThread(gc)
gc = null
convs.clear()
@@ -70,7 +70,7 @@ class NCConversationManager(mdlCfg: NCModelConfig) extends
LazyLogging:
val delKeys = mutable.HashSet.empty[String]
for ((key, value) <- convs)
- if value.tstamp < now - mdlCfg.getConversationTimeout then
+ if value.tstamp < now - cfg.getConversationTimeout then
val data = value.conv.getUserData
data.synchronized {
data.keysSet().asScala.foreach(data.remove) }
@@ -93,7 +93,7 @@ class NCConversationManager(mdlCfg: NCModelConfig) extends
LazyLogging:
convs.synchronized {
val v = convs.getOrElseUpdate(
usrId,
- Value(NCConversationHolder(usrId, mdlCfg.getId,
mdlCfg.getConversationTimeout, mdlCfg.getConversationDepth))
+ Value(NCConversationHolder(usrId, cfg.getId,
cfg.getConversationTimeout, cfg.getConversationDepth))
)
v.tstamp = NCUtils.nowUtcMs()
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManager.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManager.scala
index ca99c0d..7181c17 100644
---
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManager.scala
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManager.scala
@@ -33,7 +33,7 @@ import java.time.format.DateTimeFormatter
/**
* Dialog flow manager.
*/
-case class NCDialogFlowManager(mdlCfg: NCModelConfig) extends LazyLogging:
+class NCDialogFlowManager(cfg: NCModelConfig) extends LazyLogging:
private final val flow = mutable.HashMap.empty[String,
mutable.ArrayBuffer[NCDialogFlowItem]]
@volatile private var gc: Thread = _
@@ -43,7 +43,7 @@ case class NCDialogFlowManager(mdlCfg: NCModelConfig) extends
LazyLogging:
* @return
*/
def start(): Unit =
- gc = NCUtils.mkThread("dialog-mgr-gc", mdlCfg.getId) { t =>
+ gc = NCUtils.mkThread("dialog-mgr-gc", cfg.getId) { t =>
while (!t.isInterrupted)
try
flow.synchronized {
@@ -59,11 +59,10 @@ case class NCDialogFlowManager(mdlCfg: NCModelConfig)
extends LazyLogging:
}
gc.start()
-
/**
*
*/
- def stop(): Unit =
+ def close(): Unit =
NCUtils.stopThread(gc)
gc = null
flow.clear()
@@ -121,7 +120,7 @@ case class NCDialogFlowManager(mdlCfg: NCModelConfig)
extends LazyLogging:
)
}
- logger.info(s"""Current dialog flow (oldest first) for
[mdlId=${mdlCfg.getId}, usrId=$usrId]\n${tbl.toString()}""")
+ logger.info(s"""Current dialog flow (oldest first) for
[mdlId=${cfg.getId}, usrId=$usrId]\n${tbl.toString()}""")
/**
* Gets next clearing time.
@@ -129,7 +128,7 @@ case class NCDialogFlowManager(mdlCfg: NCModelConfig)
extends LazyLogging:
private def clearForTimeout(): Long =
require(Thread.holdsLock(flow))
- val timeout = mdlCfg.getConversationTimeout
+ val timeout = cfg.getConversationTimeout
val bound = NCUtils.now() - timeout
var next = Long.MaxValue
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala
index 308ec71..541e8e0 100644
---
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala
@@ -20,31 +20,59 @@ package org.apache.nlpcraft.internal.impl
import com.typesafe.scalalogging.LazyLogging
import org.apache.nlpcraft.*
import org.apache.nlpcraft.internal.*
+import org.apache.nlpcraft.internal.dialogflow.NCDialogFlowManager
+import org.apache.nlpcraft.internal.intent.matcher.NCIntentsManager
import org.apache.nlpcraft.internal.util.*
import java.util.concurrent.*
import java.util.concurrent.atomic.AtomicReference
-import java.util.{Objects, List as JList, Map as JMap, Collections as JColls}
+import java.util.{Objects, Collections as JColls, List as JList, Map as JMap}
import scala.collection.mutable
import scala.concurrent.ExecutionContext
import scala.jdk.CollectionConverters.*
+import org.apache.nlpcraft.*
+import org.apache.nlpcraft.internal.dialogflow.NCDialogFlowManager
+import org.apache.nlpcraft.internal.conversation.*
+import org.apache.nlpcraft.internal.impl.*
+import org.apache.nlpcraft.internal.intent.matcher.{NCIntentsManager,
NCIntentSolverInput}
+import org.apache.nlpcraft.internal.util.*
+
+import scala.jdk.CollectionConverters.*
+import java.util
+import java.util.concurrent.*
+import java.util.concurrent.atomic.*
+import java.util.function.Predicate
+import java.util.{ArrayList, UUID, List as JList, Map as JMap}
+import scala.collection.immutable
+import scala.jdk.OptionConverters.*
+import scala.concurrent.ExecutionContext
+import scala.jdk.CollectionConverters.*
/**
*
* @param mdl
*/
class NCModelClientImpl(mdl: NCModel) extends LazyLogging:
- private val plProc = NCModelPipelineProcessor(mdl)
- private var plSrvs: Seq[NCLifecycle] = _
+ verify()
+
+ private val mdlIntents = NCModelScanner.scan(mdl)
- init(mdl.getConfig, mdl.getPipeline)
+ private val pipelineMgr = new NCModelPipelineManager(mdl.getConfig,
mdl.getPipeline)
+ private val convMgr = NCConversationManager(mdl.getConfig)
+ private val dialogMgr = NCDialogFlowManager(mdl.getConfig)
+ private val intentsMgr = NCIntentsManager(dialogMgr, mdlIntents.map(p =>
p.intent -> p.function).toMap)
/**
*
* @param cfg
* @param pipeline
*/
- private def init(cfg: NCModelConfig, pipeline: NCModelPipeline): Unit =
+ private def verify(): Unit =
+ Objects.requireNonNull(mdl, "Model cannot be null.")
+
+ val cfg = mdl.getConfig
+ val pipeline = mdl.getPipeline
+
Objects.requireNonNull(cfg.getId, "Model ID cannot be null.")
Objects.requireNonNull(cfg.getName, "Model name cannot be null.")
Objects.requireNonNull(cfg.getVersion, "Model version cannot be null.")
@@ -52,32 +80,34 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging:
Objects.requireNonNull(pipeline.getEntityParsers, "List of entity
parsers in the pipeline cannot be null.")
if pipeline.getEntityParsers.isEmpty then E(s"At least one entity
parser must be specified in the pipeline.")
- val buf = mutable.ArrayBuffer.empty[NCLifecycle] ++
pipeline.getEntityParsers.asScala
-
- def add[T <: NCLifecycle](list: JList[T]): Unit = if list != null then
buf ++= list.asScala
-
- add(pipeline.getTokenEnrichers)
- add(pipeline.getTokenValidators)
- add(pipeline.getEntityEnrichers)
- add(pipeline.getEntityParsers)
- add(pipeline.getEntityValidators)
- if pipeline.getVariantFilter.isPresent then
add(JColls.singletonList(pipeline.getVariantFilter.get()))
-
- plSrvs = buf.toSeq
- processServices(_.onStart(cfg), "started")
-
/**
*
- * @param act
- * @param actVerb
+ * @param data
+ * @return
*/
- private def processServices(act: NCLifecycle => Unit, actVerb: String):
Unit =
- NCUtils.execPar(plSrvs.map(p =>
- () => {
- act(p)
- logger.info(s"Service $actVerb: '${p.getClass.getName}'")
- }
- )*)(ExecutionContext.Implicits.global)
+ private def matchVariants(data: NCPipelineVariants): NCResult =
+ val userId = data.request.getUserId
+ val convHldr = convMgr.getConversation(userId)
+ val allEnts = data.variants.flatMap(_.getEntities.asScala)
+
+ val conv: NCConversation =
+ new NCConversation:
+ override val getSession: NCPropertyMap = convHldr.getUserData
+ override val getStm: JList[NCEntity] = convHldr.getEntities
+ override val getDialogFlow: JList[NCDialogFlowItem] =
dialogMgr.getDialogFlow(userId).asJava
+ override def clearStm(filter: Predicate[NCEntity]): Unit =
convHldr.clearEntities(filter)
+ override def clearDialog(filter: Predicate[String]): Unit =
dialogMgr.clearForPredicate(userId, (s: String) => filter.test(s))
+
+ val ctx: NCContext =
+ new NCContext:
+ override def isOwnerOf(ent: NCEntity): Boolean =
allEnts.contains(ent)
+ override val getModelConfig: NCModelConfig = mdl.getConfig
+ override val getRequest: NCRequest = data.request
+ override val getConversation: NCConversation = conv
+ override val getVariants: util.Collection[NCVariant] =
data.variants.asJava
+ override val getTokens: JList[NCToken] = data.tokens
+
+ intentsMgr.solve(NCIntentSolverInput(ctx, mdl))
/**
*
@@ -87,7 +117,13 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging:
* @return
*/
def ask(txt: String, data: JMap[String, AnyRef], usrId: String):
CompletableFuture[NCResult] =
- plProc.ask(txt, data, usrId)
+ val fut = new CompletableFuture[NCResult]
+ val check = () => if fut.isCancelled then
+ E(s"Asynchronous ask is interrupted [txt=$txt, usrId=$usrId]")
+
+ fut.completeAsync(() => matchVariants(pipelineMgr.prepare(txt, data,
usrId, Option(check))))
+
+
/**
*
@@ -97,23 +133,24 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging:
* @return
*/
def askSync(txt: String, data: JMap[String, AnyRef], usrId: String):
NCResult =
- plProc.askSync(txt, data, usrId)
+ matchVariants(pipelineMgr.prepare(txt, data, usrId))
/**
*
* @param usrId
*/
- def clearConversation(usrId: String): Unit = ???
+ def clearConversation(usrId: String): Unit = convMgr.getConversation(usrId)
/**
*
* @param usrId
*/
- def clearDialog(usrId: String): Unit = ???
+ def clearDialog(usrId: String): Unit = dialogMgr.clear(usrId)
/**
*
*/
def close(): Unit =
- plProc.close()
- processServices(_.onStop(mdl.getConfig), "stopped")
+ if pipelineMgr != null then pipelineMgr.close()
+ if convMgr != null then convMgr.close()
+ if dialogMgr != null then dialogMgr.close()
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessor.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManager.scala
similarity index 54%
rename from
nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessor.scala
rename to
nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManager.scala
index 460a45d..d56c04e 100644
---
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessor.scala
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManager.scala
@@ -18,87 +18,93 @@
package org.apache.nlpcraft.internal.impl
import com.typesafe.scalalogging.LazyLogging
-import org.apache.nlpcraft.*
-import org.apache.nlpcraft.internal.dialogflow.NCDialogFlowManager
+import org.apache.nlpcraft.{NCModelConfig, NCModelPipeline, *}
import org.apache.nlpcraft.internal.conversation.*
+import org.apache.nlpcraft.internal.dialogflow.NCDialogFlowManager
import org.apache.nlpcraft.internal.impl.*
-import org.apache.nlpcraft.internal.intent.matcher.{NCIntentSolver,
NCIntentSolverInput}
+import org.apache.nlpcraft.internal.intent.matcher.*
import org.apache.nlpcraft.internal.util.*
-import scala.jdk.CollectionConverters.*
import java.util
import java.util.concurrent.*
import java.util.concurrent.atomic.*
import java.util.function.Predicate
-import java.util.{ArrayList, UUID, List as JList, Map as JMap}
-import scala.collection.immutable
-import scala.jdk.OptionConverters.*
+import java.util.{ArrayList, Objects, UUID, Collections as JColls, List as
JList, Map as JMap}
+import scala.collection.{immutable, mutable}
import scala.concurrent.ExecutionContext
import scala.jdk.CollectionConverters.*
+import scala.jdk.OptionConverters.*
/**
*
- * @param mdl
+ * @param request
+ * @param variants
+ * @param tokens
+ * @param checkCancel
*/
-class NCModelPipelineProcessor(mdl: NCModel) extends LazyLogging:
- case class VariantsHolder(request: NCRequest, variants: Seq[NCVariant],
tokens: JList[NCToken], checkCancel: Option[() => Unit])
-
- require(mdl != null)
- require(mdl.getPipeline.getTokenParser != null)
- require(mdl.getPipeline.getEntityParsers != null)
- require(!mdl.getPipeline.getEntityParsers.isEmpty)
+case class NCPipelineVariants(request: NCRequest, variants: Seq[NCVariant],
tokens: JList[NCToken], checkCancel: Option[() => Unit])
- private val pipeline = mdl.getPipeline
+/**
+ *
+ * @param cfg
+ * @param pipeline
+ */
+class NCModelPipelineManager(cfg: NCModelConfig, pipeline: NCModelPipeline)
extends LazyLogging:
private val pool = new java.util.concurrent.ForkJoinPool()
- private val cfg = mdl.getConfig
private val tokParser = pipeline.getTokenParser
private val tokEnrichers = nvl(pipeline.getTokenEnrichers)
private val entEnrichers = nvl(pipeline.getEntityEnrichers)
private val entParsers = nvl(pipeline.getEntityParsers)
private val tokVals = nvl(pipeline.getTokenValidators)
private val entVals = nvl(pipeline.getEntityValidators)
- private val varFilter = pipeline.getVariantFilter.toScala
+ private val varFilterOpt = pipeline.getVariantFilter.toScala
- private val convMgr = NCConversationManager(mdl.getConfig)
- private val dialogMgr = NCDialogFlowManager(mdl.getConfig)
- private val mdlIntents = NCModelScanner.scan(mdl)
- private val solver = NCIntentSolver(dialogMgr, mdlIntents.map(p =>
p.intent -> p.function).toMap)
+ private var allSrvs: Seq[NCLifecycle] =
+ tokEnrichers ++ entEnrichers ++ entParsers ++ tokVals ++ entVals ++
varFilterOpt.toSeq
+
+ processServices(_.onStart(cfg), "started")
/**
*
- * @param list
- * @tparam T
- * @return
+ * @param cfg
+ * @param pipeline
*/
- private def nvl[T](list: JList[T]): Seq[T] = if list == null then
Seq.empty else list.asScala.toSeq
+ private def init(): Unit =
+ val buf = mutable.ArrayBuffer.empty[NCLifecycle] ++
pipeline.getEntityParsers.asScala
+
+ def add[T <: NCLifecycle](list: JList[T]): Unit = if list != null then
buf ++= list.asScala
+
+ add(pipeline.getTokenEnrichers)
+ add(pipeline.getTokenValidators)
+ add(pipeline.getEntityEnrichers)
+ add(pipeline.getEntityParsers)
+ add(pipeline.getEntityValidators)
+ if pipeline.getVariantFilter.isPresent then
add(JColls.singletonList(pipeline.getVariantFilter.get()))
+
+ allSrvs = buf.toSeq
+
+ processServices(_.onStart(cfg), "started")
+
+ /**
+ *
+ * @param act
+ * @param actVerb
+ */
+ private def processServices(act: NCLifecycle => Unit, actVerb: String):
Unit =
+ NCUtils.execPar(allSrvs.map(p =>
+ () => {
+ act(p)
+ logger.info(s"Service $actVerb: '${p.getClass.getName}'")
+ }
+ )*)(ExecutionContext.Implicits.global)
/**
*
- * @param h
+ * @param list
+ * @tparam T
* @return
*/
- private def matchIntent(h: VariantsHolder): NCResult =
- val userId = h.request.getUserId
- val convHldr = convMgr.getConversation(userId)
- val allEnts = h.variants.flatMap(_.getEntities.asScala)
-
- val conv =
- new NCConversation:
- override val getSession: NCPropertyMap = convHldr.getUserData
- override val getStm: JList[NCEntity] = convHldr.getEntities
- override val getDialogFlow: JList[NCDialogFlowItem] =
dialogMgr.getDialogFlow(userId).asJava
- override def clearStm(filter: Predicate[NCEntity]): Unit =
convHldr.clearEntities(filter)
- override def clearDialog(filter: Predicate[String]): Unit =
dialogMgr.clearForPredicate(userId, (s: String) => filter.test(s))
-
- val ctx = new NCContext:
- override def isOwnerOf(ent: NCEntity): Boolean =
allEnts.contains(ent)
- override val getModelConfig: NCModelConfig = mdl.getConfig
- override val getRequest: NCRequest = h.request
- override val getConversation: NCConversation = conv
- override val getVariants: util.Collection[NCVariant] =
h.variants.asJava
- override val getTokens: JList[NCToken] = h.tokens
-
- solver.solve(NCIntentSolverInput(ctx, mdl))
+ private def nvl[T](list: JList[T]): Seq[T] = if list == null then
Seq.empty else list.asScala.toSeq
/**
*
@@ -108,12 +114,7 @@ class NCModelPipelineProcessor(mdl: NCModel) extends
LazyLogging:
* @param checkCancel
* @return
*/
- private[internal] def prepVariants(
- txt: String,
- data: JMap[String, AnyRef],
- usrId: String,
- checkCancel: Option[() => Unit] = None
- ): VariantsHolder =
+ def prepare(txt: String, data: JMap[String, AnyRef], usrId: String,
checkCancel: Option[() => Unit] = None): NCPipelineVariants =
require(txt != null && usrId != null)
/**
@@ -172,48 +173,23 @@ class NCModelPipelineProcessor(mdl: NCModel) extends
LazyLogging:
var variants: JList[NCVariant] =
if overlapEnts.nonEmpty then
-
NCModelPipelineHelper.findCombinations(overlapEnts.map(_.asJava).asJava, pool)
- .asScala.map(_.asScala).map(delComb =>
+ NCModelPipelineHelper.
+ findCombinations(overlapEnts.map(_.asJava).asJava, pool).
+ asScala.map(_.asScala).map(delComb =>
val delSet = delComb.toSet
newVariant(entities.filter(!delSet.contains(_)))
).asJava
else
Seq(newVariant(entities)).asJava
- if varFilter.isDefined then
+ if varFilterOpt.isDefined then
check()
- variants = varFilter.get.filter(req, cfg, variants)
-
- VariantsHolder(req, variants.asScala.toSeq, toks, checkCancel)
-
- /**
- *
- * @param txt
- * @param data
- * @param usrId
- * @return
- * @throws NCRejection
- * @throws NCCuration
- * @throws NCException
- */
- def askSync(txt: String, data: JMap[String, AnyRef], usrId: String):
NCResult = matchIntent(prepVariants(txt, data, usrId))
-
- /**
- * TODO: explain all exceptions that are thrown by the future.
- *
- * @param txt
- * @param data
- * @param usrId
- * @return
- */
- def ask(txt: String, data: JMap[String, AnyRef], usrId: String):
CompletableFuture[NCResult] =
- val fut = new CompletableFuture[NCResult]
- val check = () => if fut.isCancelled then
- E(s"Asynchronous ask is interrupted [txt=$txt, usrId=$usrId]")
-
- fut.completeAsync(() => matchIntent(prepVariants(txt, data, usrId,
Option(check))))
+ variants = varFilterOpt.get.filter(req, cfg, variants)
+ NCPipelineVariants(req, variants.asScala.toSeq, toks, checkCancel)
/**
*
*/
- def close(): Unit = NCUtils.shutdownPool(pool)
+ def close(): Unit =
+ processServices(_.onStop(cfg), "stopped")
+ NCUtils.shutdownPool(pool)
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolver.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
similarity index 99%
rename from
nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolver.scala
rename to
nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
index 734fe40..37525e5 100644
---
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolver.scala
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
@@ -34,7 +34,7 @@ import scala.language.postfixOps
/**
* Intent solver that finds the best matching intent given user sentence.
*/
-case class NCIntentSolver(dialog: NCDialogFlowManager, intents:
Map[NCIDLIntent, NCIntentMatch => NCResult]) extends LazyLogging:
+class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent,
NCIntentMatch => NCResult]) extends LazyLogging:
/**
* NOTE: not thread-safe.
*/
diff --git
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/conversation/NCConversationManagerSpec.scala
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/conversation/NCConversationManagerSpec.scala
index 61af791..4a3de41 100644
---
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/conversation/NCConversationManagerSpec.scala
+++
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/conversation/NCConversationManagerSpec.scala
@@ -91,5 +91,5 @@ class NCConversationManagerSpec:
Thread.sleep(timeout * 2)
checkSize(0)
finally
- mgr.stop()
+ mgr.close()
diff --git
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManagerSpec.scala
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManagerSpec.scala
index ef93002..cf0e371 100644
---
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManagerSpec.scala
+++
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/dialogflow/NCDialogFlowManagerSpec.scala
@@ -75,7 +75,7 @@ class NCDialogFlowManagerSpec:
*
*/
@AfterEach
- def cleanUp(): Unit = if mgr != null then mgr.stop()
+ def cleanUp(): Unit = if mgr != null then mgr.close()
@Test
def test(): Unit =
@@ -128,5 +128,5 @@ class NCDialogFlowManagerSpec:
Thread.sleep(delay * 5)
check("user1" -> 1, "user2" -> 0)
- mgr.stop()
+ mgr.close()
check("user1" -> 0, "user2" -> 0)
diff --git
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessorSpec.scala
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
similarity index 59%
rename from
nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessorSpec.scala
rename to
nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
index c9eb33c..76371c0 100644
---
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineProcessorSpec.scala
+++
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
@@ -18,7 +18,6 @@
package org.apache.nlpcraft.internal.impl
import org.apache.nlpcraft.*
-import org.apache.nlpcraft.internal.impl.NCModelPipelineProcessor
import org.apache.nlpcraft.nlp.entity.parser.nlp.impl.NCNLPEntityParserImpl
import org.apache.nlpcraft.nlp.entity.parser.semantic.*
import
org.apache.nlpcraft.nlp.entity.parser.semantic.impl.en.NCEnSemanticPorterStemmer
@@ -36,7 +35,7 @@ import scala.jdk.CollectionConverters.*
/**
*
*/
-class NCModelPipelineProcessorSpec:
+class NCModelPipelineManagerSpec:
/**
*
*/
@@ -49,7 +48,7 @@ class NCModelPipelineProcessorSpec:
pipeline.getEntityParsers.clear()
pipeline.getEntityParsers.add(parser)
- val res = new NCModelPipelineProcessor(new NCModelAdapter(CFG,
pipeline)).prepVariants(txt, null, "userId")
+ val res = new NCModelPipelineManager(CFG, pipeline).prepare(txt,
null, "userId")
println(s"Variants count: ${res.variants.size}")
for ((v, idx) <- res.variants.zipWithIndex)
@@ -61,49 +60,3 @@ class NCModelPipelineProcessorSpec:
test("t1 t2", 4, NCSemanticTestElement("t1", "t2"),
NCSemanticTestElement("t2", "t1"))
test("t1 t2", 2, NCSemanticTestElement("t1", "t2"),
NCSemanticTestElement("t2"))
- /**
- *
- * @param delayMs
- * @param iterCnt
- * @return
- */
- private def mkSlowPipelineProcessor(delayMs: Long, iterCnt: Int):
NCModelPipelineProcessor =
- val pipeline = EN_PIPELINE.clone()
-
- pipeline.getEntityParsers.clear()
-
- def mkSlowParser(i: Int) =
- new NCEntityParser:
- override def parse(req: NCRequest, cfg: NCModelConfig, toks:
JList[NCToken]): JList[NCEntity] =
- println(s"Parser called: $i")
- Thread.sleep(delayMs)
- java.util.Collections.emptyList()
-
- (0 until iterCnt).foreach(i =>
pipeline.getEntityParsers.add(mkSlowParser(i)))
-
- NCModelPipelineProcessor(new NCModelAdapter(CFG, pipeline))
-
- /**
- *
- */
- @Test
- def testCancel(): Unit =
- val fut = mkSlowPipelineProcessor(1, 10000).ask("any", null, "userId")
-
- Thread.sleep(20)
- require(fut.cancel(true))
- Thread.sleep(20)
-
- Assertions.assertThrows(classOf[CancellationException], () => fut.get)
-
- /**
- *
- */
- @Test
- def testTimeout(): Unit =
- val fut = mkSlowPipelineProcessor(1, 10000).ask("any", null, "userId")
-
- Thread.sleep(20)
-
- try Assertions.assertThrows(classOf[TimeoutException], () =>
fut.get(1, TimeUnit.MILLISECONDS))
- finally fut.cancel(true)