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

sergeykamov pushed a commit to branch NLPCRAFT-383
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/NLPCRAFT-383 by this push:
     new a3471e3  WIP.
a3471e3 is described below

commit a3471e34093527236bcd83b326de2e171f8835c0
Author: Sergey Kamov <[email protected]>
AuthorDate: Fri Aug 6 18:26:53 2021 +0300

    WIP.
---
 .../examples/solarsystem/SolarSystemModel.scala    | 50 +++++++++++---
 .../loaders/SolarSystemDiscoversValueLoader.scala  | 31 ++++++++-
 .../loaders/SolarSystemPlanetsValueLoader.scala    | 15 ++++-
 .../loaders/SolarSystemValueLoader.scala           | 18 -----
 .../SolarSystemOpenApiBodyRequest.scala}           |  9 +--
 .../tools/SolarSystemOpenApiService.scala          | 78 +++++++++++++++++-----
 .../src/main/resources/solarsystem_model.yaml      | 23 +------
 .../solarsystem/NCSolarSystemModelSpec.scala       |  6 +-
 8 files changed, 154 insertions(+), 76 deletions(-)

diff --git 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/SolarSystemModel.scala
 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/SolarSystemModel.scala
index d94531a..b4e5b1e 100644
--- 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/SolarSystemModel.scala
+++ 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/SolarSystemModel.scala
@@ -18,24 +18,56 @@
 package org.apache.nlpcraft.examples.solarsystem
 
 import com.typesafe.scalalogging.LazyLogging
-import org.apache.nlpcraft.model.{NCIntent, NCIntentTerm, NCModelFileAdapter, 
NCResult, NCToken}
+import org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService
+import org.apache.nlpcraft.model.{NCIntent, NCIntentSample, NCIntentTerm, 
NCModelFileAdapter, NCResult, NCToken}
 
 class SolarSystemModel extends NCModelFileAdapter("solarsystem_model.yaml") 
with LazyLogging {
+    private var api: SolarSystemOpenApiService = _
+
     override def onInit(): Unit = {
+        api = SolarSystemOpenApiService.getInstance()
 
+        logger.info("Solar System Model started.")
     }
 
     override def onDiscard(): Unit = {
-        super.onDiscard()
+        if (api != null)
+            api.stop()
+
+        logger.info("Solar System Model stopped.")
     }
 
+    @NCIntentSample(
+        Array(
+            "Moon!",
+            "give me information about Larissa",
+        )
+    )
     @NCIntent(
-        "intent=i1 " +
-            "term(planet)~{tok_id() == 'prop:moon'}"
+        "intent=planetInfo " +
+            "    options={" +
+            "        'unused_usr_toks': false " +
+            "    }" +
+            "    term(planet)={tok_id() == 'planet'}"
     )
-    def onCustomSortReport(
-        @NCIntentTerm("planet") sortTok: NCToken,
-    ): NCResult = {
-        NCResult.json("OK")
-    }
+    def planetInfo(@NCIntentTerm("planet") planet: NCToken): NCResult =
+        NCResult.text(api.bodyRequest().withFilter("id", "eq", 
planet.getNormalizedText).execute().toString())
+
+    @NCIntentSample(
+        Array(
+            "What was discovered by Asaph Hall",
+            "What was discovered by Hall",
+            "Galileo Galilei planets",
+            "Galilei planets",
+        )
+    )
+    @NCIntent(
+        "intent=discoverer " +
+        "    options={" +
+        "        'unused_usr_toks': true " +
+        "    }" +
+        "    term(discoverer)={tok_id() == 'discoverer'}"
+    )
+    def discoverer(@NCIntentTerm("discoverer") discoverer: NCToken): NCResult =
+        NCResult.text(api.bodyRequest().withFilter("discoveredBy", "cs", 
discoverer.getNormalizedText).execute().toString())
 }
diff --git 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemDiscoversValueLoader.scala
 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemDiscoversValueLoader.scala
index d676775..0a92d58 100644
--- 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemDiscoversValueLoader.scala
+++ 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemDiscoversValueLoader.scala
@@ -18,7 +18,34 @@
 package org.apache.nlpcraft.examples.solarsystem.loaders
 
 import org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService
