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

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


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

commit 26460050b064308e512c51aee4b0d5c2045360fb
Author: Aaron Radzinski <[email protected]>
AuthorDate: Sun Feb 7 20:39:44 2021 -0800

    WIP.
---
 .../apache/nlpcraft/common/debug/NCLogHolder.scala |   2 +-
 .../common/extcfg/NCExternalConfigManager.scala    |   2 +-
 .../apache/nlpcraft/common/socket/NCSocket.scala   |   2 +-
 .../apache/nlpcraft/common/util/NCIdGenerator.java |   2 +-
 .../org/apache/nlpcraft/common/util/NCUtils.scala  |  14 +-
 .../nlpcraft/examples/sql/db/SqlValueLoader.scala  |   2 +-
 .../scala/org/apache/nlpcraft/model/NCResult.java  |   2 +-
 .../model/intent/impl/NCIntentDslCompiler.scala    | 212 ++++++++++-----------
 .../model/intent/impl/antlr4/NCIntentDsl.g4        |   3 +-
 .../intent/impl/ver2/NCIntentDslCompiler.scala     |  71 ++++++-
 .../model/intent/utils/NCDslTokenPredicate.java    |   8 +-
 .../model/intent/utils/ver2/NCDslIntent.scala      |   7 +-
 .../nlpcraft/model/tools/cmdline/NCCli.scala       |  10 +-
 .../mgrs/model/NCModelSynonymDslCompiler.scala     |  86 ++++-----
 .../mgrs/nlp/enrichers/sort/NCSortEnricher.scala   |   2 +-
 .../geo/tools/metro/NCGeoMetroGenerator.scala      |   2 +-
 .../geo/tools/unstats/NCUnsdStatsService.scala     |   2 +-
 .../server/nlp/enrichers/date/NCDateEnricher.scala |   2 +-
 .../enrichers/stopword/NCStopWordEnricher.scala    |   6 +-
 .../nlpcraft/server/rest/NCBasicRestApi.scala      |   4 +-
 .../apache/nlpcraft/server/sql/NCSqlManager.scala  |   4 +-
 .../nlpcraft/examples/sql/NCSqlExampleSpec.scala   |   2 +-
 .../model/intent/dsl/NCDslCompilerSpec.scala}      |  29 +--
 23 files changed, 267 insertions(+), 209 deletions(-)

diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/debug/NCLogHolder.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/debug/NCLogHolder.scala
index ea2e692..f346759 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/debug/NCLogHolder.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/debug/NCLogHolder.scala
@@ -186,7 +186,7 @@ class NCLogHolder extends Serializable {
                 val str = req.getData.get
 
                 try
-                    NCUtils.js2Obj(str)
+                    NCUtils.jsonToObject(str)
                 catch {
                     case _: Exception ⇒ str
                 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/extcfg/NCExternalConfigManager.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/extcfg/NCExternalConfigManager.scala
index 1923cbd..c041f7c 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/extcfg/NCExternalConfigManager.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/extcfg/NCExternalConfigManager.scala
@@ -120,7 +120,7 @@ object NCExternalConfigManager extends NCService {
                 managed(Source.fromURL(url)) acquireAndGet { src ⇒
                     src.getLines().map(_.trim()).filter(s ⇒ s.nonEmpty && 
!s.startsWith("#")).map(f = p ⇒ {
                         def splitPair(s: String, sep: String): (String, 
String) = {
-                            val seq = s.split(sep).map(_.trim)
+                            val seq = s.split(sep).map(_.strip)
 
                             if (seq.length != 2 || seq.exists(_.isEmpty))
                                 throw new NCE(s"Unexpected '$url' file line 
format: '$p'")
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/socket/NCSocket.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/socket/NCSocket.scala
index 7b76f4f..0d0c16f 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/socket/NCSocket.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/socket/NCSocket.scala
@@ -73,7 +73,7 @@ case class NCSocket(socket: Socket, soTimeout: Int = 20000) 
extends LazyLogging
 
                 val len =
                     try
-                        Integer.parseInt(line.trim)
+                        Integer.parseInt(line.strip)
                     catch {
                         case e: NumberFormatException ⇒ throw new 
NCE(s"Unexpected content length: $line", e)
                     }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCIdGenerator.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCIdGenerator.java
index a11ecf1..dd1abc6 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCIdGenerator.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCIdGenerator.java
@@ -52,7 +52,7 @@ public class NCIdGenerator {
      * @param alphabet Alphabet.
      */
     NCIdGenerator(String salt, int minHashLen, String alphabet) {
-        if (alphabet == null || alphabet.trim().isEmpty())
+        if (alphabet == null || alphabet.strip().isEmpty())
             throw new IllegalArgumentException("Alphabet must not be empty.");
 
         if (salt != null)
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
index 06d99d4..86f2e13 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/util/NCUtils.scala
@@ -163,7 +163,7 @@ object NCUtils extends LazyLogging {
      * @return
      */
     def trimFilter(s: Seq[String]): Seq[String] =
-        s.map(_.trim).filter(_.nonEmpty)
+        s.map(_.strip).filter(_.nonEmpty)
 
     /**
      * Splits, trims and filters empty strings for the given string.
@@ -183,7 +183,7 @@ object NCUtils extends LazyLogging {
      */
     @tailrec
     def trimQuotes(s: String): String = {
-        val z = s.trim
+        val z = s.strip
 
         if ((z.startsWith("'") && z.endsWith("'")) || (z.startsWith("\"") && 
z.endsWith("\"")))
             trimQuotes(z.substring(1, z.length - 1))
@@ -474,7 +474,7 @@ object NCUtils extends LazyLogging {
      * @return
      */
     private def readLcTrimFilter(in: BufferedSource): List[String] =
-        in.getLines().map(_.toLowerCase.trim).filter(s ⇒ s.nonEmpty && 
!s.startsWith("#")).toList
+        in.getLines().map(_.toLowerCase.strip).filter(s ⇒ s.nonEmpty && 
!s.startsWith("#")).toList
 
     /**
       * Reads lines from given file converting to lower case, trimming, and 
filtering
@@ -518,7 +518,7 @@ object NCUtils extends LazyLogging {
       * @param name Full name.
       */
     def toFirstLastName(name: String): (String, String) = {
-        val parts = name.trim.split(' ')
+        val parts = name.strip.split(' ')
 
         val firstName = formatName(parts.head)
         val lastName = formatName(parts.tail.mkString(" "))
@@ -532,7 +532,7 @@ object NCUtils extends LazyLogging {
       * @param name First or last name.
       */
     def formatName(name: String): String = {
-        name.trim.toLowerCase.capitalize
+        name.strip.toLowerCase.capitalize
     }
 
     /**
@@ -1009,7 +1009,7 @@ object NCUtils extends LazyLogging {
       *
       * @param email Email to normalize.
       */
-    def normalizeEmail(email: String): String = email.trim.toLowerCase
+    def normalizeEmail(email: String): String = email.strip.toLowerCase
 
     /**
       * Makes size restricted synchronized map.
@@ -1847,7 +1847,7 @@ object NCUtils extends LazyLogging {
       * @param js JSON string.
       */
     @throws[NCE]
-    def js2Obj(js: String): AnyRef =
+    def jsonToObject(js: String): AnyRef =
         try
             GSON.fromJson(js, classOf[Object])
         catch {
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlValueLoader.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlValueLoader.scala
index 353107a..6c6b0a3 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlValueLoader.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlValueLoader.scala
@@ -40,7 +40,7 @@ class SqlValueLoader extends NCValueLoader with LazyLogging {
         SqlAccess.select(SqlQuery(s"SELECT $col FROM $tab WHERE $col IS NOT 
NULL", Seq.empty), logResult = false).
             rows.
             map(_.head).
-            map(_.trim).
+            map(_.strip).
             filter(_.nonEmpty).
             map(
                 v ⇒ new NCValue {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCResult.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCResult.java
index db0cb9e..ae84ea5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCResult.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCResult.java
@@ -121,7 +121,7 @@ public class NCResult implements Serializable {
     public static NCResult json(String json) {
         // Validation.
         try {
-            NCUtils.js2Obj(json);
+            NCUtils.jsonToObject(json);
         }
         catch (NCException e) {
             throw new IllegalArgumentException(String.format("Invalid JSON 
value: %s.", json), e.getCause());
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
index b76b9dd..143ed38 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
@@ -48,11 +48,9 @@ object NCIntentDslCompiler extends LazyLogging {
         private val terms = ArrayBuffer.empty[NCDslTerm] // Accumulator for 
parsed terms.
         private var flowRegex: Option[String] = None
 
-        // Currently parsed term.
+        // Currently term.
         private var termId: String = _
         private var termConv: Boolean = _
-        
-        // Current min/max quantifier.
         private var min = 1
         private var max = 1
     
@@ -93,9 +91,9 @@ object NCIntentDslCompiler extends LazyLogging {
                 assert(false)
         }
     
-        override def exitLvalPart(ctx: NCIntentDslParser.LvalPartContext): 
Unit = {
-            lvalParts += ctx.ID().getText.trim()
-        }
+//        override def exitLvalPart(ctx: NCIntentDslParser.LvalPartContext): 
Unit = {
+//            lvalParts += ctx.ID().getText.trim()
+//        }
     
         override def exitTermId(ctx: NCIntentDslParser.TermIdContext): Unit = {
             termId = ctx.ID().getText.trim
@@ -121,7 +119,7 @@ object NCIntentDslCompiler extends LazyLogging {
             val qRegex = ctx.qstring().getText.trim
 
             if (qRegex != null && qRegex.length > 2) {
-                val regex = qRegex.substring(1, qRegex.length - 1).trim // 
Remove single quotes.
+                val regex = qRegex.substring(1, qRegex.length - 1).strip // 
Remove single quotes.
 
                 flowRegex = if (regex.nonEmpty) Some(regex) else None
             }
@@ -132,7 +130,7 @@ object NCIntentDslCompiler extends LazyLogging {
         }
     
         override def exitOrderedDecl(ctx: 
NCIntentDslParser.OrderedDeclContext): Unit = {
-            ordered = ctx.BOOL().getText.trim == "true"
+            ordered = ctx.BOOL().getText.strip == "true"
         }
     
         override def exitTerm(ctx: NCIntentDslParser.TermContext): Unit = {
@@ -144,7 +142,7 @@ object NCIntentDslCompiler extends LazyLogging {
                 termId,
                 new java.util.function.Function[NCToken, java.lang.Boolean]() {
                     override def apply(tok: NCToken): java.lang.Boolean = 
p.apply(tok)
-                    override def toString: String = p.toString().trim 
//ctx.item().getText
+                    override def toString: String = p.toString().strip 
//ctx.item().getText
                 },
                 min,
                 max,
@@ -155,70 +153,70 @@ object NCIntentDslCompiler extends LazyLogging {
             setMinMax(1, 1)
         }
     
-        override def exitRvalSingle(ctx: NCIntentDslParser.RvalSingleContext): 
Unit = {
-            rval = ctx.getText.trim()
-        }
-    
-        override def exitRvalList(ctx: NCIntentDslParser.RvalListContext): 
Unit = {
-            rvalList += rval
-        }
-    
-        override def exitItem(ctx: NCIntentDslParser.ItemContext): Unit = {
-            if (ctx.EXCL() != null) {
-                val p = predStack.pop
-    
-                predStack.push(new Function[NCToken, Boolean] {
-                    override def apply(tok: NCToken): Boolean = !p.apply(tok)
-                    override def toString: String = s"!$p"
-                })
-            }
-            else if (ctx.AND() != null) {
-                // Note that stack is LIFO so order is flipped.
-                val p2 = predStack.pop
-                val p1 = predStack.pop
-        
-                predStack.push(new Function[NCToken, Boolean] {
-                    override def apply(tok: NCToken): Boolean = {
-                        // To bypass any possible compiler optimizations.
-                        if (!p1.apply(tok))
-                            false
-                        else if (!p2.apply(tok))
-                            false
-                        else
-                            true
-                    }
-                    override def toString: String = s"$p1 && $p2"
-                })
-            }
-            else if (ctx.OR() != null) {
-                // Note that stack is LIFO so order is flipped.
-                val p2 = predStack.pop
-                val p1 = predStack.pop
-    
-                predStack.push(new Function[NCToken, Boolean] {
-                    override def apply(tok: NCToken): Boolean = {
-                        // To bypass any possible compiler optimizations.
-                        if (p1.apply(tok))
-                            true
-                        else if (p2.apply(tok))
-                            true
-                        else
-                            false
-                    }
-                    override def toString: String = s"$p1 || $p2"
-                })
-            }
-            else if (ctx.RPAREN() != null && ctx.LPAREN() != null) {
-                val p = predStack.pop
+//        override def exitRvalSingle(ctx: 
NCIntentDslParser.RvalSingleContext): Unit = {
+//            rval = ctx.getText.trim()
+//        }
     
-                predStack.push(new Function[NCToken, Boolean] {
-                    override def apply(tok: NCToken): Boolean = p.apply(tok)
-                    override def toString: String = s"($p)"
-                })
-            }
+//        override def exitRvalList(ctx: NCIntentDslParser.RvalListContext): 
Unit = {
+//            rvalList += rval
+//        }
     
-            // In all other cases the current predicate is already on the top 
of the stack.
-        }
+//        override def exitItem(ctx: NCIntentDslParser.ItemContext): Unit = {
+//            if (ctx.EXCL() != null) {
+//                val p = predStack.pop
+//
+//                predStack.push(new Function[NCToken, Boolean] {
+//                    override def apply(tok: NCToken): Boolean = !p.apply(tok)
+//                    override def toString: String = s"!$p"
+//                })
+//            }
+//            else if (ctx.AND() != null) {
+//                // Note that stack is LIFO so order is flipped.
+//                val p2 = predStack.pop
+//                val p1 = predStack.pop
+//
+//                predStack.push(new Function[NCToken, Boolean] {
+//                    override def apply(tok: NCToken): Boolean = {
+//                        // To bypass any possible compiler optimizations.
+//                        if (!p1.apply(tok))
+//                            false
+//                        else if (!p2.apply(tok))
+//                            false
+//                        else
+//                            true
+//                    }
+//                    override def toString: String = s"$p1 && $p2"
+//                })
+//            }
+//            else if (ctx.OR() != null) {
+//                // Note that stack is LIFO so order is flipped.
+//                val p2 = predStack.pop
+//                val p1 = predStack.pop
+//
+//                predStack.push(new Function[NCToken, Boolean] {
+//                    override def apply(tok: NCToken): Boolean = {
+//                        // To bypass any possible compiler optimizations.
+//                        if (p1.apply(tok))
+//                            true
+//                        else if (p2.apply(tok))
+//                            true
+//                        else
+//                            false
+//                    }
+//                    override def toString: String = s"$p1 || $p2"
+//                })
+//            }
+//            else if (ctx.RPAREN() != null && ctx.LPAREN() != null) {
+//                val p = predStack.pop
+//
+//                predStack.push(new Function[NCToken, Boolean] {
+//                    override def apply(tok: NCToken): Boolean = p.apply(tok)
+//                    override def toString: String = s"($p)"
+//                })
+//            }
+//
+//            // In all other cases the current predicate is already on the 
top of the stack.
+//        }
     
         /**
          *
@@ -252,42 +250,42 @@ object NCIntentDslCompiler extends LazyLogging {
             }
         }
     
-        override def exitPredicate(ctx: NCIntentDslParser.PredicateContext): 
Unit = {
-            var lval: String = null
-            var lvalFunc: String = null
-            var op: String = null
-        
-            def getLvalNode(tree: ParseTree): String =
-                tree.getChild(if (tree.getChildCount == 1) 0 else 
1).getText.trim
-        
-            if (ctx.children.size() == 3) {
-                lval = getLvalNode(ctx.getChild(0))
-                op = ctx.getChild(1).getText.trim
-            }
-            else {
-                lvalFunc = ctx.getChild(0).getText.trim
-                lval = getLvalNode(ctx.getChild(2))
-                op = ctx.getChild(4).getText.trim
-            }
-        
-            val pred = new NCDslTokenPredicate(
-                lvalParts.asJava,
-                lvalFunc,
-                lval,
-                op,
-                if (rvalList.isEmpty) mkRvalObject(rval) else 
rvalList.map(mkRvalObject).asJava
-            )
-        
-            predStack.push(new Function[NCToken, Boolean] {
-                override def apply(tok: NCToken): Boolean = pred.apply(tok)
-                override def toString: String = pred.toString
-            })
-        
-            // Reset.
-            lvalParts.clear()
-            rvalList.clear()
-            rval = null
-        }
+//        override def exitPredicate(ctx: NCIntentDslParser.PredicateContext): 
Unit = {
+//            var lval: String = null
+//            var lvalFunc: String = null
+//            var op: String = null
+//
+//            def getLvalNode(tree: ParseTree): String =
+//                tree.getChild(if (tree.getChildCount == 1) 0 else 
1).getText.trim
+//
+//            if (ctx.children.size() == 3) {
+//                lval = getLvalNode(ctx.getChild(0))
+//                op = ctx.getChild(1).getText.trim
+//            }
+//            else {
+//                lvalFunc = ctx.getChild(0).getText.trim
+//                lval = getLvalNode(ctx.getChild(2))
+//                op = ctx.getChild(4).getText.trim
+//            }
+//
+//            val pred = new NCDslTokenPredicate(
+//                lvalParts.asJava,
+//                lvalFunc,
+//                lval,
+//                op,
+//                if (rvalList.isEmpty) mkRvalObject(rval) else 
rvalList.map(mkRvalObject).asJava
+//            )
+//
+//            predStack.push(new Function[NCToken, Boolean] {
+//                override def apply(tok: NCToken): Boolean = pred.apply(tok)
+//                override def toString: String = pred.toString
+//            })
+//
+//            // Reset.
+//            lvalParts.clear()
+//            rvalList.clear()
+//            rval = null
+//        }
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
index 8f8a531..a204ab2 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
@@ -63,8 +63,9 @@ expr
     | expr COMMA val
     | LPAREN expr RPAREN
     | expr (MINUS | PLUS | STAR | FSLASH) expr
-    | ID LPAREN expr? RPAREN // Buit-in function call.
+    | funCall
     ;
+funCall: ID LPAREN expr? RPAREN; // Buit-in function call.
 val
     : NULL
     | MINUS? INT REAL? EXP?
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCIntentDslCompiler.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCIntentDslCompiler.scala
index c3c8b10..86b3975 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCIntentDslCompiler.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCIntentDslCompiler.scala
@@ -44,6 +44,63 @@ object NCIntentDslCompiler extends LazyLogging {
         private val terms = ArrayBuffer.empty[NCDslTerm] // Accumulator for 
parsed terms.
         private var flowRegex: Option[String] = None
 
+        // Currently term.
+        private var termId: String = _
+        private var termConv: Boolean = _
+        private var min = 1
+        private var max = 1
+
+        /**
+         *
+         * @param min
+         * @param max
+         */
+        private def setMinMax(min: Int, max: Int): Unit = {
+            this.min = min
+            this.max = max
+        }
+
+        override def exitMinMaxShortcut(ctx: 
NCIntentDslParser.MinMaxShortcutContext): Unit = {
+            if (ctx.PLUS() != null)
+                setMinMax(1, Integer.MAX_VALUE)
+            else if (ctx.STAR() != null)
+                setMinMax(0, Integer.MAX_VALUE)
+            else if (ctx.QUESTION() != null)
+                setMinMax(0, 1)
+            else
+                assert(false)
+        }
+
+        override def exitTermId(ctx: NCIntentDslParser.TermIdContext): Unit = {
+            termId = ctx.ID().getText.trim
+        }
+
+        override def exitTermEq(ctx: NCIntentDslParser.TermEqContext): Unit = {
+            termConv = ctx.TILDA() != null
+        }
+
+        override def exitFlowDecl(ctx: NCIntentDslParser.FlowDeclContext): 
Unit = {
+            val qRegex = ctx.qstring().getText.trim
+
+            if (qRegex != null && qRegex.length > 2) {
+                val regex = qRegex.substring(1, qRegex.length - 1).strip // 
Remove single quotes.
+
+                flowRegex = if (regex.nonEmpty) Some(regex) else None
+            }
+        }
+
+        override def exitIntentId(ctx: NCIntentDslParser.IntentIdContext): 
Unit = {
+            id = ctx.ID().getText.trim
+        }
+
+        override def exitMetaDecl(ctx: NCIntentDslParser.MetaDeclContext): 
Unit = {
+            meta = U.jsonToObject(ctx.jsonObj().getText, classOf[Map[String, 
Any]])
+        }
+
+        override def exitOrderedDecl(ctx: 
NCIntentDslParser.OrderedDeclContext): Unit = {
+            ordered = ctx.BOOL().getText.strip == "true"
+        }
+
         /**
          *
          * @return
@@ -52,7 +109,7 @@ object NCIntentDslCompiler extends LazyLogging {
             require(id != null)
             require(terms.nonEmpty)
 
-            NCDslIntent(dsl, id, ordered, meta, flowRegex, terms.toArray)
+            NCDslIntent(dsl, id, ordered, if (meta == null) Map.empty else 
meta, flowRegex, terms.toArray)
         }
     }
 
@@ -107,22 +164,24 @@ object NCIntentDslCompiler extends LazyLogging {
     def compile(dsl: String, mdlId: String): NCDslIntent = {
         require(dsl != null)
 
+        val src = dsl.strip()
+
         this.mdlId = mdlId
 
-        val intent: NCDslIntent = cache.getOrElseUpdate(dsl, {
+        val intent: NCDslIntent = cache.getOrElseUpdate(src, {
             // ANTLR4 armature.
-            val lexer = new NCIntentDslLexer(CharStreams.fromString(dsl))
+            val lexer = new NCIntentDslLexer(CharStreams.fromString(src))
             val tokens = new CommonTokenStream(lexer)
             val parser = new NCIntentDslParser(tokens)
 
             // Set custom error handlers.
             lexer.removeErrorListeners()
             parser.removeErrorListeners()
-            lexer.addErrorListener(new CompilerErrorListener(dsl))
-            parser.addErrorListener(new CompilerErrorListener(dsl))
+            lexer.addErrorListener(new CompilerErrorListener(src))
+            parser.addErrorListener(new CompilerErrorListener(src))
 
             // State automata.
-            val fsm = new FiniteStateMachine(dsl)
+            val fsm = new FiniteStateMachine(src)
 
             // Parse the input DSL and walk built AST.
             (new ParseTreeWalker).walk(fsm, parser.intent())
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
index 6e8dee8..41e66ae 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
@@ -242,7 +242,7 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
         switch (paramFunc) {
             case "trim":
                 if (lval instanceof String)
-                    return ((String) lval).trim();
+                    return ((String) lval).strip();
 
                 break;
 
@@ -413,14 +413,14 @@ public class NCDslTokenPredicate implements 
Function<NCToken, Boolean> {
         }
         else
             switch (param) {
-                case "id": lval = tok.getId().trim(); break;
+                case "id": lval = tok.getId().strip(); break;
                 case "groups": lval = tok.getGroups(); break;
                 case "aliases": lval = tok.getAliases(); break;
                 case "startidx": lval = tok.getStartCharIndex(); break;
                 case "endidx": lval = tok.getEndCharIndex(); break;
                 case "ancestors": lval = tok.getAncestors(); break;
-                case "value": lval = tok.getValue() == null ? null : 
tok.getValue().trim(); break;
-                case "parent": lval = tok.getParentId() == null ? null : 
tok.getParentId().trim(); break;
+                case "value": lval = tok.getValue() == null ? null : 
tok.getValue().strip(); break;
+                case "parent": lval = tok.getParentId() == null ? null : 
tok.getParentId().strip(); break;
 
                 default: throw new IllegalArgumentException(String.format(
                     "Invalid token predicate DSL parameter ('%s'): %s %s %s",
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslIntent.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslIntent.scala
index c93a3e4..f76de0d 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslIntent.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslIntent.scala
@@ -28,8 +28,7 @@ case class NCDslIntent(
     flow: Option[String],
     terms: Array[NCDslTerm]
 ) {
-    if (id == null)
-        throw new IllegalArgumentException("Intent ID must be provided.")
-    if (terms.length == 0)
-        throw new IllegalArgumentException("Intent should have at least one 
term.")
+    require(id != null)
+    require(terms.nonEmpty)
+    require(meta != null)
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
index 61a7412..81b981f 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
@@ -1525,7 +1525,7 @@ object NCCli extends App {
 
         val logPath = if (beacon.logPath != null) g(beacon.logPath) else 
y("<not available>")
         val jarsFolder = if (beacon.jarsFolder != null) g(beacon.jarsFolder) 
else y("<not set>")
-        val mdlSeq = beacon.models.split(",").map(s ⇒ s"${g(s.trim)}").toSeq
+        val mdlSeq = beacon.models.split(",").map(s ⇒ s"${g(s.strip)}").toSeq
 
         tbl += ("PID", s"${g(beacon.pid)}")
         tbl += ("Probe ID", s"${g(beacon.id)}")
@@ -2904,7 +2904,7 @@ object NCCli extends App {
         if (buf.nonEmpty)
             lines += buf.toString()
 
-        lines.map(_.trim)
+        lines.map(_.strip)
     }
 
     /**
@@ -2922,8 +2922,8 @@ object NCCli extends App {
             if (parts.size > 2)
                 throw mkError()
 
-            val name = if (parts.size == 1) arg.trim else parts(0).trim
-            val value = if (parts.size == 1) None else 
Some(U.trimQuotes(parts(1).trim))
+            val name = if (parts.size == 1) arg.strip else parts(0).trim
+            val value = if (parts.size == 1) None else 
Some(U.trimQuotes(parts(1).strip))
             val hasSynth = cmd.params.exists(_.synthetic)
 
             if (name.endsWith("=")) // Missing value or extra '='.
@@ -2993,7 +2993,7 @@ object NCCli extends App {
         if (args.nonEmpty) {
             try
                 if (args.head.head == '$') {
-                    val head = args.head.tail.trim // Remove '$' from 1st 
argument.
+                    val head = args.head.tail.strip // Remove '$' from 1st 
argument.
                     val tail = args.tail.toList
 
                     execOsCmd(if (head.isEmpty) tail else head :: tail)
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
index 9926d92..2b2b714 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
@@ -73,13 +73,13 @@ object NCModelSynonymDslCompiler extends LazyLogging {
             NCModelSynonymDsl(alias, toJavaFunc(alias, predStack.pop()))
         }
     
-        override def exitRvalSingle(ctx: 
NCSynonymDslParser.RvalSingleContext): Unit = {
-            rval = ctx.getText.trim()
-        }
-    
-        override def exitRvalList(ctx: NCSynonymDslParser.RvalListContext): 
Unit = {
-            rvalList += rval
-        }
+//        override def exitRvalSingle(ctx: 
NCSynonymDslParser.RvalSingleContext): Unit = {
+//            rval = ctx.getText.trim()
+//        }
+//
+//        override def exitRvalList(ctx: NCSynonymDslParser.RvalListContext): 
Unit = {
+//            rvalList += rval
+//        }
     
         override def exitTokQualPart(ctx: 
NCSynonymDslParser.TokQualPartContext): Unit = {
             tokQualParts += ctx.ID().getText.trim()
@@ -178,42 +178,42 @@ object NCModelSynonymDslCompiler extends LazyLogging {
             }
         }
     
-        override def exitPredicate(ctx: NCSynonymDslParser.PredicateContext): 
Unit = {
-            var lval: String = null
-            var lvalFunc: String = null
-            var op: String = null
-    
-            def getLvalNode(tree: ParseTree): String =
-                tree.getChild(if (tree.getChildCount == 1) 0 else 
1).getText.trim
-    
-            if (ctx.children.size() == 3) {
-                lval = getLvalNode(ctx.getChild(0))
-                op = ctx.getChild(1).getText.trim
-            }
-            else {
-                lvalFunc = ctx.getChild(0).getText.trim
-                lval = getLvalNode(ctx.getChild(2))
-                op = ctx.getChild(4).getText.trim
-            }
-            
-            val pred = new NCDslTokenPredicate(
-                tokQualParts.asJava,
-                lvalFunc,
-                lval,
-                op,
-                if (rvalList.isEmpty) mkRvalObject(rval) else 
rvalList.map(mkRvalObject).asJava
-            )
-    
-            predStack.push(new Function[NCToken, Boolean] {
-                override def apply(tok: NCToken): Boolean = pred.apply(tok)
-                override def toString: String = pred.toString
-            })
-    
-            // Reset.
-            tokQualParts.clear()
-            rvalList.clear()
-            rval = null
-        }
+//        override def exitPredicate(ctx: 
NCSynonymDslParser.PredicateContext): Unit = {
+//            var lval: String = null
+//            var lvalFunc: String = null
+//            var op: String = null
+//
+//            def getLvalNode(tree: ParseTree): String =
+//                tree.getChild(if (tree.getChildCount == 1) 0 else 
1).getText.trim
+//
+//            if (ctx.children.size() == 3) {
+//                lval = getLvalNode(ctx.getChild(0))
+//                op = ctx.getChild(1).getText.trim
+//            }
+//            else {
+//                lvalFunc = ctx.getChild(0).getText.trim
+//                lval = getLvalNode(ctx.getChild(2))
+//                op = ctx.getChild(4).getText.trim
+//            }
+//
+//            val pred = new NCDslTokenPredicate(
+//                tokQualParts.asJava,
+//                lvalFunc,
+//                lval,
+//                op,
+//                if (rvalList.isEmpty) mkRvalObject(rval) else 
rvalList.map(mkRvalObject).asJava
+//            )
+//
+//            predStack.push(new Function[NCToken, Boolean] {
+//                override def apply(tok: NCToken): Boolean = pred.apply(tok)
+//                override def toString: String = pred.toString
+//            })
+//
+//            // Reset.
+//            tokQualParts.clear()
+//            rvalList.clear()
+//            rval = null
+//        }
     }
     
     /**
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
index d177c10..80dd614 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/enrichers/sort/NCSortEnricher.scala
@@ -535,7 +535,7 @@ object NCSortEnricher extends NCProbeEnricher {
         }
 
         stemAnd = NCNlpCoreManager.stem("and")
-        maskWords = (sort ++ by ++ order.map(_._1)).flatMap(_.split(" 
")).map(_.trim).filter(_.nonEmpty).distinct
+        maskWords = (sort ++ by ++ order.map(_._1)).flatMap(_.split(" 
")).map(_.strip).filter(_.nonEmpty).distinct
 
         validate()
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/metro/NCGeoMetroGenerator.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/metro/NCGeoMetroGenerator.scala
index 8093576..28565ac 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/metro/NCGeoMetroGenerator.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/metro/NCGeoMetroGenerator.scala
@@ -43,7 +43,7 @@ object NCGeoMetroGenerator extends App {
         U.normalize(s.replaceAll("\\(", " ").replaceAll("\\)", " "), " ")
 
     private def generate() {
-        val lines = U.readPath(in, "UTF-8").map(_.trim).filter(_.nonEmpty)
+        val lines = U.readPath(in, "UTF-8").map(_.strip).filter(_.nonEmpty)
 
        // Skips header.
         val metro = lines.tail.filter(!_.contains("(not set)")).map(line ⇒ 
Holder(line.takeWhile(_ != ',')))
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/unstats/NCUnsdStatsService.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/unstats/NCUnsdStatsService.scala
index f521a12..ac4ba82 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/unstats/NCUnsdStatsService.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/geo/tools/unstats/NCUnsdStatsService.scala
@@ -72,7 +72,7 @@ object NCUnsdStatsService {
     private val codesPath = s"$dir/codes.txt"
 
     private def read(path: String): Seq[String] =
-        U.readPath(path, "UTF-8").map(_.trim).filter(_.nonEmpty).filter(_.head 
!= '#')
+        U.readPath(path, 
"UTF-8").map(_.strip).filter(_.nonEmpty).filter(_.head != '#')
 
     def skip(iso: String): Boolean = SKIPPED_COUNTRIES_ISO3.contains(iso)
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
index 72c587c..1732ffd 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
@@ -136,7 +136,7 @@ object NCDateEnricher extends NCServerEnricher {
              
                 val map = U.readTextGzipResource(res, "UTF-8", logger).map(p ⇒ 
{
                     val idx = p.indexOf("|")
-                    p.take(idx).trim → p.drop(idx + 1).trim
+                    p.take(idx).strip → p.drop(idx + 1).trim
                 })
              
                 m ++= map
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/stopword/NCStopWordEnricher.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/stopword/NCStopWordEnricher.scala
index 71db333..331c020 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/stopword/NCStopWordEnricher.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/stopword/NCStopWordEnricher.scala
@@ -275,7 +275,7 @@ object NCStopWordEnricher extends NCServerEnricher {
                         map(_.trim.toUpperCase).
                         filter(_.nonEmpty).
                         toSeq.
-                        map(p ⇒ if (p.head == '~') p.drop(1).trim → false else 
p → true).
+                        map(p ⇒ if (p.head == '~') p.drop(1).strip → false 
else p → true).
                         toMap
                 else
                     Map.empty
@@ -634,7 +634,7 @@ object NCStopWordEnricher extends NCServerEnricher {
             for (tup ← origToks; key = tup._2 if !foundKeys.contains(key) && 
!isException(tup._1))
                 foundKeys.find(key.startsWith) match {
                     case Some(s) ⇒
-                        if (nounWords.contains(key.substring(s.length).trim))
+                        if (nounWords.contains(key.substring(s.length).strip))
                             tup._1.foreach(tok ⇒ ns.fixNote(tok.getNlpNote, 
"stopWord" → true))
                     case None ⇒ ()
                 }
@@ -678,7 +678,7 @@ object NCStopWordEnricher extends NCServerEnricher {
         val m =
             readStopWords(
                 U.readResource("stopwords/stop_words.txt", "UTF-8", logger).
-                    map(_.trim).filter(s ⇒ s.nonEmpty && 
!s.startsWith("#")).toSeq
+                    map(_.strip).filter(s ⇒ s.nonEmpty && 
!s.startsWith("#")).toSeq
             )
 
         stopWords = m(false)
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 40d3f3d..ea96314 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
@@ -215,13 +215,13 @@ class NCBasicRestApi extends NCRestApi with LazyLogging 
with NCOpenCensusTrace w
                     s.resultType.isDefined &&
                     s.resultType.get == "json"
                 )
-                    U.js2Obj(s.resultBody.get)
+                    U.jsonToObject(s.resultBody.get)
                 else
                     s.resultBody.orNull
                 ),
             "error" → s.error.orNull,
             "errorCode" → s.errorCode.map(Integer.valueOf).orNull,
-            "logHolder" → (if (s.logJson.isDefined) U.js2Obj(s.logJson.get) 
else null),
+            "logHolder" → (if (s.logJson.isDefined) 
U.jsonToObject(s.logJson.get) else null),
             "intentId" → s.intentId.orNull
         ).filter(_._2 != null).asJava
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
index d23a632..93d8788 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
@@ -1021,11 +1021,11 @@ object NCSqlManager extends NCService with 
NCIgniteInstance {
     @throws[NCE]
     private def executeScript(sqlPath: String): Unit = 
startScopedSpan("executeScript", "sqlPath" → sqlPath) { _ ⇒
         U.readResource(sqlPath, "UTF-8").
-            map(_.trim).
+            map(_.strip).
             filter(p ⇒ !p.startsWith("--")).
             mkString("\n").
             split(";").
-            map(_.trim).
+            map(_.strip).
             filter(_.nonEmpty).
             foreach(p ⇒ NCSql.ddl(p))
     }
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
index 5505d3c..104e20e 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
@@ -56,7 +56,7 @@ class NCSqlExampleSpec extends NCTestContext {
         NORM.
             foldLeft(s) { (res, s) ⇒ res.replaceAll(s, " ") }.
             split(" ").
-            map(_.trim).
+            map(_.strip).
             filter(_.nonEmpty).
             mkString(" ")
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslIntent.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/NCDslCompilerSpec.scala
similarity index 63%
copy from 
nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslIntent.scala
copy to 
nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/NCDslCompilerSpec.scala
index c93a3e4..3656d74 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslIntent.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/NCDslCompilerSpec.scala
@@ -15,21 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.model.intent.utils.ver2
+package org.apache.nlpcraft.model.intent.dsl
+
+import org.apache.nlpcraft.common.NCException
+import org.apache.nlpcraft.model.intent.impl.ver2.NCIntentDslCompiler
+import org.junit.jupiter.api.Test
 
 /**
- * DSL intent.
+ * Tests for DSL compiler.
  */
-case class NCDslIntent(
-    orig: String,
-    id: String,
-    ordered: Boolean,
-    meta: Map[String, Any],
-    flow: Option[String],
-    terms: Array[NCDslTerm]
-) {
-    if (id == null)
-        throw new IllegalArgumentException("Intent ID must be provided.")
-    if (terms.length == 0)
-        throw new IllegalArgumentException("Intent should have at least one 
term.")
+class NCDslCompilerSpec {
+    @Test
+    @throws[NCException]
+    def test(): Unit = {
+        NCIntentDslCompiler.compile(
+            """
+              |intent=i1 meta={'a': true} term={}
+              |""".stripMargin, "mdl.id")
+    }
 }

Reply via email to