in nlpcraft/src/main/scala/org/apache/nlpcraft/internal/conversation/NCConversationData.scala [130:178]
private def stepLogEntity(ents: Seq[NCEntity]): Unit =
for (ent <- ents) logger.trace(s" +-- $ent")
/**
* Adds given entities to the conversation.
*
* @param reqId Server request ID.
* @param ents Entities to add to the conversation STM.
*/
def addEntities(reqId: String, ents: List[NCEntity]): Unit =
stm.synchronized {
depth = 0
lastEnts += ents // Last used entities processing.
val delCnt = lastEnts.length - maxDepth
if delCnt > 0 then lastEnts.remove(0, delCnt)
val senEnts = ents.filter(_.getRequestId == reqId)
if senEnts.nonEmpty then
// Adds new conversation element.
stm += ConversationItem(
mutable.ArrayBuffer.empty[EntityHolder] ++ senEnts.map(EntityHolder(_)),
reqId,
lastUpdateTstamp
)
logger.trace(s"Added new entities to STM [usrId=$usrId, mdlId=$mdlId, reqId=$reqId]")
stepLogEntity(ents)
val registered = mutable.HashSet.empty[Seq[String]]
for (item <- stm.reverse; (gs, hs) <- item.holders.groupBy(t => if t.entity.getGroups.nonEmpty then t.entity.getGroups else Seq.empty))
val grps = gs.toSeq.sorted
// Reversed iteration.
// N : (A, B) -> registered.
// N-1 : (C) -> registered.
// N-2 : (A, B) or (A, B, X) etc -> deleted, because registered has less groups.
registered.find(grps.containsSlice) match
case Some(_) =>
item.holders --= hs
for (ent <- hs.map(_.entity)) logger.trace(s"STM entity overridden: $ent")
case None => registered += grps
// Updates entity usage time.
stm.foreach(_.holders.filter(h => ents.contains(h.entity)).foreach(_.entityTypeUsageTime = lastUpdateTstamp))
squeezeEntities()
}