WIP on NLPCRAFT-371
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelView.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelView.java
index c65737f..edd9561 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelView.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelView.java
@@ -159,8 +159,7 @@
int MODEL_VERSION_MAXLEN = 16;
/**
- * TODO:
- * Max model element length for {@link NCElement#getId()} method.
+ * Max length for {@link NCElement#getId()} method.
*/
int MODEL_ELEMENT_ID_MAXLEN = 64;
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliCommands.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliCommands.scala
index 0f86e13..675fa49 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliCommands.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliCommands.scala
@@ -246,7 +246,7 @@
examples = Seq(
Example(
usage = Seq(
- s"$PROMPT $SCRIPT_NAME call -p=signin",
+ s"> call -p=signin",
" --email=admin@admin.com",
" --passwd=admin"
),
@@ -257,7 +257,7 @@
),
Example(
usage = Seq(
- s"$$ nlpcraft.sh call --path=ask/sync",
+ s"> call --path=ask/sync",
" --acsTok=qwerty123456",
" --txt=\"User request\"",
" --mdlId=my.model.id",
@@ -265,20 +265,7 @@
" --enableLog=false"
),
desc =
- s"${bo("Unix/Linux:")} issues ${y("'ask/sync'")} REST call with given JSON payload provided as a set of parameters."
- ),
- Example(
- usage = Seq(
- s"> nlpcraft.cmd call --path=ask/sync",
- " --acsTok=qwerty123456",
- " --txt=\"User request\"",
- " --mdlId=my.model.id",
- " --data='{\\\"data1\\\": true, \\\"data2\\\": 123, \\\"data3\\\": \\\"some text\\\"}'",
- " --enableLog=false"
- ),
- desc =
- s"${bo("Windows:")} issues ${y("'ask/sync'")} REST call with given JSON payload provided " +
- s"as a set of parameters. Note the necessary double quote escaping."
+ s"Issues ${y("'ask/sync'")} REST call with given JSON payload provided as a set of parameters."
)
)
),
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliRestSpec.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliRestSpec.scala
index 4c23223..e524e2c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliRestSpec.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCliRestSpec.scala
@@ -78,6 +78,16 @@
)
),
RestSpec(
+ "model/syns",
+ "Gets model element synonyms",
+ "Tools",
+ params = Seq(
+ RestSpecParameter(name = "acsTok", kind = STRING),
+ RestSpecParameter(name = "mdlId", kind = STRING),
+ RestSpecParameter(name = "elmId", kind = STRING)
+ )
+ ),
+ RestSpec(
"check",
"Gets status and result of submitted requests",
"Asking",
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
index 2c6acca..ef676af 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/cmd/NCCommandManager.scala
@@ -161,16 +161,17 @@
),
span
)
+
case "S2P_MODEL_ELEMENT_INFO" =>
send0(
mkMsg = () => {
val mdlId = msg.data[String]("mdlId")
- val elemId = msg.data[String]("elemId")
+ val elmId = msg.data[String]("elmId")
val elm = NCModelManager.
getModel(mdlId).
- model.getElements.asScala.find(_.getId == elemId).
- getOrElse(throw new NCE(s"Element not found in model: $elemId"))
+ model.getElements.asScala.find(_.getId == elmId).
+ getOrElse(throw new NCE(s"Element not found in model: $elmId"))
val vals: util.Map[String, JList[String]] =
if (elm.getValues != null)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
index 9ed5af3..028608a 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
@@ -923,19 +923,18 @@
checkCollection("metadata", mdl.getMetadata)
checkCollection("restrictedCombinations", mdl.getRestrictedCombinations)
- // TODO:
- mdl.getElements.asScala.foreach(e => checkMandatoryString(e.getId, s"elementId=${e.getId}", MODEL_ELEMENT_ID_MAXLEN))
+ mdl.getElements.asScala.foreach(e => checkMandatoryString(e.getId,"element.id", MODEL_ELEMENT_ID_MAXLEN))
for ((elm, restrs: util.Set[String]) <- mdl.getRestrictedCombinations.asScala) {
if (elm != "nlpcraft:limit" && elm != "nlpcraft:sort" && elm != "nlpcraft:relation")
- throw new NCE(s"Unsupported restricting element ID [" +
+ throw new NCE(s"Unsupported restricting element [" +
s"mdlId=$mdlId, " +
- s"elemId=$elm" +
+ s"elmId=$elm" +
s"]. Only 'nlpcraft:limit', 'nlpcraft:sort', and 'nlpcraft:relation' are allowed.")
if (restrs.contains(elm))
throw new NCE(s"Element cannot be restricted to itself [" +
s"mdlId=$mdlId, " +
- s"elemId=$elm" +
+ s"elmId=$elm" +
s"]")
}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/model/NCModelEnricher.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/model/NCModelEnricher.scala
index a2deee8..1f81711 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/model/NCModelEnricher.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/model/NCModelEnricher.scala
@@ -250,14 +250,14 @@
if (res != null)
res.asScala.foreach(e => {
- val elemId = e.getElementId
+ val elmId = e.getElementId
val words = e.getWords
- if (elemId == null)
+ if (elmId == null)
throw new NCE(s"Custom model parser cannot return 'null' element ID.")
if (words == null || words.isEmpty)
- throw new NCE(s"Custom model parser cannot return empty custom tokens [elementId=$elemId]")
+ throw new NCE(s"Custom model parser cannot return empty custom tokens for element: $elmId")
val matchedToks = words.asScala.map(w =>
ns.find(t =>
@@ -266,10 +266,10 @@
)
// Checks element's tokens.
- if (!alreadyMarked(ns, elemId, matchedToks, matchedToks.map(_.index).sorted))
+ if (!alreadyMarked(ns, elmId, matchedToks, matchedToks.map(_.index).sorted))
mark(
ns,
- elem = mdl.elements.getOrElse(elemId, throw new NCE(s"Custom model parser returned unknown element ID: $elemId")),
+ elem = mdl.elements.getOrElse(elmId, throw new NCE(s"Custom model parser returned unknown element: $elmId")),
toks = matchedToks,
direct = true,
metaOpt = Some(e.getMetadata.asScala.toMap)
@@ -577,16 +577,16 @@
// TODO: simplify, add tests, check model properties (sparse etc) for optimization.
/**
*
- * @param elemId
+ * @param elmId
* @param toks
* @param sliceToksIdxsSorted
*/
- private def alreadyMarked(ns: Sentence, elemId: String, toks: Seq[NlpToken], sliceToksIdxsSorted: Seq[Int]): Boolean = {
+ private def alreadyMarked(ns: Sentence, elmId: String, toks: Seq[NlpToken], sliceToksIdxsSorted: Seq[Int]): Boolean = {
lazy val toksIdxsSorted = toks.map(_.index).sorted
- sliceToksIdxsSorted.map(ns).forall(_.exists(n => n.noteType == elemId && n.sparsity == 0)) ||
+ sliceToksIdxsSorted.map(ns).forall(_.exists(n => n.noteType == elmId && n.sparsity == 0)) ||
toks.exists(_.exists(n =>
- n.noteType == elemId &&
+ n.noteType == elmId &&
(
(n.sparsity == 0 &&
(sliceToksIdxsSorted.containsSlice(n.tokenIndexes) || n.tokenIndexes.containsSlice(toksIdxsSorted))
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/opencensus/NCOpenCensusServerStats.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/opencensus/NCOpenCensusServerStats.scala
index dde284a..e826dda 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/opencensus/NCOpenCensusServerStats.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/opencensus/NCOpenCensusServerStats.scala
@@ -28,7 +28,7 @@
val M_HEALTH_MS: MeasureLong = MeasureLong.create("health_latency", "The latency of '/health' REST call", "ms")
val M_ASK_LATENCY_MS: MeasureLong = MeasureLong.create("ask_latency", "The latency of '/ask' REST call", "ms")
val M_CHECK_LATENCY_MS: MeasureLong = MeasureLong.create("check_latency", "The latency of '/check' REST call", "ms")
- val M_MODEL_SUGSYN_LATENCY_MS: MeasureLong = MeasureLong.create("model_inspect_latency", "The latency of '/model/inspect' REST call", "ms")
+ val M_MODEL_SUGSYN_LATENCY_MS: MeasureLong = MeasureLong.create("model_inspect_latency", "The latency of '/model/sugsyn' REST call", "ms")
val M_MODEL_SYNS_LATENCY_MS: MeasureLong = MeasureLong.create("model_synonyms_latency", "The latency of '/model/syns' REST call", "ms")
val M_CANCEL_LATENCY_MS: MeasureLong = MeasureLong.create("cancel_latency", "The latency of '/cancel' REST call", "ms")
val M_SIGNIN_LATENCY_MS: MeasureLong = MeasureLong.create("signin_latency", "The latency of '/signin' REST call", "ms")
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
index a6c4ce9..12db28b 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
@@ -158,7 +158,7 @@
@volatile private var pending: mutable.Map[ProbeKey, ProbeHolder] = _
@volatile private var modelsInfo: ConcurrentHashMap[String, Promise[JavaMeta]] = _
- @volatile private var modelElemsInfo: ConcurrentHashMap[String, Promise[JavaMeta]] = _
+ @volatile private var modelElmsInfo: ConcurrentHashMap[String, Promise[JavaMeta]] = _
/**
*
@@ -181,7 +181,7 @@
)
modelsInfo = new ConcurrentHashMap[String, Promise[JavaMeta]]()
- modelElemsInfo = new ConcurrentHashMap[String, Promise[JavaMeta]]()
+ modelElmsInfo = new ConcurrentHashMap[String, Promise[JavaMeta]]()
dnSrv = startServer("Downlink", dnHost, dnPort, downLinkHandler)
upSrv = startServer("Uplink", upHost, upPort, upLinkHandler)
@@ -219,7 +219,7 @@
U.stopThread(upSrv)
modelsInfo = null
- modelElemsInfo = null
+ modelElmsInfo = null
ackStopped()
}
@@ -626,20 +626,20 @@
mdlName,
mdlVer,
enabledBuiltInToks,
- elemIds
+ elmIds
) =>
require(mdlId != null)
require(mdlName != null)
require(mdlVer != null)
require(enabledBuiltInToks != null)
- require(elemIds != null)
+ require(elmIds != null)
NCProbeModelMdo(
id = mdlId,
name = mdlName,
version = mdlVer,
enabledBuiltInTokens = enabledBuiltInToks.asScala.toSet,
- elementIds = elemIds.asScala.toSet
+ elementIds = elmIds.asScala.toSet
)
}.toSet
@@ -725,8 +725,9 @@
}
else
logger.warn(s"Message ignored: $probeMsg")
+
case "P2S_MODEL_ELEMENT_INFO" =>
- val p = modelElemsInfo.remove(probeMsg.data[String]("reqGuid"))
+ val p = modelElmsInfo.remove(probeMsg.data[String]("reqGuid"))
if (p != null)
probeMsg.dataOpt[String]("resp") match {
@@ -785,6 +786,7 @@
NCErrorCodes.UNEXPECTED_ERROR
)
}
+
case _ =>
logger.error(s"Received unrecognized probe message (ignoring): $probeMsg")
}
@@ -992,19 +994,19 @@
*
* @param compId Company ID for authentication purpose.
* @param mdlId Model ID.
- * @param elemId Element ID.
+ * @param elmId Element ID.
* @param parent Optional parent span.
* @return
*/
- def existsForModelElement(compId: Long, mdlId: String, elemId: String, parent: Span = null): Boolean =
+ def existsForModelElement(compId: Long, mdlId: String, elmId: String, parent: Span = null): Boolean =
startScopedSpan(
- "existsForModelElement", parent, "compId" -> compId, "mdlId" -> mdlId, "elemId" -> elemId
+ "existsForModelElement", parent, "compId" -> compId, "mdlId" -> mdlId, "elmId" -> elmId
) { _ =>
val authTok = getCompany(compId).authToken
probes.synchronized {
probes.filter(_._1.probeToken == authTok).values.
- exists(_.probe.models.exists(p => p.id == mdlId && p.elementIds.contains(elemId)))
+ exists(_.probe.models.exists(p => p.id == mdlId && p.elementIds.contains(elmId)))
}
}
@@ -1099,16 +1101,16 @@
/**
*
* @param mdlId
- * @param elemId
+ * @param elmId
* @param parent
* @return
*/
- def getElementInfo(mdlId: String, elemId: String, parent: Span = null): Future[JavaMeta] =
- startScopedSpan("getModelInfo", parent, "mdlId" -> mdlId, "elemId" -> elemId) { _ =>
+ def getElementInfo(mdlId: String, elmId: String, parent: Span = null): Future[JavaMeta] =
+ startScopedSpan("getModelInfo", parent, "mdlId" -> mdlId, "elmId" -> elmId) { _ =>
processModelDataRequest(
mdlId,
- NCProbeMessage("S2P_MODEL_ELEMENT_INFO", "mdlId" -> mdlId, "elemId" -> elemId),
- modelElemsInfo,
+ NCProbeMessage("S2P_MODEL_ELEMENT_INFO", "mdlId" -> mdlId, "elmId" -> elmId),
+ modelElmsInfo,
parent
)
}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
index 91d5d8e..cdbde7d 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
@@ -88,7 +88,7 @@
case class InvalidExternalUserId(usrExtId: String) extends InvalidArguments(s"External user ID is invalid or unknown: $usrExtId")
case class InvalidUserId(id: Long) extends InvalidArguments(s"User ID is invalid or unknown: $id")
case class InvalidModelId(id: String) extends InvalidArguments(s"Unknown model ID: $id")
- case class InvalidModelOrElementId(mdlId: String, elemId: String) extends InvalidArguments(s"Unknown model ID: $mdlId or element ID: $elemId")
+ case class InvalidModelOrElementId(mdlId: String, elmId: String) extends InvalidArguments(s"Unknown model element ID: $elmId")
case class AskReqHolder(
usrId: Long,
@@ -107,7 +107,7 @@
private final val STD_FIELD_LENGTHS = Map[String, Int](
"srvReqId" -> 32,
"mdlId" -> NCModelView.MODEL_ID_MAXLEN,
- "elemId" -> NCModelView.MODEL_ELEMENT_ID_MAXLEN,
+ "elmId" -> NCModelView.MODEL_ELEMENT_ID_MAXLEN,
"country" -> 32,
"postalCode" -> 32,
@@ -471,7 +471,7 @@
*
* @return
*/
- protected def signin$(): Route = {
+ protected def $signin(): Route = {
case class Req$Signin$(
email: String,
passwd: String
@@ -506,7 +506,7 @@
*
* @return
*/
- protected def health$(): Route = {
+ protected def $health(): Route = {
case class Res$Health$(status: String)
implicit val resFmt: RootJsonFormat[Res$Health$] = jsonFormat1(Res$Health$)
@@ -520,7 +520,7 @@
*
* @return
*/
- protected def signout$(): Route = {
+ protected def $signout(): Route = {
case class Req$Signout$(
acsTok: String
)
@@ -634,7 +634,7 @@
*
* @return
*/
- protected def ask$(): Route =
+ protected def $ask(): Route =
ask0(
(h: AskReqHolder) => {
val newSrvReqId = NCQueryManager.asyncAsk(
@@ -665,7 +665,7 @@
*
* @return
*/
- protected def ask$Sync(): Route =
+ protected def $ask$Sync(): Route =
ask0(
(h: AskReqHolder) => {
val fut = NCQueryManager.futureAsk(
@@ -697,7 +697,7 @@
*
* @return
*/
- protected def cancel$(): Route = {
+ protected def $cancel(): Route = {
case class Req$Cancel$(
acsTok: String,
usrId: Option[Long],
@@ -736,7 +736,7 @@
*
* @return
*/
- protected def check$(): Route = {
+ protected def $check(): Route = {
case class Req$Check$(
acsTok: String,
usrId: Option[Long],
@@ -787,7 +787,7 @@
*
* @return
*/
- protected def sugsyn$(): Route = {
+ protected def $model$sugsyn(): Route = {
case class Req$Model$Sugsyn(
acsTok: String,
mdlId: String,
@@ -826,29 +826,32 @@
*
* @return
*/
- protected def elementSynonyms$(): Route = {
- case class Req$Model$Syn(
+ protected def $model$syns(): Route = {
+ case class Req$Model$Syns(
acsTok: String,
mdlId: String,
- elemId: String
+ elmId: String
)
- implicit val reqFmt: RootJsonFormat[Req$Model$Syn] = jsonFormat3(Req$Model$Syn)
+ implicit val reqFmt: RootJsonFormat[Req$Model$Syns] = jsonFormat3(Req$Model$Syns)
- entity(as[Req$Model$Syn]) { req =>
+ entity(as[Req$Model$Syns]) { req =>
startScopedSpan(
"model$syns",
"acsTok" -> req.acsTok,
"mdlId" -> req.mdlId,
- "elemId" -> req.elemId) { span =>
- checkLength("acsTok" -> req.acsTok, "mdlId" -> req.mdlId, "elemId" -> req.elemId)
+ "elmId" -> req.elmId) { span =>
+ checkLength("acsTok" -> req.acsTok, "mdlId" -> req.mdlId, "elmId" -> req.elmId)
val admUsr = authenticateAsAdmin(req.acsTok)
+ val compId = admUsr.companyId
- if (!NCProbeManager.existsForModelElement(admUsr.companyId, req.mdlId, req.elemId))
- throw InvalidModelOrElementId(req.mdlId, req.elemId)
+ if (!NCProbeManager.existsForModel(compId, req.mdlId))
+ throw InvalidModelId(req.mdlId)
+ if (!NCProbeManager.existsForModelElement(compId, req.mdlId, req.elmId))
+ throw InvalidModelOrElementId(req.mdlId, req.elmId)
- val fut = NCProbeManager.getElementInfo(req.mdlId, req.elemId, span)
+ val fut = NCProbeManager.getElementInfo(req.mdlId, req.elmId, span)
successWithJs(
fut.collect {
@@ -873,7 +876,7 @@
*
* @return
*/
- protected def clear$Conversation(): Route = {
+ protected def $clear$Conversation(): Route = {
case class Req$Clear$Conversation(
acsTok: String,
mdlId: String,
@@ -918,7 +921,7 @@
*
* @return
*/
- protected def clear$Dialog(): Route = {
+ protected def $clear$Dialog(): Route = {
case class Req$Clear$Dialog(
acsTok: String,
mdlId: String,
@@ -963,7 +966,7 @@
*
* @return
*/
- protected def company$Add(): Route = {
+ protected def $company$Add(): Route = {
case class Req$Company$Add(
acsTok: String,
// New company.
@@ -1043,7 +1046,7 @@
*
* @return
*/
- protected def company$Get(): Route = {
+ protected def $company$Get(): Route = {
case class Req$Company$Get(
acsTok: String
)
@@ -1093,7 +1096,7 @@
*
* @return
*/
- protected def company$Update(): Route = {
+ protected def $company$Update(): Route = {
case class Req$Company$Update(
// Caller.
acsTok: String,
@@ -1154,7 +1157,7 @@
*
* @return
*/
- protected def feedback$Add(): Route = {
+ protected def $feedback$Add(): Route = {
case class Req$Feedback$Add(
acsTok: String,
usrId : Option[Long],
@@ -1207,7 +1210,7 @@
*
* @return
*/
- protected def feedback$Delete(): Route = {
+ protected def $feedback$Delete(): Route = {
case class Req$Feedback$Delete(
acsTok: String,
// Feedback IDs to delete (optional).
@@ -1264,7 +1267,7 @@
*
* @return
*/
- protected def feedback$All(): Route = {
+ protected def $feedback$All(): Route = {
case class Req$Feedback$All(
acsTok: String,
usrId: Option[Long],
@@ -1334,7 +1337,7 @@
*
* @return
*/
- protected def company$Token$Reset(): Route = {
+ protected def $company$Token$Reset(): Route = {
case class Req$Company$Token$Reset(
// Caller.
acsTok: String
@@ -1366,7 +1369,7 @@
*
* @return
*/
- protected def company$Delete(): Route = {
+ protected def $company$Delete(): Route = {
case class Req$Company$Delete(
// Caller.
acsTok: String
@@ -1397,7 +1400,7 @@
*
* @return
*/
- protected def user$Add(): Route = {
+ protected def $user$Add(): Route = {
case class Req$User$Add(
// Caller.
acsTok: String,
@@ -1459,7 +1462,7 @@
*
* @return
*/
- protected def user$Update(): Route = {
+ protected def $user$Update(): Route = {
case class Req$User$Update(
// Caller.
acsTok: String,
@@ -1510,7 +1513,7 @@
*
* @return
*/
- protected def user$Delete(): Route = {
+ protected def $user$Delete(): Route = {
case class Req$User$Delete(
acsTok: String,
id: Option[Long],
@@ -1575,7 +1578,7 @@
*
* @return
*/
- protected def user$Admin(): Route = {
+ protected def $user$Admin(): Route = {
case class Req$User$Admin(
acsTok: String,
id: Option[Long],
@@ -1618,7 +1621,7 @@
*
* @return
*/
- protected def user$Password$Reset(): Route = {
+ protected def $user$Passwd$Reset(): Route = {
case class Req$User$Password$Reset(
// Caller.
acsTok: String,
@@ -1653,7 +1656,7 @@
*
* @return
*/
- protected def user$All(): Route = {
+ protected def $user$All(): Route = {
case class Req$User$All(
// Caller.
acsTok: String
@@ -1708,7 +1711,7 @@
*
* @return
*/
- protected def user$Get(): Route = {
+ protected def $user$Get(): Route = {
case class Req$User$Get(
// Caller.
acsTok: String,
@@ -1763,7 +1766,7 @@
*
* @return
*/
- protected def probe$All(): Route = {
+ protected def $probe$All(): Route = {
case class Req$Probe$All(
acsTok: String
)
@@ -1997,39 +2000,39 @@
corsHandler (
get {
withRequestTimeoutResponse(_ => timeoutResp) {
- path(API / "health") { health$() } // Also duplicated for POST.
+ path(API / "health") { $health() } // Also duplicated for POST.
}
} ~
post {
encodeResponseWith(Coders.NoCoding, Coders.Gzip) {
withRequestTimeoutResponse(_ => timeoutResp) {
- path(API / "health") { health$() } // Duplicate for POST.
- path(API / "signin") { withMetric(M_SIGNIN_LATENCY_MS, signin$) } ~
- path(API / "signout") { withMetric(M_SIGNOUT_LATENCY_MS, signout$) } ~
- path(API / "cancel") { withMetric(M_CANCEL_LATENCY_MS, cancel$) } ~
- path(API / "check") { withMetric(M_CHECK_LATENCY_MS, check$) } ~
- path(API / "clear"/ "conversation") { withMetric(M_CLEAR_CONV_LATENCY_MS, clear$Conversation) } ~
- path(API / "clear"/ "dialog") { withMetric(M_CLEAR_DIALOG_LATENCY_MS, clear$Dialog) } ~
- path(API / "company"/ "add") { withMetric(M_COMPANY_ADD_LATENCY_MS, company$Add) } ~
- path(API / "company"/ "get") { withMetric(M_COMPANY_GET_LATENCY_MS, company$Get) } ~
- path(API / "company" / "update") { withMetric(M_COMPANY_UPDATE_LATENCY_MS, company$Update) } ~
- path(API / "company" / "token" / "reset") { withMetric(M_COMPANY_TOKEN_LATENCY_MS, company$Token$Reset) } ~
- path(API / "company" / "delete") { withMetric(M_COMPANY_DELETE_LATENCY_MS, company$Delete) } ~
- path(API / "user" / "get") { withMetric(M_USER_GET_LATENCY_MS, user$Get) } ~
- path(API / "user" / "add") { withMetric(M_USER_ADD_LATENCY_MS, user$Add) } ~
- path(API / "user" / "update") { withMetric(M_USER_UPDATE_LATENCY_MS, user$Update) } ~
- path(API / "user" / "delete") { withMetric(M_USER_DELETE_LATENCY_MS, user$Delete) } ~
- path(API / "user" / "admin") { withMetric(M_USER_ADMIN_LATENCY_MS, user$Admin) } ~
- path(API / "user" / "passwd" / "reset") { withMetric(M_USER_PASSWD_RESET_LATENCY_MS, user$Password$Reset) } ~
- path(API / "user" / "all") { withMetric(M_USER_ALL_LATENCY_MS, user$All) } ~
- path(API / "feedback"/ "add") { withMetric(M_FEEDBACK_ADD_LATENCY_MS, feedback$Add) } ~
- path(API / "feedback"/ "all") { withMetric(M_FEEDBACK_GET_LATENCY_MS, feedback$All) } ~
- path(API / "feedback" / "delete") { withMetric(M_FEEDBACK_DELETE_LATENCY_MS, feedback$Delete) } ~
- path(API / "probe" / "all") { withMetric(M_PROBE_ALL_LATENCY_MS, probe$All) } ~
- path(API / "model" / "sugsyn") { withMetric(M_MODEL_SUGSYN_LATENCY_MS, sugsyn$) } ~
- path(API / "model" / "syns") { withMetric(M_MODEL_SYNS_LATENCY_MS, elementSynonyms$) } ~
- path(API / "ask") { withMetric(M_ASK_LATENCY_MS, ask$) } ~
- path(API / "ask" / "sync") { withMetric(M_ASK_SYNC_LATENCY_MS, ask$Sync) }
+ path(API / "health") { $health() } // Duplicate for POST.
+ path(API / "signin") { withMetric(M_SIGNIN_LATENCY_MS, $signin) } ~
+ path(API / "signout") { withMetric(M_SIGNOUT_LATENCY_MS, $signout) } ~
+ path(API / "cancel") { withMetric(M_CANCEL_LATENCY_MS, $cancel) } ~
+ path(API / "check") { withMetric(M_CHECK_LATENCY_MS, $check) } ~
+ path(API / "clear"/ "conversation") { withMetric(M_CLEAR_CONV_LATENCY_MS, $clear$Conversation) } ~
+ path(API / "clear"/ "dialog") { withMetric(M_CLEAR_DIALOG_LATENCY_MS, $clear$Dialog) } ~
+ path(API / "company"/ "add") { withMetric(M_COMPANY_ADD_LATENCY_MS, $company$Add) } ~
+ path(API / "company"/ "get") { withMetric(M_COMPANY_GET_LATENCY_MS, $company$Get) } ~
+ path(API / "company" / "update") { withMetric(M_COMPANY_UPDATE_LATENCY_MS, $company$Update) } ~
+ path(API / "company" / "token" / "reset") { withMetric(M_COMPANY_TOKEN_LATENCY_MS, $company$Token$Reset) } ~
+ path(API / "company" / "delete") { withMetric(M_COMPANY_DELETE_LATENCY_MS, $company$Delete) } ~
+ path(API / "user" / "get") { withMetric(M_USER_GET_LATENCY_MS, $user$Get) } ~
+ path(API / "user" / "add") { withMetric(M_USER_ADD_LATENCY_MS, $user$Add) } ~
+ path(API / "user" / "update") { withMetric(M_USER_UPDATE_LATENCY_MS, $user$Update) } ~
+ path(API / "user" / "delete") { withMetric(M_USER_DELETE_LATENCY_MS, $user$Delete) } ~
+ path(API / "user" / "admin") { withMetric(M_USER_ADMIN_LATENCY_MS, $user$Admin) } ~
+ path(API / "user" / "passwd" / "reset") { withMetric(M_USER_PASSWD_RESET_LATENCY_MS, $user$Passwd$Reset) } ~
+ path(API / "user" / "all") { withMetric(M_USER_ALL_LATENCY_MS, $user$All) } ~
+ path(API / "feedback"/ "add") { withMetric(M_FEEDBACK_ADD_LATENCY_MS, $feedback$Add) } ~
+ path(API / "feedback"/ "all") { withMetric(M_FEEDBACK_GET_LATENCY_MS, $feedback$All) } ~
+ path(API / "feedback" / "delete") { withMetric(M_FEEDBACK_DELETE_LATENCY_MS, $feedback$Delete) } ~
+ path(API / "probe" / "all") { withMetric(M_PROBE_ALL_LATENCY_MS, $probe$All) } ~
+ path(API / "model" / "sugsyn") { withMetric(M_MODEL_SUGSYN_LATENCY_MS, $model$sugsyn) } ~
+ path(API / "model" / "syns") { withMetric(M_MODEL_SYNS_LATENCY_MS, $model$syns) } ~
+ path(API / "ask") { withMetric(M_ASK_LATENCY_MS, $ask) } ~
+ path(API / "ask" / "sync") { withMetric(M_ASK_SYNC_LATENCY_MS, $ask$Sync) }
}
}
}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
index 76af8a0..fae55d0 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
@@ -218,13 +218,13 @@
}).
toMap
- val elemSyns =
- mdlSyns.map { case (elemId, syns) => elemId -> syns.flatMap(parser.expand) }.
+ val elmSyns =
+ mdlSyns.map { case (elmId, syns) => elmId -> syns.flatMap(parser.expand) }.
map { case (id, seq) => id -> seq.map(txt => split(txt).map(p => Word(p, toStemWord(p)))) }
val allReqs =
- elemSyns.map {
- case (elemId, syns) =>
+ elmSyns.map {
+ case (elmId, syns) =>
// Current implementation supports suggestions only for single words synonyms.
val normSyns: Seq[Seq[Word]] = syns.filter(_.size == 1)
val synsStems = normSyns.map(_.map(_.stem))
@@ -248,7 +248,7 @@
}
}.mkString(" "),
ex = exWords.mkString(" "),
- elmId = elemId,
+ elmId = elmId,
index = idx
)
}
@@ -257,20 +257,20 @@
yield mkRequestData(idx, synStems, i)).distinct
}
- elemId -> reqs.toSet
+ elmId -> reqs.toSet
}.filter(_._2.nonEmpty)
- val noExElems =
+ val noExElms =
mdlSyns.
- filter { case (elemId, syns) => syns.nonEmpty && !allReqs.contains(elemId) }.
- map { case (elemId, _) => elemId }
+ filter { case (elmId, syns) => syns.nonEmpty && !allReqs.contains(elmId) }.
+ map { case (elmId, _) => elmId }
- if (noExElems.nonEmpty)
+ if (noExElms.nonEmpty)
warns += s"Elements do not have *single word* synonyms in their @NCIntentSample or @NCIntentSampleRef annotations - " +
- s"no suggestion can be made: ${noExElems.mkString(", ")}"
+ s"no suggestion can be made: ${noExElms.mkString(", ")}"
val allReqsCnt = allReqs.map(_._2.size).sum
- val allSynsCnt = elemSyns.map(_._2.size).sum
+ val allSynsCnt = elmSyns.map(_._2.size).sum
logger.trace(s"Request is going to execute on 'ctxword' server [" +
s"exs=${exs.size}, " +
@@ -289,7 +289,7 @@
val cli = HttpClients.createDefault
val err = new AtomicReference[Throwable]()
- for ((elemId, reqs) <- allReqs; batch <- reqs.sliding(BATCH_SIZE, BATCH_SIZE).map(_.toSeq)) {
+ for ((elmId, reqs) <- allReqs; batch <- reqs.sliding(BATCH_SIZE, BATCH_SIZE).map(_.toSeq)) {
U.asFuture(
_ => {
val post = new HttpPost(url)
@@ -322,7 +322,7 @@
logger.debug(s"Executed: $i requests...")
allSgsts.
- computeIfAbsent(elemId, (_: String) => new CopyOnWriteArrayList[Suggestion]()).
+ computeIfAbsent(elmId, (_: String) => new CopyOnWriteArrayList[Suggestion]()).
addAll(resps.flatten.asJava)
if (i == allReqsCnt)
@@ -342,13 +342,13 @@
if (err.get() != null)
throw new NCE("Error while working with 'ctxword' server.", err.get())
- val allSynsStems = elemSyns.flatMap(_._2).toSeq.flatten.map(_.stem).toSet
+ val allSynsStems = elmSyns.flatMap(_._2).toSeq.flatten.map(_.stem).toSet
val nonEmptySgsts = allSgsts.asScala.map(p => p._1 -> p._2.asScala).filter(_._2.nonEmpty)
val res = mutable.HashMap.empty[String, mutable.ArrayBuffer[SuggestionResult]]
- nonEmptySgsts.foreach { case (elemId, elemSgsts) =>
+ nonEmptySgsts.foreach { case (elmId, elemSgsts) =>
elemSgsts.
map(sgst => (sgst, toStem(sgst.word))).
groupBy { case (_, stem) => stem }.
@@ -366,12 +366,12 @@
zipWithIndex.
foreach { case ((word, _, sumFactor), _) =>
val seq =
- res.get(elemId) match {
+ res.get(elmId) match {
case Some(seq) => seq
case None =>
val buf = mutable.ArrayBuffer.empty[SuggestionResult]
- res += elemId -> buf
+ res += elmId -> buf
buf
}
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestModelSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestModelSpec.scala
index a00fc11..7543f3a 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestModelSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestModelSpec.scala
@@ -63,7 +63,7 @@
@Test
def testSyns(): Unit = {
// Note that checked values are valid for current configuration of `RestTestModel` model.
- post("model/syns", "mdlId" -> "rest.test.model", "elemId" -> "x")(
+ post("model/syns", "mdlId" -> "rest.test.model", "elmId" -> "x")(
("$.status", (status: String) => assertEquals("API_OK", status)),
("$.synonyms", (syns: ResponseList) => {
println("synonyms="+syns)
@@ -76,7 +76,7 @@
assertTrue(vals.isEmpty)
})
)
- post("model/syns", "mdlId" -> "rest.test.model", "elemId" -> "valElem")(
+ post("model/syns", "mdlId" -> "rest.test.model", "elmId" -> "valElem")(
("$.status", (status: String) => assertEquals("API_OK", status)),
("$.synonyms", (syns: ResponseList) => {
println("synonyms="+syns)
@@ -90,10 +90,10 @@
})
)
- postError("model/syns", 400, "NC_INVALID_FIELD", "mdlId" -> "UNKNOWN", "elemId" -> "UNKNOWN")
- postError("model/syns", 400, "NC_INVALID_FIELD", "mdlId" -> "rest.test.model", "elemId" -> "UNKNOWN")
- postError("model/syns", 400, "NC_INVALID_FIELD", "mdlId" -> ("A" * 33), "elemId" -> "UNKNOWN")
- postError("model/syns", 400, "NC_INVALID_FIELD", "mdlId" -> "rest.test.model", "elemId" -> ("A" * 65))
+ postError("model/syns", 400, "NC_INVALID_FIELD", "mdlId" -> "UNKNOWN", "elmId" -> "UNKNOWN")
+ postError("model/syns", 400, "NC_INVALID_FIELD", "mdlId" -> "rest.test.model", "elmId" -> "UNKNOWN")
+ postError("model/syns", 400, "NC_INVALID_FIELD", "mdlId" -> ("A" * 33), "elmId" -> "UNKNOWN")
+ postError("model/syns", 400, "NC_INVALID_FIELD", "mdlId" -> "rest.test.model", "elmId" -> ("A" * 65))
postError("model/syns", 400, "NC_ERROR", "mdlId" -> "rest.test.model")
}
}
diff --git a/openapi/nlpcraft_swagger.yml b/openapi/nlpcraft_swagger.yml
index 51bfee8..2a5723b 100644
--- a/openapi/nlpcraft_swagger.yml
+++ b/openapi/nlpcraft_swagger.yml
@@ -238,9 +238,9 @@
post:
tags:
- Tools
- summary: Gets model element synonyms.
+ summary: Gets model element synonyms and values.
description: >-
- Gets model element synonyms.
+ Gets model element synonyms and values.
Administrative privileges required.
operationId: syns
parameters:
@@ -253,7 +253,7 @@
required:
- acsTok
- mdlId
- - elemId
+ - elmId
properties:
acsTok:
type: string
@@ -262,11 +262,11 @@
mdlId:
type: string
maxLength: 32
- description: ID of the model to run synonym suggestion on.
- elemId:
+ description: ID of the model to run get elements synonyms and values.
+ elmId:
type: string
maxLength: 64
- description: ID of the model element to getting synonyms.
+ description: ID of the model element to get its synonyms and values.
responses:
'200':
description: Successful operation.
@@ -284,10 +284,14 @@
- API_OK
synonyms:
type: object
- description: Synonyms list.
+ description: List of individual synomyms.
values:
type: object
- description: Values map (value name to vaule synonyms list). Empty if element doesn't contain values.
+ description: >-
+ Map of element values, if any.
+ Map key is the value name.
+ Map value is a list of synonyms for that value.
+ Empty if element doesn't have values.
'400':
description: Failed operation.
schema:
@@ -298,8 +302,8 @@
- Asking
summary: Gets status and result of submitted requests.
description: >-
- Gets the status and result (OK or failure) of the previously submitted requests.
- Request statuses returned sorted by their registration time, starting from newest.
+ Gets the status and result (OK or failure) of the previously submitted requests.
+ Request statuses returned sorted by their registration time, starting from newest.
operationId: check
parameters:
- in: body