You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kie.apache.org by ri...@apache.org on 2024/01/31 10:06:35 UTC

(incubator-kie-kogito-runtimes) branch YARD created (now aab2f86060)

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

rikkola pushed a change to branch YARD
in repository https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


      at aab2f86060 yard

This branch includes the following new commits:

     new aab2f86060 yard

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


(incubator-kie-kogito-runtimes) 01/01: yard

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rikkola pushed a commit to branch YARD
in repository https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git

commit aab2f86060527ca75fa99c3ed7cc030cca3e79e5
Author: Toni Rikkola <to...@rikkola.net>
AuthorDate: Mon Jan 29 12:57:19 2024 +0000

    yard
---
 kogito-bom/pom.xml                                 |  22 +++
 kogito-build/kogito-dependencies-bom/pom.xml       |  18 ++
 kogito-build/kogito-kie-bom/pom.xml                |   5 +
 pom.xml                                            |   1 +
 yard/pom.xml                                       |  69 ++++++++
 yard/yard-api/pom.xml                              |  61 +++++++
 .../java/org/kie/yard/api/model/DecisionLogic.java |  31 ++++
 .../java/org/kie/yard/api/model/DecisionTable.java |  70 ++++++++
 .../main/java/org/kie/yard/api/model/Element.java  |  64 +++++++
 .../java/org/kie/yard/api/model/InlineRule.java    |  45 +++++
 .../main/java/org/kie/yard/api/model/Input.java    |  43 +++++
 .../org/kie/yard/api/model/LiteralExpression.java  |  34 ++++
 .../java/org/kie/yard/api/model/Operators.java     |  49 ++++++
 .../src/main/java/org/kie/yard/api/model/Rule.java |  23 +++
 .../org/kie/yard/api/model/RuleDefSerializer.java  |  88 ++++++++++
 .../java/org/kie/yard/api/model/WhenThenRule.java  |  53 ++++++
 .../yard/api/model/WhenThenRuleThenSerializer.java |  56 ++++++
 .../src/main/java/org/kie/yard/api/model/YaRD.java |  82 +++++++++
 yard/yard-api/src/main/resources/YaRD-schema.json  | 157 +++++++++++++++++
 yard/yard-core/pom.xml                             |  75 ++++++++
 .../java/org/kie/yard/core/DTableUnitBuilder.java  | 195 +++++++++++++++++++++
 .../src/main/java/org/kie/yard/core/Firable.java   |  27 +++
 .../kie/yard/core/LiteralExpressionBuilder.java    |  39 +++++
 .../yard/core/LiteralExpressionInterpreter.java    |  73 ++++++++
 .../java/org/kie/yard/core/QuotedExprParsed.java   | 115 ++++++++++++
 .../main/java/org/kie/yard/core/StoreHandle.java   |  69 ++++++++
 .../kie/yard/core/SyntheticRuleUnitWrapper.java    |  39 +++++
 .../java/org/kie/yard/core/YaRDDefinitions.java    |  55 ++++++
 .../main/java/org/kie/yard/core/YaRDParser.java    |  85 +++++++++
 .../kie/yard/core/DomesticPackagePricesTest.java   |  59 +++++++
 .../java/org/kie/yard/core/ExtraCostsTest.java     |  45 +++++
 .../org/kie/yard/core/InsuranceBasePriceTest.java  |  58 ++++++
 .../src/test/java/org/kie/yard/core/TestBase.java  |  35 ++++
 .../src/test/resources/domestic-package-prices.yml |  30 ++++
 yard/yard-core/src/test/resources/extra-costs.yml  |  47 +++++
 .../src/test/resources/insurance-base-price.yml    |  30 ++++
 yard/yard-core/src/test/resources/logback-test.xml |  18 ++
 37 files changed, 2065 insertions(+)

diff --git a/kogito-bom/pom.xml b/kogito-bom/pom.xml
index d916bb9eee..ce84bc6b86 100755
--- a/kogito-bom/pom.xml
+++ b/kogito-bom/pom.xml
@@ -2749,6 +2749,28 @@
         <version>${project.version}</version>
         <classifier>sources</classifier>
       </dependency>
+      <dependency>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>yard-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>yard-api</artifactId>
+        <version>${project.version}</version>
+        <classifier>sources</classifier>
+      </dependency>
+      <dependency>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>yard-core</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>yard-core</artifactId>
+        <version>${project.version}</version>
+        <classifier>sources</classifier>
+      </dependency>
     </dependencies>
 
   </dependencyManagement>
diff --git a/kogito-build/kogito-dependencies-bom/pom.xml b/kogito-build/kogito-dependencies-bom/pom.xml
index 6d38e1aafc..873e2906c0 100644
--- a/kogito-build/kogito-dependencies-bom/pom.xml
+++ b/kogito-build/kogito-dependencies-bom/pom.xml
@@ -132,6 +132,9 @@
     <version.black.ninia>4.2.0</version.black.ninia>
     <version.com.google.guava>32.0.0-jre</version.com.google.guava>
     <version.apache.commons.commons-compress>1.24.0</version.apache.commons.commons-compress>
+    <version.yaml.mapper.common>0.4</version.yaml.mapper.common>
+    <version.yaml.mapper>0.4</version.yaml.mapper>
+    <version.jshell>1.1.0</version.jshell>
   </properties>
 
   <dependencyManagement>
@@ -806,6 +809,21 @@
         <artifactId>jep</artifactId>
         <version>${version.black.ninia}</version>
       </dependency>
+      <dependency>
+        <groupId>org.treblereel.gwt.yaml.mapper</groupId>
+        <artifactId>common</artifactId>
+        <version>${version.yaml.mapper}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.treblereel.gwt.yaml.mapper</groupId>
+        <artifactId>processor</artifactId>
+        <version>${version.yaml.mapper}</version>
+      </dependency>
+      <dependency>
+        <groupId>ch.obermuhlner</groupId>
+        <artifactId>jshell-scriptengine</artifactId>
+        <version>${version.jshell}</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 
diff --git a/kogito-build/kogito-kie-bom/pom.xml b/kogito-build/kogito-kie-bom/pom.xml
index 836f4c4cbd..e6333d4409 100644
--- a/kogito-build/kogito-kie-bom/pom.xml
+++ b/kogito-build/kogito-kie-bom/pom.xml
@@ -185,6 +185,11 @@
         <artifactId>drools-ruleunits-api</artifactId>
         <version>${version.org.kie}</version>
       </dependency>
+      <dependency>
+        <groupId>org.drools</groupId>
+        <artifactId>drools-ruleunits-dsl</artifactId>
+        <version>${version.org.kie}</version>
+      </dependency>
       <dependency>
         <groupId>org.drools</groupId>
         <artifactId>drools-ruleunits-impl</artifactId>
diff --git a/pom.xml b/pom.xml
index fbe18c88c2..4366453db1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -145,6 +145,7 @@
     <module>addons</module>
     <module>kogito-workitems</module>
     <module>kogito-serverless-workflow</module>
+    <module>yard</module>
     <module>kogito-maven-plugin</module>
     <module>springboot</module>
   </modules>
