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 <aradzin...@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(