You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by ar...@apache.org on 2021/05/16 22:48:45 UTC

[incubator-nlpcraft] branch NLPCREAFT-321 updated: Added metadata to the rest of the main components.

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

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


The following commit(s) were added to refs/heads/NLPCREAFT-321 by this push:
     new debb196  Added metadata to the rest of the main components.
debb196 is described below

commit debb1966f8a5a60d3cc27e63a78ef150c6af7e5b
Author: unknown <ar...@datalingvo.com>
AuthorDate: Sun May 16 15:48:34 2021 -0700

    Added metadata to the rest of the main components.
---
 .../apache/nlpcraft/common/nlp/NCNlpSentence.scala |  4 +--
 .../org/apache/nlpcraft/common/util/NCUtils.scala  |  8 ++++++
 .../scala/org/apache/nlpcraft/model/NCContext.java |  2 +-
 .../org/apache/nlpcraft/model/NCIntentMatch.java   |  2 +-
 .../scala/org/apache/nlpcraft/model/NCRequest.java |  2 +-
 .../scala/org/apache/nlpcraft/model/NCVariant.java |  2 +-
 .../apache/nlpcraft/model/impl/NCCompanyImpl.java  |  7 ++---
 .../{NCVariantImpl.java => NCMetadataAdapter.java} | 33 ++++++++++++++++------
 .../apache/nlpcraft/model/impl/NCTokenImpl.scala   |  6 ++--
 .../org/apache/nlpcraft/model/impl/NCUserImpl.java | 11 ++------
 .../apache/nlpcraft/model/impl/NCVariantImpl.java  |  9 +++++-
 .../model/intent/solver/NCIntentSolver.scala       | 25 ++++++----------
 .../probe/mgrs/nlp/NCProbeEnrichmentManager.scala  |  4 +--
 .../probe/mgrs/nlp/impl/NCRequestImpl.scala        | 24 ++++++++--------
 .../idl/compiler/functions/NCIdlFunctions.scala    | 22 +++++++--------
 15 files changed, 88 insertions(+), 73 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/NCNlpSentence.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/NCNlpSentence.scala
index ef42781..a397349 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/NCNlpSentence.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/nlp/NCNlpSentence.scala
@@ -17,6 +17,7 @@
 
 package org.apache.nlpcraft.common.nlp
 
+import org.apache.nlpcraft.common._
 import java.io.{Serializable ⇒ JSerializable}
 import java.util.{Collections, List ⇒ JList}
 import scala.collection.JavaConverters._
