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)
}