+import org.apache.nlpcraft.model.{NCElement, NCValue, NCValueLoader}
+
+import java.util
+import scala.collection.mutable.ArrayBuffer
+import scala.jdk.CollectionConverters.{SeqHasAsJava, SetHasAsJava}
+
+class SolarSystemDiscoversValueLoader extends NCValueLoader {
+    // Example: "Scott S. Sheppard, David C. Jewitt"
+    private def mkValue(discInfo: String): NCValue = {
+        val syns = ArrayBuffer.empty[String]
+
+        for (d <- discInfo.split(",").map(_.trim).filter(_.nonEmpty)) {
+            syns += d.toLowerCase
+
+            val arr = d.split(" ")
+
+            // Tries to detect last name.
+            if (arr.length > 1)
+                syns += arr.last.strip.toLowerCase
+        }
+
+        new NCValue {
+            override def getName: String = discInfo
+            override def getSynonyms: util.List[String] = syns.asJava
+        }
+    }
+
+    override def load(owner: NCElement): util.Set[NCValue] =
+        
SolarSystemOpenApiService.getInstance().getAllDiscovers.map(mkValue).toSet.asJava
 
-class SolarSystemDiscoversValueLoader extends SolarSystemValueLoader  {
-    override def getData: Seq[String] = 
SolarSystemOpenApiService.getInstance().getAllDiscovers
 }
diff --git 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
index 5659d97..76dc321 100644
--- 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
+++ 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
@@ -18,7 +18,18 @@
 package org.apache.nlpcraft.examples.solarsystem.loaders
 
 import org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService
+import org.apache.nlpcraft.model.{NCElement, NCValue, NCValueLoader}
 
-class SolarSystemPlanetsValueLoader extends SolarSystemValueLoader {
-    override def getData: Seq[String] = 
SolarSystemOpenApiService.getInstance().getAllPlanets
+import java.util
+import scala.jdk.CollectionConverters.{SeqHasAsJava, SetHasAsJava}
+
+class SolarSystemPlanetsValueLoader extends NCValueLoader {
+    private def mkValue(id: String, v: String): NCValue =
+        new NCValue {
+            override def getName: String = id
+            override def getSynonyms: util.List[String] = Seq(id.toLowerCase, 
v.toLowerCase).asJava
+        }
+
+    override def load(owner: NCElement): util.Set[NCValue] =
+        SolarSystemOpenApiService.getInstance().getAllPlanets.map{ case (id, 
v) => mkValue(id, v) }.toSet.asJava
 }
diff --git 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemValueLoader.scala
 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemValueLoader.scala
deleted file mode 100644
index 3996849..0000000
--- 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemValueLoader.scala
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.apache.nlpcraft.examples.solarsystem.loaders
-
-import org.apache.nlpcraft.model.{NCElement, NCValue, NCValueLoader}
-
-import java.util
-import scala.jdk.CollectionConverters.{SeqHasAsJava, SetHasAsJava}
-
-trait SolarSystemValueLoader extends NCValueLoader {
-    def getData: Seq[String]
-
-    private def mkValue(v: String): NCValue =
-        new NCValue {
-            override def getName: String = v
-            override def getSynonyms: util.List[String] = 
Seq(v.toLowerCase).asJava
-        }
-
-    override def load(owner: NCElement): util.Set[NCValue] = 
getData.map(mkValue).toSet.asJava
-}
diff --git 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiBodyRequest.scala
similarity index 72%
copy from 
nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
copy to 
nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiBodyRequest.scala
index 5659d97..66cbf11 100644
--- 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
+++ 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiBodyRequest.scala
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.examples.solarsystem.loaders
+package org.apache.nlpcraft.examples.solarsystem.tools
 
-import org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService
+trait SolarSystemOpenApiBodyRequest {
+    def withParameters(params: String*): SolarSystemOpenApiBodyRequest
+    def withFilter(data: String, oper: String, value: String): 
SolarSystemOpenApiBodyRequest
 
-class SolarSystemPlanetsValueLoader extends SolarSystemValueLoader {
-    override def getData: Seq[String] = 
SolarSystemOpenApiService.getInstance().getAllPlanets
+    def execute(): Seq[Map[String, Object]]
 }
diff --git 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiService.scala
 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiService.scala
index 3bff72d..d6d4011 100644
--- 
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiService.scala
+++ 
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiService.scala
@@ -22,7 +22,7 @@ import com.fasterxml.jackson.module.scala.DefaultScalaModule
 import com.typesafe.scalalogging.LazyLogging
 import 
org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService.BodiesBean
 
-import java.net.URI
+import java.net.{URI, URLEncoder}
 import java.net.http.HttpClient.Version
 import java.net.http.{HttpClient, HttpRequest, HttpResponse}
 
@@ -31,7 +31,7 @@ object SolarSystemOpenApiService {
 
     private var s: SolarSystemOpenApiService = _
 
-    def getInstance(): SolarSystemOpenApiService = {
+    def getInstance(): SolarSystemOpenApiService =
         this.synchronized {
             if (s == null) {
                 s = new SolarSystemOpenApiService
@@ -41,7 +41,6 @@ object SolarSystemOpenApiService {
 
             s
         }
-    }
 }
 
 class SolarSystemOpenApiService extends LazyLogging {
@@ -49,31 +48,74 @@ class SolarSystemOpenApiService extends LazyLogging {
     private final val MAPPER = new 
ObjectMapper().registerModule(DefaultScalaModule)
 
     private var client: HttpClient = _
-    private var planets: Seq[String] = _
+
+    private var planets: Map[String, String] = _
     private var discovers: Seq[String] = _
 
-    private def getBody(params: String*): Seq[Map[String, Object]] = {
-        val req =
-            
HttpRequest.newBuilder(URI.create(s"$URL_BODIES?data=${params.mkString(",")}")).
-                header("Content-Type", "application/json").
-                GET().
-                build()
+    // Simplified implementation of 
'https://api.le-systeme-solaire.net/rest/bodies/' request.
+    // Only single filter can be used.
+    def bodyRequest(): SolarSystemOpenApiBodyRequest = new 
SolarSystemOpenApiBodyRequest() {
+        case class Filter(data: String, oper: String, value: String) {
+            require(data != null)
+            require(oper != null)
+            require(value != null)
+        }
+
+        private var params: Seq[String] = _
+        private var filter: Filter = _
+
+        override def withParameters(params: String*): 
SolarSystemOpenApiBodyRequest = {
+            this.params = params
+
+            this
+        }
+
+        override def withFilter(data: String, oper: String, value: String): 
SolarSystemOpenApiBodyRequest = {
+            this.filter = Filter(data, oper, value)
+
+            this
+        }
 
-        val respJs = client.sendAsync(req, 
HttpResponse.BodyHandlers.ofString()).get().body()
+        override def execute(): Seq[Map[String, Object]] = {
+            var url = URL_BODIES
 
-        MAPPER.readValue(respJs, classOf[BodiesBean]).bodies
+            def getSeparator: String = if (url == URL_BODIES) "?" else "&"
+
+            if (params != null)
+                url = s"$url${getSeparator}data=${params.mkString(",")}"
+
+            if (filter != null)
+                url = 
s"$url${getSeparator}filter=${filter.data},${filter.oper},${URLEncoder.encode(filter.value,
 "UTF-8")}"
+
+            logger.info(s"Request prepared: $url")
+
+            val respJs = client.sendAsync(
+                HttpRequest.newBuilder(URI.create(url)).header("Content-Type", 
"application/json").GET().build(),
+                HttpResponse.BodyHandlers.ofString()
+            ).get().body()
+
+            logger.info(s"Response received: $respJs")
+
+            MAPPER.readValue(respJs, classOf[BodiesBean]).bodies
+        }
     }
 
     def start(): Unit = {
         client = HttpClient.newBuilder.version(Version.HTTP_2).build
 
-        val res = getBody("englishName,discoveredBy")
+        val res = bodyRequest().withParameters("id", "englishName", 
"discoveredBy").execute()
+
+        def extract(name: String): Map[String, String] =
+            res.map(row => row("id").toString.strip() -> 
row(name).toString.strip()).
+                filter(p => p._1.nonEmpty && p._2.nonEmpty).distinct.toMap
+
+        def str(m: Map[String, Object], name: String): String = 
m(name).asInstanceOf[String].strip
 
-        def extract(name: String): Seq[String] =
-            
res.map(_(name).asInstanceOf[String]).map(_.strip).filter(_.nonEmpty).distinct
+        planets =
+            res.map(row => str(row, "id") -> str(row, "englishName")).
+                filter(p => p._1.nonEmpty && p._2.nonEmpty).toMap
 
-        planets = extract("englishName")
-        discovers = extract("discoveredBy")
+        discovers = res.map(row => str(row, "discoveredBy")).distinct
 
         logger.info(
             s"Solar System Open Api Service started. " +
@@ -90,6 +132,6 @@ class SolarSystemOpenApiService extends LazyLogging {
         logger.info(s"Solar System Open Api Service stopped.")
     }
 
-    def getAllPlanets: Seq[String] = planets
+    def getAllPlanets: Map[String, String] = planets
     def getAllDiscovers: Seq[String] = discovers
 }
diff --git 
a/nlpcraft-examples/solarsystem/src/main/resources/solarsystem_model.yaml 
b/nlpcraft-examples/solarsystem/src/main/resources/solarsystem_model.yaml
index 32745a9..93c4ac0 100644
--- a/nlpcraft-examples/solarsystem/src/main/resources/solarsystem_model.yaml
+++ b/nlpcraft-examples/solarsystem/src/main/resources/solarsystem_model.yaml
@@ -67,27 +67,10 @@ elements:
     synonyms:
       - "{discovered {by|_}}"
 
-  - id: "prop:discoveredDate"
-    groups:
-      - "prop"
-    description: "..."
-    synonyms:
-      - "{discovered {date|_}}"
-
-  - id: "prop:discoveredDate"
-    groups:
-      - "prop"
-    description: "..."
-    synonyms:
-      - "{discovered {date|_}}"
-
-  - id: "enum:planet"
+  - id: "planet"
     description: "..."
     valueLoader: 
"org.apache.nlpcraft.examples.solarsystem.loaders.SolarSystemPlanetsValueLoader"
 
-  - id: "enum:discoverer"
+  - id: "discoverer"
     description: "..."
-    valueLoader: 
"org.apache.nlpcraft.examples.solarsystem.loaders.SolarSystemDiscoversValueLoader"
-
-intents:
-  - "intent=ls term(act)={has(tok_groups(), 'prop')}"
\ No newline at end of file
+    valueLoader: 
"org.apache.nlpcraft.examples.solarsystem.loaders.SolarSystemDiscoversValueLoader"
\ No newline at end of file
diff --git 
a/nlpcraft-examples/solarsystem/src/test/java/org/apache/nlpcraft/examples/solarsystem/NCSolarSystemModelSpec.scala
 
b/nlpcraft-examples/solarsystem/src/test/java/org/apache/nlpcraft/examples/solarsystem/NCSolarSystemModelSpec.scala
index 9dae572..921b57b 100644
--- 
a/nlpcraft-examples/solarsystem/src/test/java/org/apache/nlpcraft/examples/solarsystem/NCSolarSystemModelSpec.scala
+++ 
b/nlpcraft-examples/solarsystem/src/test/java/org/apache/nlpcraft/examples/solarsystem/NCSolarSystemModelSpec.scala
@@ -19,14 +19,14 @@ package org.apache.nlpcraft.examples.solarsystem
 
 import org.apache.nlpcraft.{NCTestContext, NCTestEnvironment}
 import org.junit.jupiter.api.Test
-
 /**
  *
  */
 @NCTestEnvironment(model = classOf[SolarSystemModel], startClient = true)
 class NCSolarSystemModelSpec extends NCTestContext {
     @Test
-    def test(): Unit = {
-        checkIntent("moon", "i1")
+    def planetInfo(): Unit = {
+        checkIntent("moon", "planetInfo")
+        checkIntent("give me information about Larissa", "planetInfo")
     }
 }

Reply via email to