diff --git a/core/src/main/kotlin/com/rapatao/projects/ruleset/engine/context/EvalContext.kt b/core/src/main/kotlin/com/rapatao/projects/ruleset/engine/context/EvalContext.kt index 3e5ad8d..8909a4f 100644 --- a/core/src/main/kotlin/com/rapatao/projects/ruleset/engine/context/EvalContext.kt +++ b/core/src/main/kotlin/com/rapatao/projects/ruleset/engine/context/EvalContext.kt @@ -1,16 +1,28 @@ package com.rapatao.projects.ruleset.engine.context +import com.rapatao.projects.ruleset.engine.Evaluator import com.rapatao.projects.ruleset.engine.types.operators.Operator /** * Represents an evaluation context for processing expressions. */ -fun interface EvalContext { +interface EvalContext { /** - * Process the expression using the given operator + * Processes the expression using the given operator. * - * @return true if the expression is successfully processed, false otherwise + * @param left The left-hand side of the expression. Can be any type. + * @param operator The operator to use for processing the expression. This is an instance of [Operator]. + * @param right The right-hand side of the expression. Can be any type. + * + * @return `true` if the expression is successfully processed, `false` otherwise. */ fun process(left: Any?, operator: Operator, right: Any?): Boolean + + /** + * Returns the Evaluator instance used to build this evaluation context. + * + * @return The Evaluator implementation that was used to create this EvalContext. + */ + fun engine(): Evaluator } diff --git a/graaljs-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/graaljs/GraalJSContext.kt b/graaljs-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/graaljs/GraalJSContext.kt index 4e47b6e..65dcb9b 100644 --- a/graaljs-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/graaljs/GraalJSContext.kt +++ b/graaljs-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/graaljs/GraalJSContext.kt @@ -1,5 +1,6 @@ package com.rapatao.projects.ruleset.engine.evaluator.graaljs +import com.rapatao.projects.ruleset.engine.Evaluator import com.rapatao.projects.ruleset.engine.context.EvalContext import com.rapatao.projects.ruleset.engine.types.operators.Operator import org.graalvm.polyglot.Context @@ -8,9 +9,11 @@ import org.graalvm.polyglot.Context * GraalJSContext is a class that implements the EvalContext interface. * It provides the ability to process expressions using the Graal JS engine. * - * @property context the GraalJS context object. + * @param evaluator the evaluator implementation instance + * @param context the GraalJS context object. */ class GraalJSContext( + private val evaluator: Evaluator, private val context: Context, ) : EvalContext { @@ -18,6 +21,8 @@ class GraalJSContext( return operator.process(this, left, right) } + override fun engine(): Evaluator = evaluator + /** * Return the Graal JS context. * diff --git a/graaljs-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/graaljs/GraalJSEvaluator.kt b/graaljs-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/graaljs/GraalJSEvaluator.kt index ee07362..fae3b0d 100644 --- a/graaljs-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/graaljs/GraalJSEvaluator.kt +++ b/graaljs-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/graaljs/GraalJSEvaluator.kt @@ -49,7 +49,7 @@ open class GraalJSEvaluator( it.getBindings("js"), inputData, ) - block(GraalJSContext(it)) + block(GraalJSContext(this, it)) } private fun createContext(): Context { diff --git a/kotlin-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/kotlin/KotlinContext.kt b/kotlin-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/kotlin/KotlinContext.kt index a72f3c6..1b37252 100644 --- a/kotlin-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/kotlin/KotlinContext.kt +++ b/kotlin-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/kotlin/KotlinContext.kt @@ -1,5 +1,6 @@ package com.rapatao.projects.ruleset.engine.evaluator.kotlin +import com.rapatao.projects.ruleset.engine.Evaluator import com.rapatao.projects.ruleset.engine.context.EvalContext import com.rapatao.projects.ruleset.engine.types.operators.Operator import java.math.BigDecimal @@ -8,9 +9,11 @@ import java.math.BigDecimal * KotlinContext is a class that implements the EvalContext interface. * It provides the ability to process expressions using Kotlin operations. * + * @param evaluator the evaluator implementation instance * @param inputData the map containing the input data to be used during expression evaluation */ class KotlinContext( + private val evaluator: Evaluator, private val inputData: Map ) : EvalContext { @@ -18,6 +21,8 @@ class KotlinContext( return operator.process(this, left.asValue(), right.asValue()) } + override fun engine(): Evaluator = evaluator + private fun Any?.asValue(): Any? { val result = when { this is String && !this.trim().matches(Regex("^\".*\"$")) -> rawValue() diff --git a/kotlin-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/kotlin/KotlinEvaluator.kt b/kotlin-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/kotlin/KotlinEvaluator.kt index 80d89eb..eebd5a0 100644 --- a/kotlin-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/kotlin/KotlinEvaluator.kt +++ b/kotlin-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/kotlin/KotlinEvaluator.kt @@ -28,6 +28,7 @@ open class KotlinEvaluator( override fun call(inputData: Any, block: (context: EvalContext) -> T): T { return block(KotlinContext( + this, mutableMapOf().apply { parseKeys("", inputData) } @@ -63,6 +64,8 @@ open class KotlinEvaluator( val currNode = node.childNode() input.forEach { key, value -> + this["${currNode}${key}"] = value + parseKeys("${currNode}${key}", value) } } @@ -71,6 +74,8 @@ open class KotlinEvaluator( val currNode = node.childNode() input?.javaClass?.kotlin?.memberProperties?.forEach { + this["${currNode}${it.name}"] = it.get(input) + parseKeys("${currNode}${it.name}", it.get(input)) } } diff --git a/rhino-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/rhino/RhinoContext.kt b/rhino-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/rhino/RhinoContext.kt index 6a524a9..5f7c821 100644 --- a/rhino-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/rhino/RhinoContext.kt +++ b/rhino-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/rhino/RhinoContext.kt @@ -1,5 +1,6 @@ package com.rapatao.projects.ruleset.engine.evaluator.rhino +import com.rapatao.projects.ruleset.engine.Evaluator import com.rapatao.projects.ruleset.engine.context.EvalContext import com.rapatao.projects.ruleset.engine.types.operators.Operator import org.mozilla.javascript.Context @@ -9,10 +10,12 @@ import org.mozilla.javascript.ScriptableObject * RhinoContext is a class that implements the EvalContext interface. * It provides the ability to process expressions using the Rhino JavaScript engine. * - * @property context The Rhino Context object. - * @property scope The ScriptableObject representing the scope in which the expressions will be executed. + * @param evaluator the evaluator implementation instance + * @param context The Rhino Context object. + * @param scope The ScriptableObject representing the scope in which the expressions will be executed. */ class RhinoContext( + private val evaluator: Evaluator, private val context: Context, private val scope: ScriptableObject, ) : EvalContext { @@ -20,6 +23,8 @@ class RhinoContext( override fun process(left: Any?, operator: Operator, right: Any?): Boolean = operator.process(this, left, right) + override fun engine(): Evaluator = evaluator + /** * Returns the Rhino context. * diff --git a/rhino-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/rhino/RhinoEvaluator.kt b/rhino-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/rhino/RhinoEvaluator.kt index f126257..6618e72 100644 --- a/rhino-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/rhino/RhinoEvaluator.kt +++ b/rhino-evaluator/src/main/kotlin/com/rapatao/projects/ruleset/engine/evaluator/rhino/RhinoEvaluator.kt @@ -37,7 +37,7 @@ open class RhinoEvaluator( parseParameters(scope, context, inputData) - block(RhinoContext(context, scope)) + block(RhinoContext(this, context, scope)) } }