You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2022/05/05 11:05:57 UTC

[incubator-nlpcraft] 02/03: Minor fixes.

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

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

commit 8e538a89b79a88f494654b13014d631cd9a06b0d
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Thu May 5 13:48:25 2022 +0300

    Minor fixes.
---
 .../nlpcraft/examples/pizzeria/PizzeriaModel.scala | 75 +++++++++++-----------
 .../nlpcraft/examples/pizzeria/PizzeriaOrder.scala |  2 +-
 .../examples/pizzeria/PizzeriaModelSpec.scala      |  9 ++-
 3 files changed, 44 insertions(+), 42 deletions(-)

diff --git a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
index c9452e32..c11f49c3 100644
--- a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
+++ b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
@@ -42,17 +42,6 @@ object PizzeriaModel extends LazyLogging:
     private def extractDrink(e: NCEntity): Drink =
         Drink(e.get[String]("ord:drink:value"), extractQty(e, "ord:drink:qty"))
 
-    type Result = (NCResult, State)
-
-import org.apache.nlpcraft.examples.pizzeria.PizzeriaModel.*
-
-/**
-  * Pizza model.
-  * It keep order state for each user.
-  * Each order can in one of 5 state (org.apache.nlpcraft.examples.pizzeria.OrderState)
-  * Note that there is used custom states logic instead of STM, because complex states flow.
-  */
-class PizzeriaModel extends NCModelAdapter(new NCModelConfig("nlpcraft.pizzeria.ex", "Pizzeria Example Model", "1.0"), PizzeriaModelPipeline.PIPELINE) with LazyLogging:
     private def getOrder(ctx: NCContext): Order =
         val data = ctx.getConversation.getData
         val usrId = ctx.getRequest.getUserId
