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

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


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

commit abcfa62b6323f4c506a454062c8a587305507af8
Author: Sergey Kamov <[email protected]>
AuthorDate: Mon Jul 26 14:49:07 2021 +0300

    WIP.
---
 .../apache/nlpcraft/examples/sql/SqlModel.scala    |  2 +-
 .../model/intent/solver/NCIntentSolver.scala       | 22 +++++++--
 .../model/intent/solver/NCIntentSolverEngine.scala | 29 +++++------
 .../probe/mgrs/sentence/NCSentenceManager.scala    | 56 +++++++++++++++++++++-
 .../models/stm/NCStmIndexesTestModelSpec.scala     |  9 ++--
 5 files changed, 89 insertions(+), 29 deletions(-)

diff --git 
a/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/SqlModel.scala
 
b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/SqlModel.scala
index 6e5753f..181ae8b 100644
--- 
a/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/SqlModel.scala
+++ 
b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/SqlModel.scala
@@ -421,7 +421,7 @@ class SqlModel extends NCModelFileAdapter("sql_model.yaml") 
with LazyLogging {
             def isColumn(t: NCToken): Boolean = 
findAnyColumnTokenOpt(t).isDefined
             def isDate(t: NCToken): Boolean = t.getId == "nlpcraft:date"
 
-            val ok = toks.forall(isValue) || toks.size == 1 && 
isDate(toks.head)
+            val ok = toks.forall(isValue) || toks.forall(isColumn) || 
toks.size == 1 && isDate(toks.head)
 
             if (!ok) {
                 m.getContext.getConversation.clearStm(_ => true)
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
index 1bae8f7..4031ca9 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
@@ -27,10 +27,10 @@ import org.apache.nlpcraft.model.impl.{NCMetadataAdapter, 
NCVariantImpl}
 import org.apache.nlpcraft.model.intent.NCIdlIntent
 import org.apache.nlpcraft.model.{NCContext, NCIntentMatch, NCIntentSkip, 
NCModel, NCRejection, NCResult, NCToken, NCVariant}
 import org.apache.nlpcraft.probe.mgrs.dialogflow.NCDialogFlowManager
+import org.apache.nlpcraft.probe.mgrs.sentence.NCSentenceManager
 
 import java.util.{List => JList}
-
-import scala.jdk.CollectionConverters.SeqHasAsJava
+import scala.jdk.CollectionConverters.{ListHasAsScala, SeqHasAsJava}
 
 /**
  * Front-end for intent solver.
@@ -95,10 +95,24 @@ class NCIntentSolver(intents: List[(NCIdlIntent/*Intent*/, 
NCIntentMatch => NCRe
         for (res <- results if res != null) {
             try {
                 i += 1
-                
+
+                val allConvToks = ctx.getConversation.getTokens.asScala
+                val nonConvToks = 
res.groups.flatMap(_.tokens).filterNot(allConvToks.contains)
+
+                val intentToks =
+                    res.groups.map(_.tokens).map(toks => {
+                        toks.filter(allConvToks.contains).foreach(convTok =>
+                            NCSentenceManager.fixMeta(convTok, nonConvToks, 
allConvToks)
+                        )
+
+                        toks
+                    })
+
+                ctx.getConversation.getTokens
+
                 val intentMatch: NCIntentMatch = new NCMetadataAdapter with 
NCIntentMatch {
                     override val getContext: NCContext = ctx
-                    override val getIntentTokens: JList[JList[NCToken]] = 
res.groups.map(_.tokens.asJava).asJava
+                    override val getIntentTokens: JList[JList[NCToken]] = 
intentToks.map(_.asJava).asJava
                     override val getVariant: NCVariant = new 
NCVariantImpl(res.variant.tokens)
                     override val isAmbiguous: Boolean = !res.isExactMatch
                     override val getIntentId: String = res.intentId
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
index 54d6922..c6510b5 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
@@ -357,12 +357,12 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
 
             sorted.map(m =>
                 NCIntentSolverResult(
-                    m.intentMatch.intent.id,
-                    m.callback,
-                    m.intentMatch.tokenGroups.map(grp => 
NCIntentTokensGroup(grp.term.id, grp.usedTokens.map(_.token))),
-                    m.intentMatch.exactMatch,
-                    m.variant,
-                    m.variantIdx
+                    intentId = m.intentMatch.intent.id,
+                    fn = m.callback,
+                    groups = m.intentMatch.tokenGroups.map(grp => 
NCIntentTokensGroup(grp.term.id, grp.usedTokens.map(_.token))),
+                    isExactMatch = m.intentMatch.exactMatch,
+                    variant = m.variant,
+                    variantIdx = m.variantIdx
                 )
             ).toList
         }
@@ -501,10 +501,10 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
                 )
 
                 solveTerm(
-                    term,
-                    termCtx,
-                    senToks,
-                    if (term.conv) convToks else Seq.empty
+                    term = term,
+                    ctx = termCtx,
+                    senToks = senToks,
+                    convToks = if (term.conv) convToks else Seq.empty
                 ) match {
                     case Some(termMatch) =>
                         if (ordered && lastTermMatch != null && 
lastTermMatch.maxIndex > termMatch.maxIndex)
@@ -702,16 +702,13 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
 
             // Sum of conversation depths for each token from the conversation.
             // Negated to make sure that bigger (smaller negative number) is 
better.
-            val convDepthsSum = -usedToks.filter(t => 
convSrvReqIds.contains(t.token.getServerRequestId)).zipWithIndex.map(_._2 + 
1).sum
+            val convDepthsSum =
+                -usedToks.filter(t => 
convSrvReqIds.contains(t.token.getServerRequestId)).zipWithIndex.map(_._2 + 
1).sum
             
             // Mark found tokens as used.
             usedToks.foreach(_.used = true)
 
-            Some(usedToks -> new Weight(
-                senTokNum,
-                convDepthsSum,
-                tokUses
-            ))
+            Some(usedToks -> new Weight(senTokNum, convDepthsSum, tokUses))
         }
     }
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/sentence/NCSentenceManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/sentence/NCSentenceManager.scala
index 74ead87..115d7f9 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/sentence/NCSentenceManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/sentence/NCSentenceManager.scala
@@ -22,7 +22,7 @@ import org.apache.nlpcraft.common.nlp.NCNlpSentence.NoteLink
 import org.apache.nlpcraft.common.nlp.pos.NCPennTreebank
 import org.apache.nlpcraft.common.nlp.{NCNlpSentence, NCNlpSentenceNote, 
NCNlpSentenceToken}
 import org.apache.nlpcraft.common.{NCE, NCService, U, _}
-import org.apache.nlpcraft.model.NCModel
+import org.apache.nlpcraft.model.{NCModel, NCToken}
 import org.apache.nlpcraft.probe.mgrs.NCTokenPartKey
 
 import java.io.{Serializable => JSerializable}
@@ -43,7 +43,6 @@ object NCSentenceManager extends NCService {
     type CacheValue = Seq[Seq[NCNlpSentenceNote]]
     private val combCache = mutable.HashMap.empty[String, 
mutable.HashMap[CacheKey, CacheValue]]
 
-
     /**
       *
       * @param notes
@@ -791,4 +790,57 @@ object NCSentenceManager extends NCService {
       * @param srvReqId
       */
     def clearCache(srvReqId: String): Unit = combCache -= srvReqId
+
+
+
+    /**
+      *
+      * @param convTok
+      * @param nonConvToks
+      * @param allConvToks
+      */
+    def fixMeta(convTok: NCToken, nonConvToks: Seq[NCToken], allConvToks: 
Seq[NCToken]): Unit =
+        convTok.getId match {
+            case "nlpcraft:sort" =>
+                def fix(notesName: String, idxsName: String): Unit = {
+                    val notes = 
convTok.meta[JList[String]](s"nlpcraft:sort:$notesName")
+                    val idxs = 
convTok.meta[JList[Int]](s"nlpcraft:sort:$idxsName")
+
+                    require(notes == null && idxs == null || notes.size() == 
idxs.size())
+
+                    if (notes != null && !notes.isEmpty) {
+                        val data: Seq[(String, Int)] =
+                            notes.asScala.zip(idxs.asScala).map { case (note, 
idx) =>
+                                nonConvToks.find(t => t.getId == note && 
t.getIndex == idx) match {
+                                    case Some(_) => (note, idx)
+                                    case None =>
+                                        val ref =
+                                            allConvToks.
+                                                find(t => t.getId == note && 
t.getIndex == idx).
+                                                getOrElse(
+                                                    throw new NCE(s"Reference 
is not found [note=$note, index=$idx]")
+                                                )
+
+                                        val newRef =
+                                            nonConvToks.
+                                                find(t =>
+                                                    
t.getGroups.asScala.toSet.intersect(ref.getGroups.asScala.toSet).nonEmpty
+                                                ).
+                                                getOrElse(
+                                                    throw new NCE(s"New 
reference is not found [note=$note, index=$idx]")
+                                                )
+
+                                        (newRef.getId, newRef.getIndex)
+                                }
+                            }
+
+                        convTok.getMetadata.put(s"nlpcraft:sort:$notesName", 
data.map(_._1).asJava)
+                        convTok.getMetadata.put(s"nlpcraft:sort:$idxsName", 
data.map(_._2).asJava)
+                    }
+                }
+
+                fix("bynotes", "byindexes")
+                fix("subjnotes", "subjindexes")
+            case _ => // TODO: implement all other.
+        }
 }
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmIndexesTestModelSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmIndexesTestModelSpec.scala
index be94a42..e28d4e5 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmIndexesTestModelSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmIndexesTestModelSpec.scala
@@ -75,14 +75,11 @@ class NCStmIndexesTestModel extends 
NCModelAdapter("nlpcraft.stm.idxs.test", "ST
         println(s"variant userDefinedTokens: 
${ctx.getVariant.getUserDefinedTokens.asScala.map(toStr).mkString("|")}")
         println(s"variant conversation: 
${ctx.getContext.getConversation.getTokens.asScala.map(toStr).mkString("|")}")
 
-        val bynotes = sort.meta[JList[String]]("nlpcraft:sort:bynotes")
-        val byindexes = sort.meta[JList[Int]]("nlpcraft:sort:byindexes")
-
         NCResult.json(
             mapper.writeValueAsString(
                 NCStmIndexesTestModelData(
-                    bynotes = bynotes.asScala.toSeq,
-                    byindexes = byindexes.asScala.toSeq
+                    bynotes = 
sort.meta[JList[String]]("nlpcraft:sort:bynotes").asScala.toSeq,
+                    byindexes = 
sort.meta[JList[Int]]("nlpcraft:sort:byindexes").asScala.toSeq
                 )
             )
         )
@@ -103,7 +100,7 @@ class NCStmIndexesTestModelSpec extends NCTestContext {
         checkResult(
             "b b",
             extract,
-            NCStmIndexesTestModelData(bynotes = Seq("A"), byindexes = Seq(3))
+            NCStmIndexesTestModelData(bynotes = Seq("B"), byindexes = Seq(0))
         )
     }
 }
\ No newline at end of file

Reply via email to