Skip to content

Commit 81ddd4c

Browse files
committed
[NU-2152] Missing parameters in node are only reported as warnings in logs - no validation error is returned
1 parent 158e201 commit 81ddd4c

File tree

6 files changed

+70
-69
lines changed

6 files changed

+70
-69
lines changed

common-api/src/main/scala/pl/touk/nussknacker/engine/api/parameter/ParameterName.scala

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import io.circe.generic.extras.semiauto.{deriveUnwrappedDecoder, deriveUnwrapped
55

66
final case class ParameterName(value: String) {
77
def withBranchId(branchId: String): ParameterName = ParameterName(s"$value for branch $branchId")
8+
9+
override def toString: String = value
810
}
911

1012
object ParameterName {

designer/client/src/components/graph/node-modal/NodeTypeDetailsContent.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ export function useNodeAdjust() {
5151
const adjustNode = useCallback(
5252
(node: NodeType) => {
5353
const parameterDefinitions = getParameterDefinitions(node);
54-
const { adjustedNode } = adjustParameters(node, parameterDefinitions);
55-
return generateUUIDs(adjustedNode, ["fields", "parameters"]);
54+
// const { adjustedNode } = adjustParameters(node, parameterDefinitions);
55+
return generateUUIDs(node, ["fields", "parameters"]);
5656
},
5757
[getParameterDefinitions],
5858
);

scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/ExpressionCompiler.scala

+5-10
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,14 @@ class ExpressionCompiler(
160160
jobData: JobData
161161
): IorNel[PartSubGraphCompilationError, List[(TypedParameter, Parameter)]] = {
162162

163-
val missingValidation = Validations.validateRedundantAndMissingParameters(
163+
val adjustedParameters = NodeParametersAdjuster.adjustNonBranchParameters(
164164
parameterDefinitions,
165-
nodeParameters ++ nodeBranchParameters.flatMap(_.parameters)
165+
nodeParameters
166166
)
167167
val paramValidatorsMap = parameterValidatorsMap(parameterDefinitions, ctx.globalVariables)
168168
val paramDefMap = parameterDefinitions.map(p => p.name -> p).toMap
169169

170-
val compiledParams = nodeParameters
170+
val compiledParams = adjustedParameters
171171
.flatMap { nodeParam =>
172172
paramDefMap
173173
.get(nodeParam.name)
@@ -186,13 +186,8 @@ class ExpressionCompiler(
186186

187187
for {
188188
compiledParams <- allCompiledParams.toIor
189-
paramsAfterValidation = Validations.validateWithCustomValidators(compiledParams, paramValidatorsMap) match {
190-
case Valid(a) => Ior.right(a)
191-
// We want to preserve typing information from allCompiledParams even if custom validators give us some errors
192-
case Invalid(e) => Ior.both(e, compiledParams)
193-
}
194-
combinedParams <- missingValidation.map(_ => List()).toIor.combine(paramsAfterValidation)
195-
} yield combinedParams
189+
_ <- Validations.validateWithCustomValidators(compiledParams, paramValidatorsMap).toIor
190+
} yield compiledParams
196191
}
197192

198193
private def parameterValidatorsMap(parameterDefinitions: List[Parameter], globalVariables: Map[String, TypingResult])(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package pl.touk.nussknacker.engine.compile
2+
3+
import cats.data.Validated.valid
4+
import cats.implicits.catsSyntaxValidatedId
5+
import com.typesafe.scalalogging.LazyLogging
6+
import pl.touk.nussknacker.engine.api.{JobData, NodeId}
7+
import pl.touk.nussknacker.engine.api.context.ProcessCompilationError.MissingParameters
8+
import pl.touk.nussknacker.engine.api.definition.Parameter
9+
import pl.touk.nussknacker.engine.api.parameter.ParameterName
10+
import pl.touk.nussknacker.engine.graph.evaluatedparam.{Parameter => NodeParameter}
11+
12+
object NodeParametersAdjuster extends LazyLogging {
13+
14+
def adjustNonBranchParameters(parameterDefinitions: List[Parameter], parameters: List[NodeParameter])(
15+
implicit nodeId: NodeId,
16+
jobData: JobData
17+
): List[NodeParameter] = {
18+
val definedParamNamesSet = parameterDefinitions.filter(!_.branchParam).map(_.name).toSet
19+
val usedParamNamesSet = parameters.map(_.name).toSet
20+
21+
checkRedundancyAndWarnIfNeeded(definedParamNamesSet, usedParamNamesSet)
22+
validateMissingness(definedParamNamesSet, usedParamNamesSet)
23+
// FIXME abr
24+
parameters
25+
}
26+
27+
private def checkRedundancyAndWarnIfNeeded(
28+
definedParamNamesSet: Set[ParameterName],
29+
usedParamNamesSet: Set[ParameterName]
30+
)(
31+
implicit nodeId: NodeId,
32+
jobData: JobData
33+
): Unit = {
34+
val redundantParams = usedParamNamesSet.diff(definedParamNamesSet)
35+
if (redundantParams.nonEmpty) {
36+
logger.warn(
37+
s"Scenario [${jobData.metaData.name}] node [$nodeId] compilation warning. " +
38+
s"Found redundant parameters: ${redundantParams.toList.map(_.value).sorted.mkString(", ")}. They will be skipped."
39+
)
40+
}
41+
}
42+
43+
private def validateMissingness(definedParamNamesSet: Set[ParameterName], usedParamNamesSet: Set[ParameterName])(
44+
implicit nodeId: NodeId
45+
) = {
46+
val notUsedParams = definedParamNamesSet.diff(usedParamNamesSet)
47+
if (notUsedParams.nonEmpty) MissingParameters(notUsedParams).invalidNel[Unit] else valid(())
48+
}
49+
50+
}
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,35 @@
11
package pl.touk.nussknacker.engine.compile
22

3-
import cats.data.Validated.valid
4-
import com.typesafe.scalalogging.LazyLogging
5-
import pl.touk.nussknacker.engine.api.{JobData, NodeId}
3+
import cats.data.{NonEmptyList, Validated}
4+
import pl.touk.nussknacker.engine.api.NodeId
65
import pl.touk.nussknacker.engine.api.context._
7-
import pl.touk.nussknacker.engine.api.context.ProcessCompilationError.MissingParameters
86
import pl.touk.nussknacker.engine.api.definition.{Parameter, Validator}
97
import pl.touk.nussknacker.engine.api.parameter.ParameterName
108
import pl.touk.nussknacker.engine.compiledgraph.TypedParameter
119
import pl.touk.nussknacker.engine.expression.parse.{TypedExpression, TypedExpressionMap}
12-
import pl.touk.nussknacker.engine.graph.evaluatedparam.{Parameter => NodeParameter}
1310
import pl.touk.nussknacker.engine.graph.expression.Expression
1411

15-
object Validations extends LazyLogging {
12+
object Validations {
1613

1714
import cats.data.ValidatedNel
1815
import cats.implicits._
1916

20-
def validateRedundantAndMissingParameters(
21-
parameterDefinitions: List[Parameter],
22-
parameters: List[NodeParameter]
23-
)(
24-
implicit nodeId: NodeId,
25-
jobData: JobData
26-
): ValidatedNel[PartSubGraphCompilationError, Unit] = {
27-
val definedParamNamesSet = parameterDefinitions.map(_.name).toSet
28-
val usedParamNamesSet = parameters.map(_.name).toSet
29-
30-
checkRedundancyAndWarnIfNeeded(definedParamNamesSet, usedParamNamesSet)
31-
validateMissingness(definedParamNamesSet, usedParamNamesSet)
32-
}
33-
3417
def validateWithCustomValidators(
3518
parameters: List[(TypedParameter, Parameter)],
3619
paramValidatorsMap: Map[ParameterName, ValidatedNel[PartSubGraphCompilationError, List[Validator]]]
3720
)(
3821
implicit nodeId: NodeId
39-
): ValidatedNel[PartSubGraphCompilationError, List[(TypedParameter, Parameter)]] =
22+
): ValidatedNel[PartSubGraphCompilationError, Unit] =
4023
parameters
4124
.map { case (typedParam, _) =>
4225
paramValidatorsMap(typedParam.name).andThen(validator => validate(validator, typedParam))
4326
}
4427
.sequence
45-
.map(_ => parameters)
46-
47-
private def checkRedundancyAndWarnIfNeeded(
48-
definedParamNamesSet: Set[ParameterName],
49-
usedParamNamesSet: Set[ParameterName]
50-
)(
51-
implicit nodeId: NodeId,
52-
jobData: JobData
53-
): Unit = {
54-
val redundantParams = usedParamNamesSet.diff(definedParamNamesSet)
55-
if (redundantParams.nonEmpty) {
56-
logger.warn(
57-
s"Scenario [${jobData.metaData.name}] node [$nodeId] compilation warning. " +
58-
s"Found redundant parameters: ${redundantParams.toList.map(_.value).sorted.mkString(", ")}. They will be skipped."
59-
)
60-
}
61-
}
62-
63-
private def validateMissingness(definedParamNamesSet: Set[ParameterName], usedParamNamesSet: Set[ParameterName])(
64-
implicit nodeId: NodeId
65-
) = {
66-
val notUsedParams = definedParamNamesSet.diff(usedParamNamesSet)
67-
if (notUsedParams.nonEmpty) MissingParameters(notUsedParams).invalidNel[Unit] else valid(())
68-
}
69-
70-
def validate[T](validators: List[Validator], parameter: (TypedParameter, T))(
71-
implicit nodeId: NodeId
72-
): ValidatedNel[PartSubGraphCompilationError, (TypedParameter, T)] = {
73-
validate(validators, parameter._1).map((_, parameter._2))
74-
}
28+
.map(_ => ())
7529

7630
def validate(validators: List[Validator], parameter: TypedParameter)(
7731
implicit nodeId: NodeId
78-
): ValidatedNel[PartSubGraphCompilationError, TypedParameter] = {
32+
): Validated[NonEmptyList[PartSubGraphCompilationError], Unit] = {
7933
val paramWithValueAndExpressionList = parameter.typedValue match {
8034
case te: TypedExpression => List((parameter.name, te.typingInfo.typingResult.valueOpt, te.expression))
8135
case tem: TypedExpressionMap =>
@@ -95,7 +49,7 @@ object Validations extends LazyLogging {
9549
}
9650
}
9751
.sequence
98-
.map(_ => parameter)
52+
.map(_ => ())
9953
}
10054

10155
}

scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/DynamicNodeValidator.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,7 @@ class DynamicNodeValidator(
195195
validatorsCompilationResult.andThen { validators =>
196196
expressionCompiler
197197
.compileBranchParam(branchParams, branchContexts, parameter)
198-
.map((_, None))
199-
.andThen(Validations.validate(validators, _))
198+
.andThen(typedParam => Validations.validate(validators, typedParam).map(_ => (typedParam, None)))
200199
}
201200
}
202201
} else {
@@ -220,8 +219,9 @@ class DynamicNodeValidator(
220219
validatorsCompilationResult.andThen { validators =>
221220
expressionCompiler
222221
.compileParam(singleParam, ctxToUse, parameter)
223-
.map((_, extraNodeParamOpt))
224-
.andThen(Validations.validate(validators, _))
222+
.andThen(typedParam =>
223+
Validations.validate(validators, typedParam).map(_ => (typedParam, extraNodeParamOpt))
224+
)
225225
}
226226
}
227227
}

0 commit comments

Comments
 (0)