@@ -62,7 +51,10 @@ class PizzeriaModel extends NCModelAdapter(new NCModelConfig("nlpcraft.pizzeria.
         else
             val o = new Order()
             data.put(usrId, o)
+
             o
+    private def mkResult(msg: String): NCResult = NCResult(msg, ASK_RESULT)
+    private def mkDialog(msg: String): NCResult = NCResult(msg, ASK_DIALOG)
 
     private def doRequest(body: Order => Result)(using im: NCIntentMatch): NCResult =
         val o = getOrder(im.getContext)
@@ -77,62 +69,71 @@ class PizzeriaModel extends NCModelAdapter(new NCModelConfig("nlpcraft.pizzeria.
 
         res
 
-    private def askIsReady(): Result = NCResult(s"Is order ready?", ASK_DIALOG) -> DIALOG_IS_READY
+    private def askIsReady(): Result = mkDialog(s"Is order ready?") -> DIALOG_IS_READY
 
     private def askSpecify(o: Order): Result =
         require(!o.isValid)
 
         o.findPizzaWithoutSize match
             case Some(p) =>
-                NCResult(s"Choose size (large, medium or small) for: '${p.name}'", ASK_DIALOG) -> DIALOG_SPECIFY
+                mkDialog(s"Choose size (large, medium or small) for: '${p.name}'") -> DIALOG_SPECIFY
             case None =>
                 require(o.isEmpty)
-                NCResult(s"Please order something. Ask `menu` to look what you can order.", ASK_DIALOG) -> DIALOG_SPECIFY
+                mkDialog(s"Please order something. Ask `menu` to look what you can order.") -> DIALOG_SPECIFY
 
-    private def askShouldStop(): Result =
-        NCResult(s"Should current order be canceled?", ASK_DIALOG) -> DIALOG_SHOULD_CANCEL
+    private def askShouldStop(): Result = mkDialog(s"Should current order be canceled?") -> DIALOG_SHOULD_CANCEL
 
     private def doShowMenu(): NCResult =
-        NCResult(
+        mkResult(
             "There are accessible for order: margherita, carbonara and marinara. Sizes: large, medium or small. " +
-            "Also there are tea, coffee and cola.",
-            ASK_RESULT
+                "Also there are tea, coffee and cola."
         )
 
-    private def doShowStatus(o: Order): NCResult = NCResult(s"Current order state: ${o.getDescription}.", ASK_RESULT)
+    private def doShowStatus(o: Order): NCResult = mkResult(s"Current order state: ${o.getDescription}.")
 
     private def askConfirm(o: Order): Result =
         require(o.isValid)
-        NCResult(s"Let's specify your order: ${o.getDescription}. Is it correct?", ASK_DIALOG) -> DIALOG_CONFIRM
+        mkDialog(s"Let's specify your order: ${o.getDescription}. Is it correct?") -> DIALOG_CONFIRM
 
-    private def withClear(res: NCResult, newState: State, im: NCIntentMatch): Result =
+    private def doResultWithClear(msg: String)(using im: NCIntentMatch): Result =
         val ctx = im.getContext
         val conv = ctx.getConversation
         conv.getData.remove(ctx.getRequest.getUserId)
         conv.clearStm(_ => true)
         conv.clearDialog(_ => true)
-        res -> newState
+        mkResult(msg) -> DIALOG_EMPTY
+
 
-    // Access level set for tests reasons.
-    private[pizzeria] def doExecute(o: Order)(using im: NCIntentMatch): Result =
-        require(o.isValid)
-        withClear(NCResult(s"Executed: ${o.getDescription}.", ASK_RESULT), DIALOG_EMPTY, im)
 
     private def doStop(o: Order)(using im: NCIntentMatch): Result =
-        withClear(
-            NCResult(
-                if !o.isEmpty then s"Everything cancelled. Ask `menu` to look what you can order."
-                else s"Nothing to cancel. Ask `menu` to look what you can order.",
-                ASK_RESULT
-            ),
-            DIALOG_EMPTY,
-            im
+        doResultWithClear(
+            if !o.isEmpty then s"Everything cancelled. Ask `menu` to look what you can order."
+            else s"Nothing to cancel. Ask `menu` to look what you can order."
         )
 
-    private def doContinue(): Result = NCResult(s"OK, please continue.", ASK_RESULT) -> DIALOG_EMPTY
+    private def doContinue(): Result = mkResult("OK, please continue.") -> DIALOG_EMPTY
     private def askConfirmOrAskSpecify(o: Order): Result = if o.isValid then askConfirm(o) else askSpecify(o)
     private def askIsReadyOrAskSpecify(o: Order): Result = if o.isValid then askIsReady() else askSpecify(o)
+    private def askStopOrDoStop(o: Order)(using im: NCIntentMatch): Result = if o.isValid then askShouldStop() else doStop(o)
+
+    type Result = (NCResult, State)
+
+import org.apache.nlpcraft.examples.pizzeria.PizzeriaModel.*
+
+/**
+  * Pizza model.
+  * It keep order state for each user.
+  * Each order can in one of 5 state (org.apache.nlpcraft.examples.pizzeria.OrderState)
+  * Note that there is used custom states logic instead of STM, because complex states flow.
+  */
+class PizzeriaModel extends NCModelAdapter(new NCModelConfig("nlpcraft.pizzeria.ex", "Pizzeria Example Model", "1.0"), PizzeriaModelPipeline.PIPELINE) with LazyLogging:
+    // This method is defined in class scope and has package access level for tests reasons.
+    private[pizzeria] def doExecute(o: Order)(using im: NCIntentMatch): Result =
+        require(o.isValid)
+        doResultWithClear(s"Executed: ${o.getDescription}.")
+
     private def doExecuteOrAskSpecify(o: Order)(using im: NCIntentMatch): Result = if o.isValid then doExecute(o) else askSpecify(o)
+
     /**
       *
       * @param im
@@ -147,8 +148,6 @@ class PizzeriaModel extends NCModelAdapter(new NCModelConfig("nlpcraft.pizzeria.
             case DIALOG_SPECIFY | DIALOG_EMPTY => throw UNEXPECTED_REQUEST
     )
 
-    private def askStopOrDoStop(o: Order)(using im: NCIntentMatch): Result = if o.isValid then askShouldStop() else doStop(o)
-
     /**
       *
       * @param im
diff --git a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
index a537df4c..c003a2f1 100644
--- a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
+++ b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
@@ -83,7 +83,7 @@ class PizzeriaOrder:
       * @param ds
       */
     def add(ps: Seq[Pizza], ds: Seq[Drink]): Unit =
-        def setByName[T <: OrderElement](buf: mutable.ArrayBuffer[T], t: T) =
+        def setByName[T <: OrderElement](buf: mutable.ArrayBuffer[T], t: T): Unit =
             buf.find(_.name == t.name) match
                 case Some(found) => if t.qty.nonEmpty then found.qty = t.qty
                 case None => buf += t
diff --git a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
index ef99b54b..123529c5 100644
--- a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
+++ b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
@@ -28,12 +28,15 @@ import scala.util.Using
 import scala.collection.mutable
 
 object PizzeriaModelSpec:
+    type Request = (String, NCResultType)
     private class ModelTestWrapper extends PizzeriaModel:
         private var o: PizzeriaOrder = _
+
         override def doExecute(o: PizzeriaOrder)(using im: NCIntentMatch): Result =
             val res = super.doExecute(o)
             this.o = o
             res
+
         def getLastExecutedOrder: PizzeriaOrder = o
         def clearLastExecutedOrder(): Unit = o = null
 
@@ -72,7 +75,7 @@ class PizzeriaModelSpec:
 
         require(errs.isEmpty, s"There are ${errs.size} errors above.")
 
-    private def dialog(exp: PizzeriaOrder, reqs: (String, NCResultType)*): Unit =
+    private def dialog(exp: PizzeriaOrder, reqs: Request*): Unit =
         val testMsgs = mutable.ArrayBuffer.empty[String]
         msgs += testMsgs
 
@@ -109,8 +112,8 @@ class PizzeriaModelSpec:
 
     @Test
     def test(): Unit =
-        given Conversion[String, (String, NCResultType)] with
-            def apply(txt: String): (String, NCResultType) = (txt, ASK_DIALOG)
+        given Conversion[String, Request] with
+            def apply(txt: String): Request = (txt, ASK_DIALOG)
 
         dialog(
             new Builder().withDrink("tea", 2).build,