Skip to content

Commit

Permalink
[NU-1579] decision table component - labels change (#5824)
Browse files Browse the repository at this point in the history
  • Loading branch information
mk-software-pl authored Apr 9, 2024
1 parent ac006b7 commit b7cc9ac
Show file tree
Hide file tree
Showing 9 changed files with 129 additions and 22 deletions.
7 changes: 6 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -743,7 +743,12 @@ lazy val defaultModel = (project in (file("defaultModel")))
.settings(assemblyNoScala("defaultModel.jar"): _*)
.settings(publishAssemblySettings: _*)
.settings(
name := "nussknacker-default-model"
name := "nussknacker-default-model",
libraryDependencies ++= {
Seq(
"org.scalatest" %% "scalatest" % scalaTestV % Test
)
}
)
.dependsOn(defaultHelpers, extensionsApi % Provided)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package pl.touk.nussknacker.defaultmodel

import pl.touk.nussknacker.defaultmodel.migrations.{
GroupByMigration,
RequestResponseSinkValidationModeMigration,
SinkExpressionMigration
}
import pl.touk.nussknacker.defaultmodel.migrations._
import pl.touk.nussknacker.engine.migration.{ProcessMigration, ProcessMigrations}

class DefaultModelMigrations extends ProcessMigrations {
Expand All @@ -13,7 +9,8 @@ class DefaultModelMigrations extends ProcessMigrations {
.listOf(
GroupByMigration,
SinkExpressionMigration,
RequestResponseSinkValidationModeMigration
RequestResponseSinkValidationModeMigration,
DecisionTableParameterNamesMigration
)
.processMigrations

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package pl.touk.nussknacker.defaultmodel.migrations

import pl.touk.nussknacker.engine.api.MetaData
import pl.touk.nussknacker.engine.api.parameter.ParameterName
import pl.touk.nussknacker.engine.graph.evaluatedparam.Parameter
import pl.touk.nussknacker.engine.graph.node
import pl.touk.nussknacker.engine.graph.node.Enricher
import pl.touk.nussknacker.engine.graph.service.ServiceRef
import pl.touk.nussknacker.engine.migration.NodeMigration

object DecisionTableParameterNamesMigration extends NodeMigration {

override val description: String = "Change Decision Table component parameter names"

override def migrateNode(metaData: MetaData): PartialFunction[node.NodeData, node.NodeData] = {
case enricher @ Enricher(_, service @ ServiceRef(_, params), _, _) =>
enricher.copy(service = service.copy(parameters = renameParams(params)))
}

private def renameParams(params: List[Parameter]) = {
params.map { param =>
param.name.value match {
case "Basic Decision Table" => param.copy(name = ParameterName("Decision Table"))
case "Expression" => param.copy(name = ParameterName("Filtering expression"))
case _ => param
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package pl.touk.nussknacker.defaultModel.migrations

import org.scalatest.freespec.AnyFreeSpecLike
import org.scalatest.matchers.should.Matchers
import pl.touk.nussknacker.defaultmodel.migrations.DecisionTableParameterNamesMigration
import pl.touk.nussknacker.engine.api.{MetaData, StreamMetaData}
import pl.touk.nussknacker.engine.api.parameter.ParameterName
import pl.touk.nussknacker.engine.graph.node.Enricher
import pl.touk.nussknacker.engine.graph.service.ServiceRef
import pl.touk.nussknacker.engine.graph.evaluatedparam.Parameter
import pl.touk.nussknacker.engine.graph.expression.Expression
import pl.touk.nussknacker.engine.spel.Implicits.asSpelExpression

class DecisionTableParameterNamesMigrationSpec extends AnyFreeSpecLike with Matchers {

"DecisionTableParameterNamesMigration should be applied" in {
val metaData = MetaData("test", StreamMetaData(Some(1)))
val beforeMigration = Enricher(
id = "decision-table",
service = ServiceRef(
id = "decision-table-service",
parameters = List(
Parameter(ParameterName("Basic Decision Table"), exampleDecisionTableJson),
Parameter(ParameterName("Expression"), "#ROW['age'] > #input.minAge && #ROW['DoB'] != null"),
)
),
output = "Output",
)
val expectedAfterMigration = Enricher(
id = "decision-table",
service = ServiceRef(
id = "decision-table-service",
parameters = List(
Parameter(ParameterName("Decision Table"), exampleDecisionTableJson),
Parameter(ParameterName("Filtering expression"), "#ROW['age'] > #input.minAge && #ROW['DoB'] != null"),
)
),
output = "Output",
)

val migrated = DecisionTableParameterNamesMigration.migrateNode(metaData)(beforeMigration)

migrated shouldBe expectedAfterMigration
}

private lazy val exampleDecisionTableJson = Expression.tabularDataDefinition {
s"""{
| "columns": [
| { "name": "name", "type": "java.lang.String" },
| { "name": "age", "type": "java.lang.Integer" },
| { "name": "DoB", "type": "java.time.LocalDate" }
| ],
| "rows": [
| [ "John", "39", null ],
| [ "Lisa", "21", "2003-01-13" ],
| [ "Mark", "54", "1970-12-30" ]
| ]
|}""".stripMargin
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import pl.touk.nussknacker.engine.api.graph.ScenarioGraph
import pl.touk.nussknacker.engine.api.process.{ProcessId, ProcessName}
import pl.touk.nussknacker.engine.canonicalgraph.CanonicalProcess
import pl.touk.nussknacker.engine.migration.{ProcessMigration, ProcessMigrations}
import pl.touk.nussknacker.ui.process.ScenarioWithDetailsConversions
import pl.touk.nussknacker.ui.process.marshall.CanonicalProcessConverter
import pl.touk.nussknacker.ui.process.repository.ProcessRepository.UpdateProcessAction
import pl.touk.nussknacker.ui.process.repository.{MigrationComment, ScenarioWithDetailsEntity}
Expand Down
3 changes: 3 additions & 0 deletions docs/MigrationGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ To see the biggest differences please consult the [changelog](Changelog.md).
* [#5724](https://github.com/TouK/nussknacker/pull/5724) Improvements: Run Designer locally
* Introduce `JAVA_DEBUG_PORT` to run the Designer locally with remote debugging capability
* Removed `SCALA_VERSION`, please use `NUSSKNACKER_SCALA_VERSION` instead of it
* [#5824](https://github.com/TouK/nussknacker/pull/5824) Decision Table parameters rename:
* "Basic Decision Table" -> "Decision Table"
* "Expression" -> "Filtering expression"

## In version 1.14.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ trait DecisionTableSpec
ExpressionParserCompilationError(
message = "There is no property 'years' in type: Record{DoB: LocalDate, age: Integer, name: String}",
nodeId = "decision-table",
paramName = Some(ParameterName("Expression")),
paramName = Some(ParameterName("Filtering expression")),
originalExpr = "#ROW['years'] > #input.minAge",
details = None
)
Expand All @@ -124,7 +124,7 @@ trait DecisionTableSpec
ExpressionParserCompilationError(
message = "Wrong part types",
nodeId = "decision-table",
paramName = Some(ParameterName("Expression")),
paramName = Some(ParameterName("Filtering expression")),
originalExpr = "#ROW['name'] > #input.minAge",
details = None
)
Expand All @@ -151,7 +151,7 @@ trait DecisionTableSpec
ExpressionParserCompilationError(
message = "Typing error in some cells",
nodeId = "decision-table",
paramName = Some(ParameterName("Basic Decision Table")),
paramName = Some(ParameterName("Decision Table")),
originalExpr = invalidColumnTypeDecisionTableJson.expression,
details = Some(
TabularDataDefinitionParserErrorDetails(
Expand Down Expand Up @@ -222,12 +222,10 @@ trait DecisionTableSpec
ScenarioBuilder
.requestResponse("test scenario")
.source("request", TestScenarioRunner.testDataSource)
.enricher(
"decision-table",
"dtResult",
"decision-table",
"Basic Decision Table" -> basicDecisionTableDefinition,
"Expression" -> expression,
.decisionTable(
decisionTableParamValue = basicDecisionTableDefinition,
filterExpressionParamValue = expression,
output = "dtResult",
)
.end("end", "value" -> sinkValueExpression)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ object DecisionTable extends EagerService with SingleInputDynamicComponent[Servi
private type Output = java.util.List[java.util.Map[String, Any]]

private object BasicDecisionTableParameter {
val name: ParameterName = ParameterName("Basic Decision Table")
val name: ParameterName = ParameterName("Decision Table")

val declaration: ParameterExtractor[TabularTypedData] with ParameterCreatorWithNoDependency =
ParameterDeclaration
Expand All @@ -36,7 +36,7 @@ object DecisionTable extends EagerService with SingleInputDynamicComponent[Servi
}

private object FilterDecisionTableExpressionParameter {
val name: ParameterName = ParameterName("Expression")
val name: ParameterName = ParameterName("Filtering expression")

val declaration: ParameterCreator[TabularTypedData] with ParameterExtractor[LazyParameter[lang.Boolean]] = {
ParameterDeclaration
Expand Down Expand Up @@ -70,9 +70,9 @@ object DecisionTable extends EagerService with SingleInputDynamicComponent[Servi
dependencies: List[NodeDependencyValue],
finalState: Option[Unit]
): ServiceInvoker = {
val tabularTypedData = BasicDecisionTableParameter.declaration.extractValueUnsafe(params)
val filterExpression = FilterDecisionTableExpressionParameter.declaration.extractValueUnsafe(params)
new DecisionTableImplementation(tabularTypedData, filterExpression)
val tabularTypedData = BasicDecisionTableParameter.declaration.extractValueUnsafe(params)
val filteringExpression = FilterDecisionTableExpressionParameter.declaration.extractValueUnsafe(params)
new DecisionTableImplementation(tabularTypedData, filteringExpression)
}

private lazy val prepare: ContextTransformationDefinition = { case TransformationStep(Nil, _) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,20 @@ trait GraphBuilder[R] {
new SimpleGraphBuilder(SourceNode(node.Join(id, output, typ, toNodeParameters(params), branchParameters), _))
}

def decisionTable(
decisionTableParamValue: Expression,
filterExpressionParamValue: Expression,
output: String,
): GraphBuilder[R] = {
enricher(
id = "decision-table",
output,
svcId = "decision-table",
"Decision Table" -> decisionTableParamValue,
"Filtering expression" -> filterExpressionParamValue,
)
}

private def toNodeParameters(params: Iterable[(String, Expression)]) = {
params.map { case (name, expr) => NodeParameter(ParameterName(name), expr) }.toList
}
Expand Down

0 comments on commit b7cc9ac

Please sign in to comment.