@@ -57,8 +58,7 @@ class NCNlpSentence(
     @transient
     private var hash: java.lang.Integer = _
 
-    private def calcHash(): Int =
-        Seq(srvReqId, text, enabledBuiltInToks, tokens).map(_.hashCode()).foldLeft(0)((a, b) ⇒ 31 * a + b)
+    private def calcHash(): Int = U.mkJavaHash(srvReqId, text, enabledBuiltInToks, tokens)
 
     // Deep copy.
     override def clone(): NCNlpSentence =
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 b51c63d..0248b56 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
@@ -1778,6 +1778,14 @@ object NCUtils extends LazyLogging {
     def mkSha256Hash(s: String): String = DigestUtils.sha256Hex(s)
 
     /**
+     * Makes standard Java hashcode.
+     *
+     * @param items Items to construct the hashcode from.
+     * @return Hashcode.
+     */
+    def mkJavaHash(items: Any*): Int = Seq(items: _*).map(_.hashCode()).foldLeft(0)((a, b) ⇒ 31 * a + b)
+
+    /**
       * Makes properties file based on input string.
       *
       * @param s String.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCContext.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCContext.java
index a75cb8e..2e0107e 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCContext.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCContext.java
@@ -26,7 +26,7 @@ import java.util.*;
  * 
  * @see NCIntentMatch#getContext() 
  */
-public interface NCContext extends Serializable {
+public interface NCContext extends NCMetadata, Serializable {
     /**
      * Tests if given token is part of the query this context is associated with.
      *
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentMatch.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentMatch.java
index 8552856..512a7ed 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentMatch.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCIntentMatch.java
@@ -35,7 +35,7 @@ import java.util.*;
  * @see NCIntentSample
  * @see NCIntentRef
  */
-public interface NCIntentMatch extends Serializable {
+public interface NCIntentMatch extends NCMetadata, Serializable {
     /**
      * Gets ID of the matched intent.
      *
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCRequest.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCRequest.java
index 1d53cd2..0bc9ca1 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCRequest.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCRequest.java
@@ -24,7 +24,7 @@ import java.util.*;
  *
  * @see NCContext#getRequest()
  */
-public interface NCRequest {
+public interface NCRequest extends NCMetadata {
     /**
      * Gets descriptor of the user on behalf of which this request was submitted.
      *
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCVariant.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCVariant.java
index 0003366..7aedc83 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCVariant.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCVariant.java
@@ -29,7 +29,7 @@ import java.util.stream.*;
  * @see NCModel#onParsedVariant(NCVariant)
  * @see NCContext#getVariants()
  */
-public interface NCVariant extends List<NCToken> {
+public interface NCVariant extends List<NCToken>, NCMetadata {
     /**
      * Utility method that returns all non-freeword tokens. It's equivalent to:
      * <pre class="brush: java">
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCCompanyImpl.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCCompanyImpl.java
index d61e770..660dd2f 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCCompanyImpl.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCCompanyImpl.java
@@ -24,7 +24,7 @@ import java.util.*;
  * User descriptor implementation.
  */
 @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
-public class NCCompanyImpl implements NCCompany {
+public class NCCompanyImpl extends NCMetadataAdapter implements NCCompany {
     private final long id;
     private final String name;
     private final Optional<String> website;
@@ -33,7 +33,6 @@ public class NCCompanyImpl implements NCCompany {
     private final Optional<String> address;
     private final Optional<String> city;
     private final Optional<String> postalCode;
-    private final Map<String, Object> meta;
 
     /**
      * 
@@ -58,6 +57,8 @@ public class NCCompanyImpl implements NCCompany {
         Optional<String> postalCode,
         Map<String, Object> meta
     ) {
+        super(meta);
+
         this.id = id;
         this.name = name;
         this.website = website;
@@ -66,7 +67,6 @@ public class NCCompanyImpl implements NCCompany {
         this.address = address;
         this.city = city;
         this.postalCode = postalCode;
-        this.meta = meta;
     }
 
     @Override public long getId() {
@@ -93,5 +93,4 @@ public class NCCompanyImpl implements NCCompany {
     @Override public Optional<String> getPostalCode() {
         return postalCode;
     }
-    @Override public Map<String, Object> getMetadata() { return meta; }
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCVariantImpl.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCMetadataAdapter.java
similarity index 60%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCVariantImpl.java
copy to nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCMetadataAdapter.java
index 463041f..b3b9d09 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCVariantImpl.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCMetadataAdapter.java
@@ -17,19 +17,34 @@
 
 package org.apache.nlpcraft.model.impl;
 
-import org.apache.nlpcraft.model.*;
-import java.util.*;
+import org.apache.nlpcraft.model.NCMetadata;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
- * Default implementation for variant.
+ * Abstract adapter for metadata.
  */
-public class NCVariantImpl extends ArrayList<NCToken> implements NCVariant {
+public abstract class NCMetadataAdapter implements NCMetadata {
+    final private Map<String, Object> meta;
+
+    /**
+     *
+     */
+    protected NCMetadataAdapter() {
+        meta = new HashMap<>();
+    }
+
     /**
-     * Creates new variant with given tokens.
-     * 
-     * @param c Collection of tokens.
+     *
+     * @param meta Metadata container to use.
      */
-    public NCVariantImpl(Collection<? extends NCToken> c) {
-        super(c);
+    protected NCMetadataAdapter(Map<String, Object> meta) {
+        this.meta = meta;
+    }
+
+    @Override
+    public Map<String, Object> getMetadata() {
+        return meta;
     }
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCTokenImpl.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCTokenImpl.scala
index 8c5005a..d67dcfb 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCTokenImpl.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCTokenImpl.scala
@@ -50,7 +50,7 @@ private[nlpcraft] class NCTokenImpl(
     endCharIndex: Int,
     meta: Map[String, Object],
     isAbstractProp: Boolean
-) extends NCToken with JSerializable {
+) extends NCMetadataAdapter(mutable.HashMap(meta.toSeq:_ *).asJava) with NCToken with JSerializable {
     require(mdl != null)
     require(srvReqId != null)
     require(id != null)
@@ -58,13 +58,11 @@ private[nlpcraft] class NCTokenImpl(
     require(ancestors != null)
     require(meta != null)
 
-    private final val hash =
-        Seq(srvReqId, id, startCharIndex, endCharIndex).map(_.hashCode()).foldLeft(0)((a, b) ⇒ 31 * a + b)
+    private final val hash = U.mkJavaHash(mdl.getId, srvReqId, id, startCharIndex, endCharIndex)
 
     private var parts = Seq.empty[NCToken]
 
     override lazy val getModel: NCModelView = mdl
-    override lazy val getMetadata: java.util.Map[String, Object] = mutable.HashMap(meta.toSeq:_ *).asJava // We need mutable metadata.
     override lazy val getServerRequestId: String = srvReqId
     override lazy val getId: String = id
     override lazy val getGroups: java.util.List[String] = grps.asJava
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCUserImpl.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCUserImpl.java
index 3083c03..a30507f 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCUserImpl.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCUserImpl.java
@@ -24,13 +24,12 @@ import java.util.*;
  * User descriptor implementation.
  */
 @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
-public class NCUserImpl implements NCUser {
+public class NCUserImpl extends NCMetadataAdapter implements NCUser {
     private final long id;
     private final Optional<String> firstName;
     private final Optional<String> lastName;
     private final Optional<String> email;
     private final Optional<String> avatarUrl;
-    private final Map<String, Object> meta;
     private final boolean isAdmin;
     private final long signupTstamp;
 
@@ -55,12 +54,13 @@ public class NCUserImpl implements NCUser {
         boolean isAdmin,
         long signupTstamp
     ) {
+        super(meta);
+
         this.id = id;
         this.firstName = firstName;
         this.lastName = lastName;
         this.email = email;
         this.avatarUrl = avatarUrl;
-        this.meta = meta;
         this.isAdmin = isAdmin;
         this.signupTstamp = signupTstamp;
     }
@@ -81,11 +81,6 @@ public class NCUserImpl implements NCUser {
     }
 
     @Override
-    public Map<String, Object> getMetadata() {
-        return meta;
-    }
-
-    @Override
     public Optional<String> getEmail() {
         return email;
     }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCVariantImpl.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCVariantImpl.java
index 463041f..4d60c1d 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCVariantImpl.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/NCVariantImpl.java
@@ -24,12 +24,19 @@ import java.util.*;
  * Default implementation for variant.
  */
 public class NCVariantImpl extends ArrayList<NCToken> implements NCVariant {
+    private final Map<String, Object> meta = new HashMap<>();
+
     /**
      * Creates new variant with given tokens.
-     * 
+     *
      * @param c Collection of tokens.
      */
     public NCVariantImpl(Collection<? extends NCToken> c) {
         super(c);
     }
+
+    @Override
+    public Map<String, Object> getMetadata() {
+        return meta;
+    }
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
index 02d6157..2404550 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
@@ -23,7 +23,7 @@ import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.common.debug.NCLogHolder
 import org.apache.nlpcraft.common.opencensus.NCOpenCensusTrace
 import org.apache.nlpcraft.common.util.NCUtils
-import org.apache.nlpcraft.model.impl.NCVariantImpl
+import org.apache.nlpcraft.model.impl.{NCMetadataAdapter, NCVariantImpl}
 import org.apache.nlpcraft.model.intent.NCIdlIntent
 import org.apache.nlpcraft.model.{NCContext, NCIntentMatch, NCIntentSkip, NCModel, NCRejection, NCResult, NCToken, NCVariant}
 import org.apache.nlpcraft.probe.mgrs.dialogflow.NCDialogFlowManager
@@ -94,21 +94,14 @@ class NCIntentSolver(intents: List[(NCIdlIntent/*Intent*/, NCIntentMatch ⇒ NCR
             try {
                 i += 1
                 
-                val intentMatch: NCIntentMatch = new NCIntentMatch() {
-                    override val getContext: NCContext =
-                        ctx
-                    override val getIntentTokens: java.util.List[java.util.List[NCToken]] =
-                        res.groups.map(_.tokens.asJava).asJava
-                    override val getVariant: NCVariant =
-                        new NCVariantImpl(res.variant.tokens)
-                    override val isAmbiguous: Boolean =
-                        !res.isExactMatch
-                    override val getIntentId: String =
-                        res.intentId
-                    override def getTermTokens(idx: Int): java.util.List[NCToken] =
-                        res.groups(idx).tokens.asJava
-                    override def getTermTokens(termId: String): java.util.List[NCToken] =
-                        res.groups.find(_.termId === termId).flatMap(grp ⇒ Some(grp.tokens)).getOrElse(Nil).asJava
+                val intentMatch: NCIntentMatch = new NCMetadataAdapter with NCIntentMatch {
+                    override val getContext: NCContext = ctx
+                    override val getIntentTokens: java.util.List[java.util.List[NCToken]] = res.groups.map(_.tokens.asJava).asJava
+                    override val getVariant: NCVariant = new NCVariantImpl(res.variant.tokens)
+                    override val isAmbiguous: Boolean = !res.isExactMatch
+                    override val getIntentId: String = res.intentId
+                    override def getTermTokens(idx: Int): java.util.List[NCToken] = res.groups(idx).tokens.asJava
+                    override def getTermTokens(termId: String): java.util.List[NCToken] = res.groups.find(_.termId === termId).flatMap(grp ⇒ Some(grp.tokens)).getOrElse(Nil).asJava
                 }
                 
                 if (!in.context.getModel.asInstanceOf[NCModel].onMatchedIntent(intentMatch)) {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
index 8b9258b..398d1c2 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
@@ -26,7 +26,7 @@ import org.apache.nlpcraft.common.debug.NCLogHolder
 import org.apache.nlpcraft.common.nlp.{NCNlpSentence, NCNlpSentenceNote}
 import org.apache.nlpcraft.common.pool.NCThreadPoolManager
 import org.apache.nlpcraft.model._
-import org.apache.nlpcraft.model.impl.NCTokenLogger
+import org.apache.nlpcraft.model.impl.{NCMetadataAdapter, NCTokenLogger}
 import org.apache.nlpcraft.model.intent.solver.NCIntentSolverInput
 import org.apache.nlpcraft.model.opencensus.stats.NCOpenCensusModelStats
 import org.apache.nlpcraft.model.tools.embedded.NCEmbeddedResult
@@ -583,7 +583,7 @@ object NCProbeEnrichmentManager extends NCService with NCOpenCensusModelStats {
         val logHldr = if (enableLog) new NCLogHolder else null
         
         // Create model query context.
-        val ctx: NCContext = new NCContext {
+        val ctx: NCContext = new NCMetadataAdapter with NCContext {
             override lazy val getRequest: NCRequest = req
             override lazy val getModel: NCModel = mdl.model
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/impl/NCRequestImpl.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/impl/NCRequestImpl.scala
index d6d60b0..d828961 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/impl/NCRequestImpl.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/impl/NCRequestImpl.scala
@@ -29,17 +29,17 @@ import scala.compat.java8.OptionConverters._
 
 /**
  *
- * @param meta NLP server sentence metadata.
+ * @param nlpMeta NLP server sentence metadata.
  * @param srvReqId Server request ID.
  */
-case class NCRequestImpl(meta: Map[String, Any], srvReqId: String) extends NCRequest {
+case class NCRequestImpl(nlpMeta: Map[String, Any], srvReqId: String) extends NCMetadataAdapter with NCRequest {
     override lazy val getServerRequestId: String = srvReqId
     override lazy val getNormalizedText: String = {
-        val s: String = meta("NORMTEXT").asInstanceOf[String]
-        
+        val s: String = nlpMeta("NORMTEXT").asInstanceOf[String]
+
         s.toLowerCase
     }
-    override lazy val getReceiveTimestamp: Long = meta("RECEIVE_TSTAMP").asInstanceOf[Long] // UTC.
+    override lazy val getReceiveTimestamp: Long = nlpMeta("RECEIVE_TSTAMP").asInstanceOf[Long] // UTC.
     override lazy val getClientAgent: Optional[String] = getOpt("USER_AGENT")
     override lazy val getRemoteAddress: Optional[String] = getOpt("REMOTE_ADDR")
     override lazy val getRequestData: java.util.Map[String, Object] = getOpt[String]("DATA").asScala match {
@@ -47,8 +47,8 @@ case class NCRequestImpl(meta: Map[String, Any], srvReqId: String) extends NCReq
         case None ⇒ Map.empty[String, Object].asJava
     }
     override lazy val getCompany: NCCompany = new NCCompanyImpl(
-        meta("COMPANY_ID").asInstanceOf[Long],
-        meta("COMPANY_NAME").asInstanceOf[String],
+        nlpMeta("COMPANY_ID").asInstanceOf[Long],
+        nlpMeta("COMPANY_NAME").asInstanceOf[String],
         getOpt("COMPANY_WEBSITE"),
         getOpt("COMPANY_COUNTRY"),
         getOpt("COMPANY_REGION"),
@@ -58,18 +58,18 @@ case class NCRequestImpl(meta: Map[String, Any], srvReqId: String) extends NCReq
         getMap("COMPANY_META")
     )
     override lazy val getUser: NCUser = new NCUserImpl(
-        meta("USER_ID").asInstanceOf[Long],
+        nlpMeta("USER_ID").asInstanceOf[Long],
         getOpt("FIRST_NAME"),
         getOpt("LAST_NAME"),
         getOpt("EMAIL"),
         getOpt("AVATAR_URL"),
         getMap("META"),
-        meta("IS_ADMIN").asInstanceOf[Boolean],
-        meta("SIGNUP_TSTAMP").asInstanceOf[Long]
+        nlpMeta("IS_ADMIN").asInstanceOf[Boolean],
+        nlpMeta("SIGNUP_TSTAMP").asInstanceOf[Long]
     )
-    
+
     private def getOpt[T](key: String): Optional[T] =
-        meta.get(key) match {
+        nlpMeta.get(key) match {
             case Some(v) ⇒ Optional.of(v.asInstanceOf[T])
             case None ⇒ Optional.empty()
         }
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/functions/NCIdlFunctions.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/functions/NCIdlFunctions.scala
index 35eb0f7..77759f9 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/functions/NCIdlFunctions.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/idl/compiler/functions/NCIdlFunctions.scala
@@ -18,6 +18,7 @@
 package org.apache.nlpcraft.model.intent.idl.compiler.functions
 
 import org.apache.nlpcraft.common.{NCE, ScalaMeta}
+import org.apache.nlpcraft.model.impl.NCMetadataAdapter
 import org.apache.nlpcraft.model.intent.compiler.{NCIdlCompiler, NCIdlCompilerGlobal}
 import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlTerm}
 import org.apache.nlpcraft.model.{NCCompany, NCModel, NCModelView, NCRequest, NCToken, NCTokenPredicateContext, NCTokenPredicateResult, NCUser}
@@ -109,17 +110,16 @@ private[functions] trait NCIdlFunctions {
             intentMeta = intentMeta,
             convMeta = convMeta,
             fragMeta = fragMeta,
-            req =
-                new NCRequest() {
-                    override def getUser: NCUser = reqUsr
-                    override def getCompany: NCCompany = reqComp
-                    override def getServerRequestId: String = reqSrvReqId
-                    override def getNormalizedText: String = reqNormText
-                    override def getReceiveTimestamp: Long = reqTstamp
-                    override def getRemoteAddress: Optional[String] = Optional.ofNullable(reqAddr)
-                    override def getClientAgent: Optional[String] = Optional.ofNullable(reqAgent)
-                    override def getRequestData: util.Map[String, AnyRef] = reqData.asJava
-                }
+            req = new NCMetadataAdapter with NCRequest {
+                override def getUser: NCUser = reqUsr
+                override def getCompany: NCCompany = reqComp
+                override def getServerRequestId: String = reqSrvReqId
+                override def getNormalizedText: String = reqNormText
+                override def getReceiveTimestamp: Long = reqTstamp
+                override def getRemoteAddress: Optional[String] = Optional.ofNullable(reqAddr)
+                override def getClientAgent: Optional[String] = Optional.ofNullable(reqAgent)
+                override def getRequestData: util.Map[String, AnyRef] = reqData.asJava
+            }
         )
 
     protected def tkn(