diff --git a/yard/pom.xml b/yard/pom.xml
new file mode 100644
index 0000000000..5799645e5a
--- /dev/null
+++ b/yard/pom.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+
+  <parent>
+    <groupId>org.kie.kogito</groupId>
+    <artifactId>kogito-build-parent</artifactId>
+    <version>999-SNAPSHOT</version>
+    <relativePath>../kogito-build/kogito-build-parent/pom.xml</relativePath>
+  </parent>
+
+  <artifactId>yard</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Kogito :: YARD</name>
+  <description>
+    A simple way to describe declarative Decisions and Rules in YAML.
+  </description>
+
+  <properties>
+    <surefire.forkCount>1</surefire.forkCount>
+    <alphanetworkCompilerEnabled>false</alphanetworkCompilerEnabled>
+  </properties>
+
+  <modules>
+    <module>yard-api</module>
+    <module>yard-core</module>
+  </modules>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <configuration>
+            <forkCount>${surefire.forkCount}</forkCount>
+            <reuseForks>true</reuseForks>
+            <runOrder>hourly</runOrder>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+</project>
diff --git a/yard/yard-api/pom.xml b/yard/yard-api/pom.xml
new file mode 100644
index 0000000000..cf91d94dd2
--- /dev/null
+++ b/yard/yard-api/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>yard</artifactId>
+        <version>999-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>yard-api</artifactId>
+
+    <properties>
+        <java.module.name>org.kie.yard.api</java.module.name>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.kie.kogito</groupId>
+                <artifactId>kogito-kie-bom</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.treblereel.gwt.yaml.mapper</groupId>
+            <artifactId>common</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.treblereel.gwt.yaml.mapper</groupId>
+            <artifactId>processor</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/DecisionLogic.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/DecisionLogic.java
new file mode 100644
index 0000000000..52c622d867
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/DecisionLogic.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import org.treblereel.gwt.yaml.api.annotation.YamlSubtype;
+import org.treblereel.gwt.yaml.api.annotation.YamlTypeInfo;
+
+@YamlTypeInfo(
+        key = "type",
+        value = {
+                @YamlSubtype(alias = "DecisionTable", type = DecisionTable.class),
+                @YamlSubtype(alias = "LiteralExpression", type = LiteralExpression.class)
+        })
+public interface DecisionLogic {
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/DecisionTable.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/DecisionTable.java
new file mode 100644
index 0000000000..b20c96db4b
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/DecisionTable.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import java.util.List;
+
+import org.treblereel.gwt.yaml.api.annotation.YAMLMapper;
+import org.treblereel.gwt.yaml.api.annotation.YamlTypeDeserializer;
+import org.treblereel.gwt.yaml.api.annotation.YamlTypeSerializer;
+
+@YAMLMapper
+public class DecisionTable implements DecisionLogic {
+    private List<String> inputs;
+    private String hitPolicy = "ANY";
+    @Deprecated
+    private List<String> outputComponents;
+    @YamlTypeSerializer(RuleDefSerializer.class)
+    @YamlTypeDeserializer(RuleDefSerializer.class)
+    private List rules;
+
+    public void setInputs(List<String> inputs) {
+        this.inputs = inputs;
+    }
+
+    public void setOutputComponents(List<String> outputComponents) {
+        this.outputComponents = outputComponents;
+    }
+
+    public List<String> getInputs() {
+        return inputs;
+    }
+
+    @Deprecated
+    public List<String> getOutputComponents() {
+        return outputComponents;
+    }
+
+    public String getHitPolicy() {
+        return hitPolicy;
+    }
+
+    public void setHitPolicy(String hitPolicy) {
+        this.hitPolicy = hitPolicy;
+    }
+
+    public List getRules() {
+        return rules;
+    }
+
+    public void setRules(List rules) {
+        this.rules = rules;
+    }
+
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/Element.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/Element.java
new file mode 100644
index 0000000000..910003090c
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/Element.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import java.util.List;
+
+import org.treblereel.gwt.yaml.api.annotation.YAMLMapper;
+
+@YAMLMapper
+public class Element {
+
+    private String name;
+    private String type;
+    private List<String> requirements;
+    private DecisionLogic logic;
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public void setRequirements(List<String> requirements) {
+        this.requirements = requirements;
+    }
+
+    public void setLogic(DecisionLogic logic) {
+        this.logic = logic;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public List<String> getRequirements() {
+        return requirements;
+    }
+
+    public DecisionLogic getLogic() {
+        return logic;
+    }
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/InlineRule.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/InlineRule.java
new file mode 100644
index 0000000000..330273bc69
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/InlineRule.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import java.util.List;
+
+public class InlineRule implements Rule {
+
+    private final int rowNumber;
+    public List def;
+
+    public InlineRule(int rowNumber, List data) {
+        this.rowNumber = rowNumber;
+        this.def = data;
+    }
+
+    @Override
+    public int getRowNumber() {
+        return rowNumber;
+    }
+
+    public List getDef() {
+        return def;
+    }
+
+    public void setDef(List def) {
+        this.def = def;
+    }
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/Input.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/Input.java
new file mode 100644
index 0000000000..8b9862f2c4
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/Input.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import org.treblereel.gwt.yaml.api.annotation.YAMLMapper;
+
+@YAMLMapper
+public class Input {
+    private String name;
+    private String type;
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getType() {
+        return type;
+    }
+}
\ No newline at end of file
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/LiteralExpression.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/LiteralExpression.java
new file mode 100644
index 0000000000..7a1ce500c7
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/LiteralExpression.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import org.treblereel.gwt.yaml.api.annotation.YAMLMapper;
+
+@YAMLMapper
+public class LiteralExpression implements DecisionLogic {
+    private String expression;
+
+    public void setExpression(String expression) {
+        this.expression = expression;
+    }
+
+    public String getExpression() {
+        return expression;
+    }
+}
\ No newline at end of file
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/Operators.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/Operators.java
new file mode 100644
index 0000000000..56e20b1878
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/Operators.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import java.util.Objects;
+
+/**
+ * Interface instead of enum due to possible custom operators.
+ */
+public interface Operators {
+    String NOT_EQUALS = "!=";
+    String EQUALS = "=";
+    String GREATER_OR_EQUAL = ">=";
+    String GREATER_THAN = ">";
+    String LESS_OR_EQUAL = "<=";
+    String LESS_THAN = "<";
+
+    String[] ALL = { EQUALS, LESS_OR_EQUAL, LESS_THAN, GREATER_OR_EQUAL, GREATER_THAN, NOT_EQUALS };
+
+    static int compare(final String operator,
+            final String other) {
+        return getWeight(operator) - getWeight(other);
+    }
+
+    static int getWeight(final String operator) {
+        for (int i = 0; i < ALL.length; i++) {
+            if (Objects.equals(operator, ALL[i])) {
+                return i;
+            }
+        }
+        return 0;
+    }
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/Rule.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/Rule.java
new file mode 100644
index 0000000000..5dd5d380fb
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/Rule.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+public interface Rule {
+    int getRowNumber();
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/RuleDefSerializer.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/RuleDefSerializer.java
new file mode 100644
index 0000000000..0304c2622d
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/RuleDefSerializer.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.treblereel.gwt.yaml.api.YAMLDeserializer;
+import org.treblereel.gwt.yaml.api.YAMLSerializer;
+import org.treblereel.gwt.yaml.api.exception.YAMLDeserializationException;
+import org.treblereel.gwt.yaml.api.internal.deser.YAMLDeserializationContext;
+import org.treblereel.gwt.yaml.api.internal.ser.YAMLSerializationContext;
+import org.treblereel.gwt.yaml.api.node.YamlMapping;
+import org.treblereel.gwt.yaml.api.node.YamlNode;
+import org.treblereel.gwt.yaml.api.node.YamlSequence;
+
+public class RuleDefSerializer
+        implements YAMLSerializer<Object>, YAMLDeserializer<Object> {
+
+    private int rowNumber = 1;
+
+    @Override
+    public Object deserialize(YamlMapping yamlMapping,
+            String s,
+            YAMLDeserializationContext yamlDeserializationContext) throws YAMLDeserializationException {
+        return deserialize(yamlMapping.getNode(s), yamlDeserializationContext);
+    }
+
+    @Override
+    public Object deserialize(YamlNode yamlNode,
+            YAMLDeserializationContext yamlDeserializationContext) {
+        if (yamlNode instanceof YamlSequence) {
+            final List<Comparable> items = getItems(yamlNode);
+            return new InlineRule(rowNumber++, items);
+
+        } else if (yamlNode instanceof YamlMapping) {
+            final WhenThenRule whenThenRule = new WhenThenRule(rowNumber++);
+            final YamlNode when = ((YamlMapping) yamlNode).getNode("when");
+            final YamlNode then = ((YamlMapping) yamlNode).getNode("then");
+            whenThenRule.setWhen(getItems(when));
+            whenThenRule.setThen(then.asScalar().value());
+            return whenThenRule;
+        }
+        return new IllegalArgumentException("Unknown rule format.");
+    }
+
+    private List<Comparable> getItems(final YamlNode yamlNode) {
+        final List<Comparable> result = new ArrayList<>();
+        if (yamlNode instanceof YamlSequence) {
+            ((YamlSequence) yamlNode).iterator().forEachRemaining(x -> {
+                final Comparable value = (Comparable) x.asScalar().value();
+                result.add(value);
+            });
+        }
+        return result;
+    }
+
+    @Override
+    public void serialize(YamlMapping yamlMapping,
+            String s,
+            Object objects,
+            YAMLSerializationContext yamlSerializationContext) {
+        // Not needed, we never serialize.
+    }
+
+    @Override
+    public void serialize(YamlSequence yamlSequence,
+            Object objects,
+            YAMLSerializationContext yamlSerializationContext) {
+        // Not needed, we never serialize.
+    }
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/WhenThenRule.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/WhenThenRule.java
new file mode 100644
index 0000000000..bcd9f1aa04
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/WhenThenRule.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import java.util.List;
+
+public class WhenThenRule implements Rule {
+
+    private final int rowNumber;
+    private List when;
+    private Object then;
+
+    public WhenThenRule(int rowNumber) {
+        this.rowNumber = rowNumber;
+    }
+
+    @Override
+    public int getRowNumber() {
+        return rowNumber;
+    }
+
+    public List getWhen() {
+        return when;
+    }
+
+    public Object getThen() {
+        return then;
+    }
+
+    public void setWhen(List when) {
+        this.when = when;
+    }
+
+    public void setThen(Object then) {
+        this.then = then;
+    }
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/WhenThenRuleThenSerializer.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/WhenThenRuleThenSerializer.java
new file mode 100644
index 0000000000..2ea51743fb
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/WhenThenRuleThenSerializer.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import java.util.Locale;
+
+import org.treblereel.gwt.yaml.api.YAMLDeserializer;
+import org.treblereel.gwt.yaml.api.YAMLSerializer;
+import org.treblereel.gwt.yaml.api.exception.YAMLDeserializationException;
+import org.treblereel.gwt.yaml.api.internal.deser.YAMLDeserializationContext;
+import org.treblereel.gwt.yaml.api.internal.ser.YAMLSerializationContext;
+import org.treblereel.gwt.yaml.api.node.YamlMapping;
+import org.treblereel.gwt.yaml.api.node.YamlNode;
+import org.treblereel.gwt.yaml.api.node.YamlSequence;
+
+public class WhenThenRuleThenSerializer
+        implements YAMLSerializer<Object>, YAMLDeserializer<Object> {
+    @Override
+    public Object deserialize(YamlMapping yamlMapping, String key, YAMLDeserializationContext yamlDeserializationContext) throws YAMLDeserializationException {
+        return deserialize(yamlMapping.getNode(key), yamlDeserializationContext);
+    }
+
+    @Override
+    public Object deserialize(YamlNode yamlNode, YAMLDeserializationContext yamlDeserializationContext) {
+        if (yamlNode == null || yamlNode.isEmpty()) {
+            return null;
+        }
+        return yamlNode.<String> asScalar().value().toLowerCase(Locale.ROOT);
+    }
+
+    @Override
+    public void serialize(YamlMapping yamlMapping, String s, Object o, YAMLSerializationContext yamlSerializationContext) {
+        // Not needed, we never serialize.
+    }
+
+    @Override
+    public void serialize(YamlSequence yamlSequence, Object o, YAMLSerializationContext yamlSerializationContext) {
+        // Not needed, we never serialize.
+    }
+}
diff --git a/yard/yard-api/src/main/java/org/kie/yard/api/model/YaRD.java b/yard/yard-api/src/main/java/org/kie/yard/api/model/YaRD.java
new file mode 100644
index 0000000000..3d2d4fe1f7
--- /dev/null
+++ b/yard/yard-api/src/main/java/org/kie/yard/api/model/YaRD.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.api.model;
+
+import java.util.List;
+
+import org.treblereel.gwt.yaml.api.annotation.YAMLMapper;
+
+@YAMLMapper
+public class YaRD {
+
+    private String specVersion = "alpha";
+    private String kind = "YaRD";
+    private String name;
+    private String expressionLang;
+    private List<Input> inputs;
+    private List<Element> elements;
+
+    public void setInputs(List<Input> inputs) {
+        this.inputs = inputs;
+    }
+
+    public void setElements(List<Element> elements) {
+        this.elements = elements;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getExpressionLang() {
+        return expressionLang;
+    }
+
+    public void setExpressionLang(String expressionLang) {
+        this.expressionLang = expressionLang;
+    }
+
+    public String getKind() {
+        return kind;
+    }
+
+    public void setKind(String kind) {
+        this.kind = kind;
+    }
+
+    public String getSpecVersion() {
+        return specVersion;
+    }
+
+    public void setSpecVersion(String specVersion) {
+        this.specVersion = specVersion;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<Input> getInputs() {
+        return inputs;
+    }
+
+    public List<Element> getElements() {
+        return elements;
+    }
+}
diff --git a/yard/yard-api/src/main/resources/YaRD-schema.json b/yard/yard-api/src/main/resources/YaRD-schema.json
new file mode 100644
index 0000000000..ef5cd6d91c
--- /dev/null
+++ b/yard/yard-api/src/main/resources/YaRD-schema.json
@@ -0,0 +1,157 @@
+{
+  "$schema" : "http://json-schema.org/draft-07/schema#",
+  "definitions" : {
+    "DecisionTable-1" : {
+      "type" : "object",
+      "properties" : {
+        "inputs" : {
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        },
+        "hitPolicy" : {
+          "type" : "string",
+          "default" : "ANY"
+        },
+        "rules" : {
+          "type" : "array",
+          "items" : {
+            "anyOf" : [ {
+              "$ref" : "#/definitions/InlineRule"
+            }, {
+              "$ref" : "#/definitions/WhenThenRule"
+            } ]
+          }
+        },
+        "outputComponents" : {
+          "description" : "deprecated",
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        }
+      },
+      "required" : [ "inputs", "rules" ]
+    },
+    "DecisionTable-2" : {
+      "allOf" : [ {
+        "$ref" : "#/definitions/DecisionTable-1"
+      }, {
+        "type" : "object",
+        "properties" : {
+          "type" : {
+            "const" : "DecisionTable"
+          }
+        },
+        "required" : [ "type" ]
+      } ]
+    },
+    "Element" : {
+      "type" : "object",
+      "properties" : {
+        "name" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        },
+        "requirements" : {
+          "type" : "array",
+          "items" : {
+            "type" : "string"
+          }
+        },
+        "logic" : {
+          "anyOf" : [ {
+            "$ref" : "#/definitions/DecisionTable-2"
+          }, {
+            "$ref" : "#/definitions/LiteralExpression-2"
+          } ]
+        }
+      },
+      "required" : [ "name", "type", "logic" ]
+    },
+    "InlineRule" : {
+      "type" : "array",
+      "items" : { }
+    },
+    "Input" : {
+      "type" : "object",
+      "properties" : {
+        "name" : {
+          "type" : "string"
+        },
+        "type" : {
+          "type" : "string"
+        }
+      },
+      "required" : [ "name", "type" ]
+    },
+    "LiteralExpression-1" : {
+      "type" : "object",
+      "properties" : {
+        "expression" : {
+          "type" : "string"
+        }
+      },
+      "required" : [ "expression" ]
+    },
+    "LiteralExpression-2" : {
+      "allOf" : [ {
+        "$ref" : "#/definitions/LiteralExpression-1"
+      }, {
+        "type" : "object",
+        "properties" : {
+          "type" : {
+            "const" : "LiteralExpression"
+          }
+        },
+        "required" : [ "type" ]
+      } ]
+    },
+    "WhenThenRule" : {
+      "type" : "object",
+      "properties" : {
+        "when" : {
+          "type" : "array",
+          "items" : { }
+        },
+        "then" : { }
+      },
+      "required" : [ "when", "then" ]
+    }
+  },
+  "type" : "object",
+  "properties" : {
+    "specVersion" : {
+      "type" : "string",
+      "default" : "alpha"
+    },
+    "kind" : {
+      "type" : "string",
+      "default" : "YaRD"
+    },
+    "name" : {
+      "type" : "string",
+      "description" : "when not provided explicitly, implementation will attempt to deduce the name from the runtime context; if a name cannot be deduced it is an error."
+    },
+    "expressionLang" : {
+      "type" : "string",
+      "description" : "An implementation is free to assume a default expressionLang if not explicitly set. For the purpose of a User sharing a YaRD definition, is best to valorise this field explicit."
+    },
+    "inputs" : {
+      "type" : "array",
+      "items" : {
+        "$ref" : "#/definitions/Input"
+      }
+    },
+    "elements" : {
+      "type" : "array",
+      "items" : {
+        "$ref" : "#/definitions/Element"
+      }
+    }
+  },
+  "required" : [ "inputs", "elements" ]
+}
\ No newline at end of file
diff --git a/yard/yard-core/pom.xml b/yard/yard-core/pom.xml
new file mode 100644
index 0000000000..009d9e89a1
--- /dev/null
+++ b/yard/yard-core/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>yard</artifactId>
+        <version>999-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>yard-core</artifactId>
+
+    <properties>
+        <java.module.name>org.kie.yard.core</java.module.name>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.kie.kogito</groupId>
+                <artifactId>kogito-kie-bom</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.kie.kogito</groupId>
+            <artifactId>yard-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-canonical-model</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-ruleunits-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-ruleunits-dsl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.treblereel.gwt.yaml.mapper</groupId>
+            <artifactId>common</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.obermuhlner</groupId>
+            <artifactId>jshell-scriptengine</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-yaml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/DTableUnitBuilder.java b/yard/yard-core/src/main/java/org/kie/yard/core/DTableUnitBuilder.java
new file mode 100644
index 0000000000..9036b66310
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/DTableUnitBuilder.java
@@ -0,0 +1,195 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.drools.model.Index;
+import org.drools.ruleunits.api.SingletonStore;
+import org.drools.ruleunits.dsl.SyntheticRuleUnit;
+import org.drools.ruleunits.dsl.SyntheticRuleUnitBuilder;
+import org.kie.yard.api.model.InlineRule;
+import org.kie.yard.api.model.Rule;
+import org.kie.yard.api.model.WhenThenRule;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.json.JsonMapper;
+
+public class DTableUnitBuilder {
+    private final YaRDDefinitions definitions;
+    private final String name;
+    private final OnExecute executionAction;
+    private final List<Rule> rules;
+    private final List<String> inputs;
+    private JsonMapper jsonMapper = JsonMapper.builder().build();
+
+    public DTableUnitBuilder(final YaRDDefinitions definitions,
+            final String name,
+            final org.kie.yard.api.model.DecisionTable dtableDefinition) {
+        this.inputs = dtableDefinition.getInputs();
+        if (inputs.isEmpty()) {
+            throw new IllegalStateException("Empty decision table?");
+        }
+        this.definitions = definitions;
+        this.name = name;
+        this.rules = dtableDefinition.getRules();
+        this.executionAction = getExecutionAction(dtableDefinition.getHitPolicy());
+    }
+
+    public SyntheticRuleUnit build() {
+
+        final SyntheticRuleUnitBuilder unit = SyntheticRuleUnitBuilder.build(name); // TODO ensure unique key
+        for (Map.Entry<String, SingletonStore<Object>> e : definitions.inputs().entrySet()) {
+            unit.registerDataSource(e.getKey(), e.getValue(), Object.class);
+        }
+        final StoreHandle<Object> result = StoreHandle.empty(Object.class);
+        unit.registerGlobal(name, result);
+        definitions.outputs().put(name, result);
+        return unit.defineRules(rulesFactory -> {
+            for (Rule ruleDefinition : rules) {
+                var rule = rulesFactory.rule();
+                for (int idx = 0; idx < inputs.size(); idx++) {
+                    final RuleCell ruleCell = parseGenericRuleCell(ruleDefinition, idx);
+                    if (ruleCell.value != null) {
+                        final SingletonStore<Object> dataSource = definitions.inputs().get(inputs.get(idx));
+
+                        rule.on(dataSource).filter(ruleCell.idxtype, ruleCell.value);
+                    }
+                }
+                rule.execute(result, storeHandle -> executionAction.onExecute(ruleDefinition, storeHandle));
+            }
+        });
+    }
+
+    private OnExecute getExecutionAction(String hitPolicy) {
+        if (hitPolicy == null || Objects.equals("ANY", hitPolicy)) {
+            return (ruleDefinition, storeHandle) -> {
+                final RuleCell rc = parseGenericRuleThen(ruleDefinition);
+                storeHandle.set(rc.value);
+            };
+        } else if (Objects.equals("FIRST", hitPolicy)) {
+            return (ruleDefinition, storeHandle) -> {
+                if (!storeHandle.isValuePresent()) {
+                    final RuleCell rc = parseGenericRuleThen(ruleDefinition);
+                    storeHandle.set(rc.value);
+                }
+            };
+        } else if (Objects.equals("COLLECT", hitPolicy)) {
+            return (ruleDefinition, storeHandle) -> {
+                if (!storeHandle.isValuePresent()) {
+                    storeHandle.set(new ArrayList<>());
+                }
+                final RuleCell rc = parseGenericRuleThen(ruleDefinition);
+
+                if (storeHandle.get() instanceof List list) {
+                    list.add(resolveValue(rc));
+                }
+
+            };
+        } else {
+            throw new UnsupportedOperationException("Not implemented ");
+        }
+    }
+
+    private Object resolveValue(final RuleCell rc) {
+        try {
+            if (rc.value instanceof String text) {
+                return jsonMapper.readValue(text, Map.class);
+            }
+        } catch (JsonProcessingException ignored) {
+        }
+        return rc.value;
+    }
+
+    private RuleCell parseGenericRuleThen(Rule rule) {
+        if (rule instanceof InlineRule inlineRule) {
+            return parseRuleCell(inlineRule.getDef().get(inlineRule.getDef().size() - 1));
+        } else if (rule instanceof WhenThenRule whenThenRule) {
+            return parseRuleCell((whenThenRule).getThen());
+        } else {
+            throw new IllegalStateException("Unknown or unmanaged rule instance type?");
+        }
+    }
+
+    private RuleCell parseGenericRuleCell(Rule rule, int i) {
+        if (rule instanceof InlineRule inlineRule) {
+            return parseRuleCell((inlineRule).getDef().get(i));
+        } else if (rule instanceof WhenThenRule whenThenRule) {
+            return parseRuleCell((whenThenRule).getWhen().get(i));
+        } else {
+            throw new IllegalStateException("Unknown or unmanaged rule instance type?");
+        }
+    }
+
+    private RuleCell parseRuleCell(Object object) {
+        if (object instanceof Boolean) {
+            return new RuleCell(Index.ConstraintType.EQUAL, object);
+        } else if (object instanceof Number) {
+            return new RuleCell(Index.ConstraintType.EQUAL, object);
+        } else if (object instanceof String valueString) {
+            if (valueString.startsWith("<=")) { // pay attention to ordering when not using a parser like in this case.
+                return new RuleCell(Index.ConstraintType.LESS_OR_EQUAL, parseConstrainedCellString(valueString.substring(2)));
+            } else if (valueString.startsWith(">=")) {
+                return new RuleCell(Index.ConstraintType.GREATER_OR_EQUAL, parseConstrainedCellString(valueString.substring(2)));
+            } else if (valueString.startsWith("<")) {
+                return new RuleCell(Index.ConstraintType.LESS_THAN, parseConstrainedCellString(valueString.substring(1)));
+            } else if (valueString.startsWith(">")) {
+                return new RuleCell(Index.ConstraintType.GREATER_THAN, parseConstrainedCellString(valueString.substring(1)));
+            } else {
+                return new RuleCell(Index.ConstraintType.EQUAL, parseConstrainedCellString(valueString));
+            }
+        } else {
+            throw new IllegalStateException("Unmanaged case, please report!");
+        }
+    }
+
+    private Object parseConstrainedCellString(String substring) {
+        if (Objects.equals("true", substring.trim().toLowerCase())) {
+            return true;
+        }
+        if (Objects.equals("false", substring.trim().toLowerCase())) {
+            return false;
+        }
+        try {
+            return Integer.parseInt(substring.trim());
+        } catch (Exception e) {
+
+        }
+        try {
+            return Long.parseLong(substring.trim());
+        } catch (Exception e) {
+
+        }
+        if (Objects.equals("-", substring.trim())) {
+            return null; // TODO while this was the way in DMN, should we go with the same now. What if you need to use - the character?
+        }
+        return substring;
+    }
+
+    private interface OnExecute {
+        void onExecute(Rule ruleDefinition, StoreHandle<Object> storeHandle);
+    }
+
+    public static record RuleCell(Index.ConstraintType idxtype, Object value) {
+    }
+
+}
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/Firable.java b/yard/yard-core/src/main/java/org/kie/yard/core/Firable.java
new file mode 100644
index 0000000000..52b4da9940
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/Firable.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.Map;
+
+public interface Firable {
+
+    int fire(Map<String, Object> context, YaRDDefinitions units);
+
+}
\ No newline at end of file
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/LiteralExpressionBuilder.java b/yard/yard-core/src/main/java/org/kie/yard/core/LiteralExpressionBuilder.java
new file mode 100644
index 0000000000..508a23b041
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/LiteralExpressionBuilder.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import org.kie.yard.api.model.LiteralExpression;
+
+public class LiteralExpressionBuilder {
+    private final YaRDDefinitions definitions;
+    private final String name;
+    private final LiteralExpression decisionLogic;
+
+    public LiteralExpressionBuilder(YaRDDefinitions definitions, String name, LiteralExpression decisionLogic) {
+        this.definitions = definitions;
+        this.name = name;
+        this.decisionLogic = decisionLogic;
+    }
+
+    public Firable build() {
+        String expr = decisionLogic.getExpression();
+        definitions.outputs().put(name, StoreHandle.empty(Object.class));
+        return new LiteralExpressionInterpreter(name, QuotedExprParsed.from(expr));
+    }
+}
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/LiteralExpressionInterpreter.java b/yard/yard-core/src/main/java/org/kie/yard/core/LiteralExpressionInterpreter.java
new file mode 100644
index 0000000000..f973ea6e0b
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/LiteralExpressionInterpreter.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.script.Bindings;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+
+public class LiteralExpressionInterpreter implements Firable {
+    private final String name;
+    private final QuotedExprParsed quoted;
+    private final ScriptEngine engine;
+    private final CompiledScript compiledScript;
+
+    public LiteralExpressionInterpreter(String nameString, QuotedExprParsed quotedExprParsed) {
+        this.name = nameString;
+        this.quoted = quotedExprParsed;
+        try {
+            ScriptEngineManager manager = new ScriptEngineManager();
+            engine = manager.getEngineByName("jshell");
+            Compilable compiler = (Compilable) engine;
+            compiledScript = compiler.compile(quoted.getRewrittenExpression());
+        } catch (Exception e) {
+            throw new IllegalArgumentException("parse error", e);
+        }
+    }
+
+    @Override
+    public int fire(Map<String, Object> context, YaRDDefinitions units) {
+        Bindings bindings = engine.createBindings();
+        // deliberately escape all symbols; a normal symbol will
+        // never be in the detected-by-unquoting set, so this
+        // set can't be used to selectively put in scope
+        for (Entry<String, Object> inKV : context.entrySet()) {
+            bindings.put(QuotedExprParsed.escapeIdentifier(inKV.getKey()), inKV.getValue());
+        }
+        for (Entry<String, StoreHandle<Object>> outKV : units.outputs().entrySet()) {
+            if (!outKV.getValue().isValuePresent()) {
+                continue;
+            }
+            bindings.put(QuotedExprParsed.escapeIdentifier(outKV.getKey()), outKV.getValue().get());
+        }
+        try {
+            var result = compiledScript.eval(bindings);
+            units.outputs().get(name).set(result);
+            return 1;
+        } catch (ScriptException e) {
+            throw new RuntimeException("interpretation failed at runtime", e);
+        }
+    }
+}
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/QuotedExprParsed.java b/yard/yard-core/src/main/java/org/kie/yard/core/QuotedExprParsed.java
new file mode 100644
index 0000000000..593190ae69
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/QuotedExprParsed.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.PrimitiveIterator.OfInt;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.lang.model.SourceVersion;
+
+public class QuotedExprParsed {
+    private static final int ESCAPE_CHAR = "`".codePointAt(0);
+
+    private final Set<String> usedSymbols;
+    private final String rewrittenExpression;
+
+    private QuotedExprParsed(List<String> usedSymbols, String rewrittenExpression) {
+        this.usedSymbols = usedSymbols.stream().collect(Collectors.toUnmodifiableSet());
+        this.rewrittenExpression = rewrittenExpression;
+    }
+
+    public String getRewrittenExpression() {
+        return rewrittenExpression;
+    }
+
+    public Collection<String> getUsedSymbols() {
+        return usedSymbols;
+    }
+
+    public static QuotedExprParsed from(String expr) {
+        StringBuilder rewittenExpr = new StringBuilder();
+        StringBuilder quotedBuffer = new StringBuilder();
+        // TODO consider including scope so to check the symbols are present
+        List<String> usedSymbols = new ArrayList<>();
+        OfInt it = expr.codePoints().iterator();
+        State state = State.UNQUOTED;
+        while (it.hasNext()) {
+            int c = it.nextInt();
+            if (c == ESCAPE_CHAR) {
+                switch (state) {
+                    case UNQUOTED:
+                        state = State.QUOTED;
+                        break;
+                    case QUOTED:
+                        state = State.UNQUOTED;
+                        var originalSymbol = quotedBuffer.toString();
+                        usedSymbols.add(originalSymbol);
+                        var escaped = escapeIdentifier(originalSymbol);
+                        rewittenExpr.append(escaped);
+                        quotedBuffer = new StringBuilder();
+                        break;
+                    default:
+                        throw new IllegalStateException();
+                }
+            } else {
+                switch (state) {
+                    case UNQUOTED:
+                        rewittenExpr.appendCodePoint(c);
+                        break;
+                    case QUOTED:
+                        quotedBuffer.appendCodePoint(c);
+                        break;
+                    default:
+                        throw new IllegalStateException();
+                }
+            }
+        }
+        return new QuotedExprParsed(usedSymbols, rewittenExpr.toString());
+    }
+
+    private static enum State {
+        UNQUOTED,
+        QUOTED
+    }
+
+    public static String escapeIdentifier(String partOfIdentifier) {
+        String id = partOfIdentifier;
+        if (!Character.isJavaIdentifierStart(id.charAt(0))) {
+            id = "_" + id;
+        }
+        id = id.replaceAll("_", "__");
+        if (SourceVersion.isKeyword(id)) {
+            id = "_" + id;
+        }
+        StringBuilder result = new StringBuilder();
+        char[] cs = id.toCharArray();
+        for (char c : cs) {
+            if (Character.isJavaIdentifierPart(c)) {
+                result.append(c);
+            } else {
+                result.append("_" + Integer.valueOf(c));
+            }
+        }
+        return result.toString();
+    }
+}
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/StoreHandle.java b/yard/yard-core/src/main/java/org/kie/yard/core/StoreHandle.java
new file mode 100644
index 0000000000..ece69d7b73
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/StoreHandle.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import org.drools.ruleunits.api.DataHandle;
+import org.drools.ruleunits.api.DataSource;
+import org.drools.ruleunits.api.SingletonStore;
+
+public class StoreHandle<T> {
+    private SingletonStore<T> wrapped;
+    private DataHandle datahandle;
+
+    private StoreHandle(T value) {
+        wrapped = DataSource.createSingleton();
+        datahandle = wrapped.set(value);
+    }
+
+    private StoreHandle() {
+        wrapped = DataSource.createSingleton();
+        datahandle = null;
+    }
+
+    public static <T> StoreHandle<T> of(T value) {
+        return new StoreHandle<>(value);
+    }
+
+    public static <T> StoreHandle<T> empty(Class<T> type) {
+        return new StoreHandle<>();
+    }
+
+    public DataHandle set(T value) {
+        datahandle = wrapped.set(value);
+        return datahandle;
+    }
+
+    public void clear() {
+        datahandle = null;
+        wrapped.clear();
+    }
+
+    public boolean isValuePresent() {
+        return !(datahandle == null);
+    }
+
+    public T get() {
+        if (datahandle == null) {
+            throw new IllegalStateException("was never set");
+        }
+        @SuppressWarnings("unchecked")
+        T result = (T) datahandle.getObject();
+        return result;
+    }
+}
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/SyntheticRuleUnitWrapper.java b/yard/yard-core/src/main/java/org/kie/yard/core/SyntheticRuleUnitWrapper.java
new file mode 100644
index 0000000000..60f5e39df6
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/SyntheticRuleUnitWrapper.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.Map;
+
+import org.drools.ruleunits.api.RuleUnitInstance;
+import org.drools.ruleunits.api.RuleUnitProvider;
+import org.drools.ruleunits.dsl.SyntheticRuleUnit;
+
+public class SyntheticRuleUnitWrapper implements Firable {
+    private final SyntheticRuleUnit wrapped;
+
+    public SyntheticRuleUnitWrapper(SyntheticRuleUnit wrapped) {
+        this.wrapped = wrapped;
+    }
+
+    @Override
+    public int fire(Map<String, Object> context, YaRDDefinitions units) {
+        RuleUnitInstance<SyntheticRuleUnit> unitInstance = RuleUnitProvider.get().createRuleUnitInstance(wrapped);
+        return unitInstance.fire();
+    }
+}
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/YaRDDefinitions.java b/yard/yard-core/src/main/java/org/kie/yard/core/YaRDDefinitions.java
new file mode 100644
index 0000000000..f683affa88
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/YaRDDefinitions.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.ruleunits.api.SingletonStore;
+
+public record YaRDDefinitions(Map<String, SingletonStore<Object>> inputs, List<Firable> units, Map<String, StoreHandle<Object>> outputs) {
+
+    public Map<String, Object> evaluate(Map<String, Object> context) {
+        Map<String, Object> results = new LinkedHashMap<>(context);
+        for (String inputKey : inputs.keySet()) {
+            if (!context.containsKey(inputKey)) {
+                throw new IllegalArgumentException("Missing input key in context: " + inputKey);
+            }
+            Object inputValue = context.get(inputKey);
+            inputs.get(inputKey).set(inputValue);
+        }
+        context.put("gg", 10);
+        for (Firable unit : units) {
+            unit.fire(context, this);
+        }
+        for (Entry<String, StoreHandle<Object>> outputSets : outputs.entrySet()) {
+            results.put(outputSets.getKey(), outputSets.getValue().get());
+        }
+        reset();
+        return results;
+    }
+
+    // TODO to be revised for better concern separation
+    private void reset() {
+        inputs.forEach((k, v) -> v.clear());
+        outputs.forEach((k, v) -> v.clear());
+    }
+}
diff --git a/yard/yard-core/src/main/java/org/kie/yard/core/YaRDParser.java b/yard/yard-core/src/main/java/org/kie/yard/core/YaRDParser.java
new file mode 100644
index 0000000000..0e6ca66390
--- /dev/null
+++ b/yard/yard-core/src/main/java/org/kie/yard/core/YaRDParser.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.drools.ruleunits.api.DataSource;
+import org.kie.yard.api.model.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class YaRDParser {
+    private static final Logger LOG = LoggerFactory.getLogger(YaRDParser.class);
+    private final YaRDDefinitions definitions = new YaRDDefinitions(new HashMap<>(), new ArrayList<>(), new HashMap<>());
+
+    public YaRDParser() {
+    }
+
+    public YaRDDefinitions parse(String yaml) throws Exception {
+        final YaRD sd = new YaRD_YamlMapperImpl().read(yaml);
+        if (!sd.getExpressionLang().equals("jshell")) {
+            // TODO default to something, but what?
+            throw new IllegalArgumentException("Only `jshell` is supported as an expression language");
+        }
+        appendInputs(sd.getInputs());
+        appendUnits(sd.getElements());
+        return definitions;
+    }
+
+    private void appendUnits(List<Element> list) {
+        for (Element hi : list) {
+            String nameString = hi.getName();
+            LOG.debug("parsing {}", nameString);
+            Firable decisionLogic = createDecisionLogic(nameString, hi.getLogic());
+            definitions.units().add(decisionLogic);
+        }
+    }
+
+    private Firable createDecisionLogic(String nameString, DecisionLogic decisionLogic) {
+        if (decisionLogic instanceof org.kie.yard.api.model.DecisionTable decisionTable) {
+            return new SyntheticRuleUnitWrapper(new DTableUnitBuilder(definitions, nameString, decisionTable).build());
+        } else if (decisionLogic instanceof org.kie.yard.api.model.LiteralExpression literalExpression) {
+            return new LiteralExpressionBuilder(definitions, nameString, literalExpression).build();
+        } else {
+            throw new UnsupportedOperationException("Not implemented.");
+        }
+    }
+
+    private void appendInputs(List<Input> list) {
+        for (Input hi : list) {
+            String nameString = hi.getName();
+            @SuppressWarnings("unused")
+            Class<?> typeRef = processType(hi.getType());
+            definitions.inputs().put(nameString, DataSource.createSingleton());
+        }
+    }
+
+    private Class<?> processType(String string) {
+        switch (string) {
+            case "string":
+            case "number":
+            case "boolean":
+            default:
+                return Object.class; // TODO currently does not resolve external JSON Schemas
+        }
+    }
+}
diff --git a/yard/yard-core/src/test/java/org/kie/yard/core/DomesticPackagePricesTest.java b/yard/yard-core/src/test/java/org/kie/yard/core/DomesticPackagePricesTest.java
new file mode 100644
index 0000000000..5cc3d21f82
--- /dev/null
+++ b/yard/yard-core/src/test/java/org/kie/yard/core/DomesticPackagePricesTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DomesticPackagePricesTest
+        extends TestBase {
+    private static final String FILE_NAME = "/domestic-package-prices.yml";
+
+    @Test
+    public void testMPackage() throws Exception {
+        final String CTX = """
+                {
+                    "Height":10,
+                    "Width":10,
+                    "Length": 10,
+                    "Weight":10
+                }
+                """;
+        Map<String, Object> outputJSONasMap = evaluate(CTX, FILE_NAME);
+        assertThat(outputJSONasMap).hasFieldOrPropertyWithValue("Package", "{ \"Size\": \"M\", \"Cost\": 6.90 }");
+    }
+
+    @Test
+    public void testLPackage() throws Exception {
+        final String CTX = """
+                {
+                    "Height":12,
+                    "Width":10,
+                    "Length": 10,
+                    "Weight":10
+                }
+                """;
+        Map<String, Object> outputJSONasMap = evaluate(CTX, FILE_NAME);
+        assertThat(outputJSONasMap).hasFieldOrPropertyWithValue("Package", "{ \"Size\": \"L\", \"Cost\": 8.90 }");
+    }
+
+}
diff --git a/yard/yard-core/src/test/java/org/kie/yard/core/ExtraCostsTest.java b/yard/yard-core/src/test/java/org/kie/yard/core/ExtraCostsTest.java
new file mode 100644
index 0000000000..55a02971ae
--- /dev/null
+++ b/yard/yard-core/src/test/java/org/kie/yard/core/ExtraCostsTest.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ExtraCostsTest
+        extends TestBase {
+    private static final String FILE_NAME = "/extra-costs.yml";
+
+    @Test
+    public void testMPackage() throws Exception {
+        final String CTX = """
+                {
+                    "Fragile":true,
+                    "Package Tracking":true,
+                    "Insurance":true,
+                    "Package Type":"M"
+                }
+                """;
+        Map<String, Object> outputJSONasMap = evaluate(CTX, FILE_NAME);
+        assertThat(outputJSONasMap).hasFieldOrPropertyWithValue("Total cost of premiums", 40);
+    }
+
+}
diff --git a/yard/yard-core/src/test/java/org/kie/yard/core/InsuranceBasePriceTest.java b/yard/yard-core/src/test/java/org/kie/yard/core/InsuranceBasePriceTest.java
new file mode 100644
index 0000000000..22db5bd59c
--- /dev/null
+++ b/yard/yard-core/src/test/java/org/kie/yard/core/InsuranceBasePriceTest.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.yard.core;
+
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class InsuranceBasePriceTest
+        extends TestBase {
+
+    private static final String FILE_NAME = "/insurance-base-price.yml";
+
+    @Test
+    public void testScenario1() throws Exception {
+        final String CTX = """
+                {
+                  "Age": 47,
+                  "Previous incidents?": false
+                }
+                """;
+        Map<String, Object> outputJSONasMap = evaluate(CTX, FILE_NAME);
+        assertThat(outputJSONasMap).hasFieldOrPropertyWithValue("Base price", 500);
+        assertThat(outputJSONasMap).hasFieldOrPropertyWithValue("Downpayment", 50.0);
+    }
+
+    @Test
+    public void testScenario2() throws Exception {
+        final String CTX = """
+                {
+                  "Age": 19,
+                  "Previous incidents?": true
+                }
+                """;
+        Map<String, Object> outputJSONasMap = evaluate(CTX, FILE_NAME);
+        assertThat(outputJSONasMap).hasFieldOrPropertyWithValue("Base price", 1000);
+        assertThat(outputJSONasMap).hasFieldOrPropertyWithValue("Downpayment", 70.0);
+    }
+
+}
diff --git a/yard/yard-core/src/test/java/org/kie/yard/core/TestBase.java b/yard/yard-core/src/test/java/org/kie/yard/core/TestBase.java
new file mode 100644
index 0000000000..ce055e1517
--- /dev/null
+++ b/yard/yard-core/src/test/java/org/kie/yard/core/TestBase.java
@@ -0,0 +1,35 @@
+package org.kie.yard.core;
+
+import java.util.Map;
+
+import org.drools.util.IoUtils;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.json.JsonMapper;
+
+public class TestBase {
+
+    private JsonMapper jsonMapper = JsonMapper.builder().build();
+
+    protected Map<String, Object> evaluate(String jsonInputCxt, String file) throws Exception {
+        String yamlDecision = new String(IoUtils.readBytesFromInputStream(this.getClass().getResourceAsStream(file), true));
+
+        YaRDParser parser = new YaRDParser();
+        YaRDDefinitions units = parser.parse(yamlDecision);
+
+        Map<String, Object> inputContext = readJSON(jsonInputCxt);
+
+        Map<String, Object> tempOutCtx = units.evaluate(inputContext);
+        final String OUTPUT_JSON = jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(tempOutCtx);
+        Map<String, Object> outputJSONasMap = readJSON(OUTPUT_JSON);
+
+        return outputJSONasMap;
+    }
+
+    @SuppressWarnings("unchecked")
+    private Map<String, Object> readJSON(final String CONTEXT) throws JsonProcessingException, JsonMappingException {
+        return jsonMapper.readValue(CONTEXT, Map.class);
+    }
+
+}
diff --git a/yard/yard-core/src/test/resources/domestic-package-prices.yml b/yard/yard-core/src/test/resources/domestic-package-prices.yml
new file mode 100644
index 0000000000..4640a5586a
--- /dev/null
+++ b/yard/yard-core/src/test/resources/domestic-package-prices.yml
@@ -0,0 +1,30 @@
+specVersion: alpha
+kind: YaRD
+name: "Traffic Violation"
+expressionLang: jshell
+inputs:
+  - name: "Length"
+    type: integer
+  - name: "Width"
+    type: number
+  - name: "Height"
+    type: number
+  - name: "Weight"
+    type: number
+elements:
+  - name: Package
+    type: Decision
+    logic:
+      type: DecisionTable
+        # First matching result will be picked
+      hitPolicy: FIRST
+      inputs: ["Height", "Width", "Length", "Weight"]
+      rules:
+        - when: ['<= 3', '<= 25','<= 35', '<= 2']
+          then: '{ "Size": "S", "Cost": 5.90 }'
+        - when: ['<= 11','<= 32','<= 42', '<=25']
+          then: '{ "Size": "M", "Cost": 6.90 }'
+        - when: ['<= 19', '<= 36', '<= 60', '<= 25']
+          then: '{ "Size": "L", "Cost": 8.90 }'
+        - when: ['<= 37', '<= 36', '<= 60', '<= 25']
+          then: '{ "Size": "XL", "Cost": 10.90}'
\ No newline at end of file
diff --git a/yard/yard-core/src/test/resources/extra-costs.yml b/yard/yard-core/src/test/resources/extra-costs.yml
new file mode 100644
index 0000000000..71bf208654
--- /dev/null
+++ b/yard/yard-core/src/test/resources/extra-costs.yml
@@ -0,0 +1,47 @@
+specVersion: alpha
+kind: YaRD
+name: "Traffic Violation"
+expressionLang: jshell
+inputs:
+  - name: Fragile
+    type: boolean
+  - name: Package Tracking
+    type: boolean
+  - name: Insurance
+    type: boolean
+  - name: Package Type
+    type: string
+elements:
+  - name: Selected premiums 
+    type: Decision
+    logic:
+      type: DecisionTable
+      # Collect all costs
+      hitPolicy: COLLECT
+      inputs: [Package Type, Fragile, Package Tracking, Insurance]
+      rules:
+        # Insurance for all packages, based on size and if the content is fragile
+        - when: [ 'S', true, "-", true]
+          then: '{ "Name": "Fragile insurance cost", "Price": 10}'
+        - when: [ 'M', true, "-", true]
+          then: '{ "Name": "Fragile insurance cost", "Price": 20}'
+        - when: [ 'L', true, "-", true]
+          then: '{ "Name": "Fragile insurance cost", "Price": 30}'
+        - when: [ 'XL', true, "-", true]
+          then: '{ "Name": "Fragile insurance cost", "Price": 40}'
+        - when: [ "-", false, "-", true]
+          then: '{ "Name": "Regular insurance cost", "Price": 5}'
+        # Tracking cost is same for all sizes
+        - when: ["-", "-", true, "-"]
+          then: '{ "Name": "Tracking cost", "Price": 5}'
+        # Fragile package extra care cost 
+        - when: ["-", true, "-", "-"]
+          then: '{ "Name": "Fragile package shipping cost", "Price": 15}'
+  - name: "Total cost of premiums"
+    type: Decision
+    logic:
+      type: LiteralExpression
+      expression: |
+        ((java.util.List<java.util.Map<String,Integer>>)`Selected premiums`).stream().map(m -> m.get("Price")).mapToInt(Integer::valueOf).sum();
+#      Feels filthy compared to FEEL below
+#      expression: 'sum( for item in Selected premiums return item.Price )'
diff --git a/yard/yard-core/src/test/resources/insurance-base-price.yml b/yard/yard-core/src/test/resources/insurance-base-price.yml
new file mode 100644
index 0000000000..be89f4477e
--- /dev/null
+++ b/yard/yard-core/src/test/resources/insurance-base-price.yml
@@ -0,0 +1,30 @@
+specVersion: alpha
+kind: YaRD
+name: 'BasePrice'
+expressionLang: jshell
+inputs:
+- name: 'Age'
+  type: number
+- name: 'Previous incidents?'
+  type: boolean
+elements:
+- name: 'Base price'
+  type: Decision
+  logic: 
+    type: DecisionTable
+    inputs: ['Age', 'Previous incidents?']
+    rules:
+    - when: ['<21', false]
+      then: 800
+    - when: ['<21', true]
+      then: 1000
+    - when: ['>=21', false]
+      then: 500
+    - when: ['>=21', true]
+      then: 600
+- name: 'Downpayment'
+  type: Decision
+  logic: 
+    type: LiteralExpression
+    expression: |
+      Math.max(`Base price` * 0.07, 50)
diff --git a/yard/yard-core/src/test/resources/logback-test.xml b/yard/yard-core/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..1bdd160790
--- /dev/null
+++ b/yard/yard-core/src/test/resources/logback-test.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+  <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %class{36}.%method:%line - %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <logger name="org.drools" level="info"/>
+  <logger name="org.kie" level="info"/>
+  <logger name="org.kie.yard" level="info"/>
+
+  <root level="warn">
+    <appender-ref ref="consoleAppender" />
+  </root>
+
+</configuration>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org