Merge remote-tracking branch 'origin/NLPCRAFT-41' into NLPCRAFT-120
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 ff045ad..226d48e 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
@@ -1209,13 +1209,13 @@
     /**
       * Checks duplicated elements in collection.
       *
-      * @param seq Collection.
+      * @param list Collection. Note, it should be list.
       * @param seen Checked elements.
       * @see #getDups
       */
     @annotation.tailrec
-    def containsDups[T](seq: Seq[T], seen: Set[T] = Set.empty[T]): Boolean =
-        seq match {
+    def containsDups[T](list: List[T], seen: Set[T] = Set.empty[T]): Boolean =
+        list match {
             case x :: xs ⇒ if (seen.contains(x)) true else containsDups(xs, seen + x)
             case _ ⇒ false
         }
@@ -1228,8 +1228,7 @@
       * @return
       * @see #containsDups
       */
-    def getDups[T](seq: Seq[T]): Set[T] =
-        seq.diff(seq.distinct).toSet
+    def getDups[T](seq: Seq[T]): Set[T] = seq.diff(seq.distinct).toSet
 
     /**
       * Gets a sequence without dups. It works by checking for dups first, before creating a new
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
index 5bc0734..b392175 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
@@ -132,7 +132,6 @@
     )
     @NCIntentSample({
         "What's the local weather forecast?",
-        "What's the local weather forecast?",
         "What's the weather in Moscow?",
         "What is the weather like outside?",
         "How's the weather?",
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 fc760f2..29b90eb 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
@@ -318,7 +318,7 @@
             // Add straight element synonyms (dups printed as warnings).
             val synsChunks = for (syn ← elm.getSynonyms.asScala.flatMap(parser.expand)) yield chunkSplit(syn)
 
-            if (U.containsDups(synsChunks.flatten))
+            if (U.containsDups(synsChunks.flatten.toList))
                 logger.trace(s"Model element synonym dups found (ignoring) [" +
                     s"mdlId=$mdlId, " +
                     s"elmId=$elmId, " +
@@ -332,7 +332,7 @@
                     (if (elm.getValueLoader != null) elm.getValueLoader.load(elm).asScala else Seq.empty)
 
             // Add value synonyms.
-            val valNames = vals.map(_.getName)
+            val valNames = vals.map(_.getName).toList
 
             if (U.containsDups(valNames))
                 logger.trace(s"Model element values names dups found (ignoring) [" +
@@ -1051,7 +1051,7 @@
             s"]")
 
         // Gets terms identifiers.
-        val termIds = tokParamAnns.zipWithIndex.map {
+        val termIds = tokParamAnns.toList.zipWithIndex.map {
             case (anns, idx) ⇒
                 def mkArg(): String = arg2Str(mtd, idx, ctxFirstParam)
 
@@ -1075,6 +1075,15 @@
                 }
             }
 
+
+        if (U.containsDups(termIds))
+            throw new NCE(s"@NCIntentTerm values duplicated [" +
+                s"mdlId=$mdlId, " +
+                s"duplicated=${U.getDups(termIds).mkString(", ")}, " +
+                s"callback=${method2Str(mtd)}" +
+                s"]"
+            )
+
         val terms = intent.terms.toSeq
 
         // Checks correctness of term IDs.
@@ -1477,6 +1486,16 @@
 
                                 None
                             }
+                            else if (U.containsDups(samples)) {
+                                logger.warn(s"@NCTestSample annotation has duplicates [" +
+                                    s"mdlId=$mdlId, " +
+                                    s"callback=$mkMethodName, " +
+                                    s"duplicated=${U.getDups(samples).mkString(", ")}" +
+                                    s"]"
+                                )
+
+                                Some(mkIntentId() → samples.distinct)
+                            }
                             else
                                 Some(mkIntentId() → samples)
                         }