private def stepLogEntity()

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