You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2022/08/25 10:28:42 UTC

[incubator-nlpcraft] 01/11: IDL fragments related fixes.

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

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

commit 9bac8d033d6555e0ad667890110c5d4ea574c30a
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Thu Aug 25 10:53:32 2022 +0300

    IDL fragments related fixes.
---
 .../nlpcraft/internal/impl/NCModelScanner.scala    |  6 +-
 .../internal/intent/compiler/NCIDLCompiler.scala   | 65 ++++++++++++----------
 2 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
index 58f6347d..b799136e 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala
@@ -417,9 +417,9 @@ object NCModelScanner extends LazyLogging:
         def callNoCache[T](f: () => T): T =
             val cp = compiler.clone()
             try f()
-            finally compiler = cp
+            finally compiler = cp.clone(compiler)
 
-        def callNoCacheOnError[T](f: () => T): T =
+        def callClear[T](f: () => T): T =
             val cp = compiler.clone()
             try f()
             catch case e: Throwable => { compiler = cp; throw e }
@@ -453,7 +453,7 @@ object NCModelScanner extends LazyLogging:
 
             // 1. First pass.
             for (ann <- anns)
-                try callNoCacheOnError(() => addIntents(ann))
+                try callClear(() => addIntents(ann))
                 catch case _: NCException => errAnns += ann
 
             // 2. Second pass.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompiler.scala
index fb82548e..36cbca7b 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompiler.scala
@@ -37,34 +37,41 @@ import scala.collection.mutable
 import scala.jdk.CollectionConverters.*
 
 class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collection.mutable.Cloneable[NCIDLCompiler]:
+    private val intents = mutable.HashMap.empty[String, Set[NCIDLIntent]]
+
     // Compiler caches.
-    private val cacheIntents = new mutable.HashMap[String, Set[NCIDLIntent]]
-    private val fragCache = TrieMap.empty[String /* Model ID. */ , mutable.Map[String, NCIDLFragment]]
+    private val fragCache = mutable.HashMap.empty[String, NCIDLFragment]
     private val importCache = mutable.HashSet.empty[String]
 
-    private def getFragment(mdlId: String, fragId: String): Option[NCIDLFragment] = fragCache.get(mdlId).flatMap(_.get(fragId))
-
-    private def addFragment(mdlId: String, frag: NCIDLFragment): Unit =
-        fragCache.getOrElse(mdlId, {
-            val m = mutable.HashMap.empty[String, NCIDLFragment]
+    /**
+      *
+      * @param fragId
+      * @return
+      */
+    private def getFragment(fragId: String): Option[NCIDLFragment] = fragCache.get(fragId)
 
-            fragCache += mdlId -> m
+    /**
+      *
+      * @param fragId
+      * @return
+      */
+    private def hasFragment(fragId: String): Boolean = fragCache.contains(fragId)
 
-            m
-        }) += (frag.id -> frag)
+    /**
+      *
+      * @param mdlId
+      * @param frag
+      */
+    private def addFragment(mdlId: String, frag: NCIDLFragment): Unit = fragCache += frag.id -> frag
 
-    private def addImport(imp: String): Unit = importCache.synchronized {
-        importCache += imp
-    }
+    private def addImport(imp: String): Unit = importCache += imp
 
     /**
       *
       * @param imp
       * @return
       */
-    private def hasImport(imp: String): Boolean = importCache.synchronized {
-        importCache.contains(imp)
-    }
+    private def hasImport(imp: String): Boolean = importCache.contains(imp)
 
     /**
       *
@@ -208,12 +215,12 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
 
         override def exitFragId(ctx: IDP.FragIdContext): Unit =
             fragId = ctx.id().getText
-            if getFragment(mdlCfg.getId, fragId).isDefined then SE(s"Duplicate fragment ID: $fragId")(ctx.id())
+            if hasFragment(fragId) then SE(s"Duplicate fragment ID: $fragId")(ctx.id())
 
         override def exitFragRef(ctx: IDP.FragRefContext): Unit =
             val id = ctx.id().getText
 
-            getFragment(mdlCfg.getId, id) match
+            getFragment(id) match
                 case Some(frag) =>
                     val meta = if fragMeta == null then Map.empty[String, Any] else fragMeta
                     for (fragTerm <- frag.terms)
@@ -471,9 +478,9 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
         require(cfg != null)
         require(srcName != null)
 
-        val x = idl.strip()
-        val intents: Set[NCIDLIntent] = cacheIntents.getOrElseUpdate(x, {
-            val (fsm, parser) = antlr4Armature(x, cfg, srcName)
+        val idlNorm = idl.strip()
+        intents.getOrElseUpdate(idlNorm, {
+            val (fsm, parser) = antlr4Armature(idlNorm, cfg, srcName)
 
             // Parse the input IDL and walk built AST.
             (new ParseTreeWalker).walk(fsm, parser.idl())
@@ -482,8 +489,6 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
             fsm.getCompiledIntents
         })
 
-        intents
-
     /**
       *
       * @param idl
@@ -515,11 +520,11 @@ class NCIDLCompiler(cfg: NCModelConfig) extends LazyLogging with scala.collectio
     @throws[NCException]
     def compile(idl: String, origin: String): Set[NCIDLIntent] = parseIntents(idl,  origin)
 
-    override def clone(): NCIDLCompiler =
-        val copy = new NCIDLCompiler(cfg)
-        this.cacheIntents ++= cacheIntents.clone()
-        this.importCache ++= importCache.clone()
-        this.fragCache ++= fragCache.clone()
-        copy
-
+    def clone(cp: NCIDLCompiler): NCIDLCompiler =
+        val cp = new NCIDLCompiler(cfg)
+        cp.intents ++= cp.intents.clone()
+        cp.importCache ++= importCache.clone()
+        cp.fragCache ++= fragCache.clone()
+        cp
 
+    override def clone(): NCIDLCompiler = clone(this)