1

I am executing a DMN based decision model that got extracted from signavio tool. The model contains zip function as well as MID. see below the sample of my decision table

<decision name="collateOrder" id="id-85c7398c9bc186c1e2396c4625ebbcc1" label="Collate Order" sigExt:shapeId="sid-C47674E0-8CDE-4A4A-84E8-3DD179DCF72C" sigExt:diagramId="8462cb232d98419493d4ef846516a070">
    <extensionElements/>
    <variable typeRef="sig:collateOrder" name="collateOrder" id="id-85c7398c9bc186c1e2396c4625ebbcc1_variable"/>
    <informationRequirement>
        <requiredInput href="#id-a47f651b80111a121d93cf07939b20dc"/>
    </informationRequirement>
    <literalExpression expressionLanguage="http://www.omg.org/spec/FEEL/20140401">
        <text>zip(["Item Name", "Item Price", "Item Quantity"], [order.itemName, order.price, order.quantity])</text>
    </literalExpression>
</decision>

I am using kie-dmn-signavio-7.37.0.Final.jar

on my java code, i pass argument like below

    DMNContext context = runtime.newContext();
    List fieldList = Arrays.asList("itemName", "price", "quantity");
    List<String> itemList = Arrays.asList("item1", "item2", "item3");
    List<BigDecimal> priceList = Arrays.asList(new BigDecimal(1000), new BigDecimal(200), new BigDecimal(3000));
    List<Integer> qtyList = Arrays.asList(100, 20, 300);
    List<List> valLiist = Arrays.asList(itemList, priceList, qtyList);
    List<List> finalList = Arrays.asList(fieldList, valLiist);
    context.set("order", finalList);
    DMNResult evaluateAll = runtime.evaluateAll(model0, context);

When i run my code, i am getting below error message 23:52:26.989 [main] ERROR org.kie.dmn.core.ast.DMNLiteralExpressionEvaluator - FEEL ERROR while evaluating literal expression 'zip(["Item Name", "Item Price", "Item Quantity"], ... [string clipped after 50 chars, total length is 96]': The parameter 'values', in function zip(), values must be a list of the same size as of attributes.

Not sure what is wrong on my input.

Appreciate your help.

2 Answers2

0

see below the sample of my decision table

The sample snippet you provided actually is not a decision table but a FEEL literal expression :)

Regardless, I believe you are not using the Signavio's extended zip function correctly.

zip(attributes, values1, ..., valuesN) Assembles a list of objects out of a list of attributes and multiple lists of values.

Problem 1: fix correct usage of extended zip function

So in your case because you have attributes of size 3, you must supply 3 lists of N elements each.

In other words:

zip(["Item Name", "Item Price", "Item Quantity"],
    list of names,
    list of prices,
    list of qtys)

that for your DMN model it would be like saying:

zip(["Item Name", "Item Price", "Item Quantity"], order.itemName, order.price, order.quantity)

Problem 2: fix correct supply of Java composite object

Also on your Java input you are not supplying the expected composite object, order is a list of complex object each having "itemName", "price", "quantity" attributes.

Conclusions

Once I fixed those issues it works fine, I will include sample DMN and Java test snippet below.

Important. However it is a bit difficult to understand the use-case based on the elements provided in the original question, so you might want to revise if the zip() function use is needed at all, and just make use of DMN Standard functionalities.


Full fixed example DMN model:

<dmn:definitions xmlns:dmn="http://www.omg.org/spec/DMN/20180521/MODEL/" xmlns="https://kiegroup.org/dmn/_CEDFCB71-C301-4AF7-8438-3C906965946C" xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/" xmlns:kie="http://www.drools.org/kie/dmn/1.2" xmlns:dmndi="http://www.omg.org/spec/DMN/20180521/DMNDI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" xmlns:feel="http://www.omg.org/spec/DMN/20180521/FEEL/" id="_C606E3BA-A1A8-4D0A-A1E8-AE404B568CC0" name="9B64A25E-4853-4D7B-B8FE-33E98234AE51" typeLanguage="http://www.omg.org/spec/DMN/20180521/FEEL/" namespace="https://kiegroup.org/dmn/_CEDFCB71-C301-4AF7-8438-3C906965946C">
  <dmn:extensionElements/>
  <dmn:inputData id="_AFE2999A-D71C-4C4B-B1D7-CC1DB6650FC1" name="order">
    <dmn:extensionElements/>
    <dmn:variable id="_F69956F1-49DA-46C8-A0DA-9E84AF18D0B2" name="order"/>
  </dmn:inputData>
  <dmn:decision id="_48E05B28-5BEB-457E-BCDB-16023684FA3E" name="collateOrder">
    <dmn:extensionElements/>
    <dmn:variable id="_69BECEE8-924A-411C-84EE-769432DF5C22" name="collateOrder"/>
    <dmn:informationRequirement id="_4533C1C4-E3F3-4557-ABE1-A2264908875F">
      <dmn:requiredInput href="#_AFE2999A-D71C-4C4B-B1D7-CC1DB6650FC1"/>
    </dmn:informationRequirement>
    <dmn:literalExpression id="_F029607F-4296-4ADE-B669-AC6FD5AB91FD">
      <dmn:text>zip(["Item Name", "Item Price", "Item Quantity"], order.itemName, order.price, order.quantity)</dmn:text>
    </dmn:literalExpression>
  </dmn:decision>
</dmn:definitions>

test snippet:

        DMNContext context = runtime.newContext();
        Map<String, Object> item1 = new HashMap<>();
        item1.put("itemName", "item1");
        item1.put("price", new BigDecimal(1000));
        item1.put("quantity", 100);
        Map<String, Object> item2 = new HashMap<>();
        item2.put("itemName", "item2");
        item2.put("price", new BigDecimal(200));
        item2.put("quantity", 20);
        Map<String, Object> item3 = new HashMap<>();
        item3.put("itemName", "item3");
        item3.put("price", new BigDecimal(3000));
        item3.put("quantity", 300);
        context.set("order", Arrays.asList(item1, item2, item3));
        DMNResult evaluateAll = runtime.evaluateAll(model0, context);
        System.out.println(evaluateAll.getContext());

results:

{
    order: [{itemName=item1, quantity=100, price=1000}, {itemName=item2, quantity=20, price=200}, {itemName=item3, quantity=300, price=3000}]
    collateOrder: [{Item Name=item1, Item Quantity=100, Item Price=1000}, {Item Name=item2, Item Quantity=20, Item Price=200}, {Item Name=item3, Item Quantity=300, Item Price=3000}]
}
tarilabs
  • 2,178
  • 2
  • 15
  • 23
  • 1
    Thank you for your response – JavaExplorer May 26 '20 at 21:59
  • @JavaExplorer if it helps solving, please don't forget to mark as Answered – tarilabs May 26 '20 at 22:03
  • My apologies. I am new to this blog. my response has gone above to your answer. I am using zip function to consolidate multiple values. – JavaExplorer May 26 '20 at 22:20
  • @JavaExplorer that sounds like a different problem. Your original question was about error with `zip` function which I believe my answer solved for you. Please mark this as accepted if the case. And for your new problem, feel free to post a new StackOverflow question or you can also ask on the Drools-usage forum – tarilabs May 26 '20 at 22:40
  • I agree - your solution has resolved my original query. Thank you so much for your time on this. – JavaExplorer May 26 '20 at 22:56
  • @JavaExplorer happy to try look further into the other issue, once is properly posted as a new question or on the forum, let me know! – tarilabs May 26 '20 at 22:57
  • thank you. I got 2 different zip & MID use case that i am struggling to run it thru java. Here is the first one. https://stackoverflow.com/questions/62033195/dmn-decision-model-that-zip-inputs-with-mid – JavaExplorer May 26 '20 at 23:45
0

Thank you for your response. Below is complete model which i able to run it thru simulator in signavio

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <definitions namespace="http://www.signavio.com/dmn/1.1/diagram/8462cb232d98419493d4ef846516a070.xml" exporterVersion="13.3.2" name="MID Example" id="id-f1fe73d348e342d2a6f0435b38ce14e6" sigExt:revisionId="9f563b074ba844d4b9d1fcd6bead7580" sigExt:revisionNumber="1" xmlns="http://www.omg.org/spec/DMN/20151101/dmn.xsd" xmlns:sig="http://www.signavio.com/dmn/1.1/diagram/8462cb232d98419493d4ef846516a070.xml" xmlns:sigExt="http://www.signavio.com/schema/dmn/1.1/" xmlns:feel="http://www.omg.org/spec/FEEL/20140401">
<extensionElements/>
<itemDefinition isCollection="false" name="calculatePriceAfterDiscount" id="id-f8c81ba73d98a8a51216f4583ed31dc9" label="Calculate Price After Discount">
    <typeRef>feel:number</typeRef>
</itemDefinition>
<itemDefinition isCollection="false" name="calculatePrice" id="id-e13d8570789c69dec9515bd8b9159f2d" label="Calculate Price ">
    <typeRef>feel:number</typeRef>
</itemDefinition>
<itemDefinition isCollection="false" name="determineDiscount" id="id-99dded75dc910f4c4b3e2f1d3471cd10" label="Determine Discount %">
    <typeRef>feel:number</typeRef>
</itemDefinition>
<itemDefinition isCollection="false" name="discount" id="id-e41b37d9d6d86919af6290e062ee6bbe" label="Discount">
    <typeRef>feel:number</typeRef>
</itemDefinition>
<itemDefinition isCollection="false" name="collateOrder2" id="id-a4abe03e2f888a7830f15614f50bc45a" label="Collate Order">
    <itemComponent isCollection="false" name="itemName" id="id-a4abe03e2f888a7830f15614f50bc45a-relation-ItemName" label="Item Name" sigExt:slotId="Item Name">
        <typeRef>feel:string</typeRef>
    </itemComponent>
    <itemComponent isCollection="false" name="itemPrice" id="id-a4abe03e2f888a7830f15614f50bc45a-relation-ItemPrice" label="Item Price" sigExt:slotId="Item Price">
        <typeRef>feel:number</typeRef>
    </itemComponent>
    <itemComponent isCollection="false" name="itemQuantity" id="id-a4abe03e2f888a7830f15614f50bc45a-relation-ItemQuantity" label="Item Quantity" sigExt:slotId="Item Quantity">
        <typeRef>feel:number</typeRef>
    </itemComponent>
</itemDefinition>
<itemDefinition isCollection="false" name="calculateTotalPrice" id="id-753285786a1cec905c139529a673b0fe" label="Calculate Total Price">
    <typeRef>feel:number</typeRef>
</itemDefinition>
<itemDefinition isCollection="false" name="itemPrice" id="id-1a281dc9cb860f8ffd0c4cef9485f6a0" label="Item Price ">
    <typeRef>feel:number</typeRef>
</itemDefinition>
<itemDefinition isCollection="true" name="collateOrder" id="id-8cbabc9f5673d5e84b524b68155dcb45" label="Collate Order">
    <itemComponent isCollection="false" name="itemName" id="id-8cbabc9f5673d5e84b524b68155dcb45-relation-ItemName" label="Item Name" sigExt:slotId="Item Name">
        <typeRef>feel:string</typeRef>
    </itemComponent>
    <itemComponent isCollection="false" name="itemPrice" id="id-8cbabc9f5673d5e84b524b68155dcb45-relation-ItemPrice" label="Item Price" sigExt:slotId="Item Price">
        <typeRef>feel:number</typeRef>
    </itemComponent>
    <itemComponent isCollection="false" name="itemQuantity" id="id-8cbabc9f5673d5e84b524b68155dcb45-relation-ItemQuantity" label="Item Quantity" sigExt:slotId="Item Quantity">
        <typeRef>feel:number</typeRef>
    </itemComponent>
</itemDefinition>
<itemDefinition isCollection="false" name="order" id="id-4cc8046b78214ad11657d5b06436db21" label="Order ">
    <itemComponent isCollection="true" name="price" id="id-4cc8046b78214ad11657d5b06436db21-relation-0" label="Price" sigExt:slotId="0">
        <typeRef>feel:number</typeRef>
    </itemComponent>
    <itemComponent isCollection="true" name="quantity" id="id-4cc8046b78214ad11657d5b06436db21-relation-1" label="Quantity" sigExt:slotId="1">
        <typeRef>feel:number</typeRef>
    </itemComponent>
    <itemComponent isCollection="true" name="itemName" id="id-4cc8046b78214ad11657d5b06436db21-relation-2" label="Item Name" sigExt:slotId="2">
        <typeRef>feel:string</typeRef>
    </itemComponent>
</itemDefinition>
<inputData name="collateOrder_iterator" id="id-4835f35ebd354e9d65c600afb02d9d3c" label="Collate Order" sigExt:shapeId="sid-139D76F2-2029-4058-B488-9472C5BBEBC6" sigExt:diagramId="8462cb232d98419493d4ef846516a070">
    <extensionElements/>
    <variable typeRef="sig:collateOrder2" name="collateOrder_iterator" id="id-4835f35ebd354e9d65c600afb02d9d3c_variable"/>
</inputData>
<inputData name="order" id="id-a47f651b80111a121d93cf07939b20dc" label="Order " sigExt:shapeId="sid-8352CBF9-98EA-4018-9EAC-F17A5F936551" sigExt:diagramId="8462cb232d98419493d4ef846516a070">
    <extensionElements/>
    <variable typeRef="sig:order" name="order" id="id-a47f651b80111a121d93cf07939b20dc_variable"/>
</inputData>
<decision name="calculatePriceAfterDiscount" id="id-567eb0877fe31a6d84a53c3917e4eee0" label="Calculate Price After Discount" sigExt:shapeId="sid-5F8D6179-84FD-47B9-BA88-0E3CB4305014" sigExt:diagramId="8462cb232d98419493d4ef846516a070">
    <extensionElements/>
    <variable typeRef="sig:calculatePriceAfterDiscount" name="calculatePriceAfterDiscount" id="id-567eb0877fe31a6d84a53c3917e4eee0_variable"/>
    <informationRequirement>
        <requiredDecision href="#id-bc493858d94a5f245b95febc081cb0c7"/>
    </informationRequirement>
    <informationRequirement>
        <requiredDecision href="#id-d045696f950f3769011d375f7a1afd78"/>
    </informationRequirement>
    <literalExpression expressionLanguage="http://www.omg.org/spec/FEEL/20140401">
        <text>(calculatePrice-((determineDiscount/100)*calculatePrice))</text>
    </literalExpression>
</decision>
<decision name="calculateTotalPrice" id="id-be5d8465feb66b570cf75aeee595bf21" label="Calculate Total Price" sigExt:shapeId="sid-EA841422-3493-491C-9CE6-59F5EA9CE261" sigExt:diagramId="8462cb232d98419493d4ef846516a070">
    <extensionElements/>
    <variable typeRef="sig:calculateTotalPrice" name="calculateTotalPrice" id="id-be5d8465feb66b570cf75aeee595bf21_variable"/>
    <informationRequirement>
        <requiredInput href="#id-4835f35ebd354e9d65c600afb02d9d3c"/>
    </informationRequirement>
    <decisionTable hitPolicy="UNIQUE">
        <input id="id-137491756d969eac658224df41ae34d3" label="Price">
            <inputExpression>
                <text>collateOrder_iterator.itemPrice</text>
            </inputExpression>
        </input>
        <input id="id-cad45b775d319f14f2cc11d5d3b758fd" label="Quantity">
            <inputExpression>
                <text>collateOrder_iterator.itemQuantity</text>
            </inputExpression>
        </input>
        <output name="calculateTotalPrice" typeRef="sig:itemPrice" id="id-99e0fdb7f0d56dbc7bb88ae025be147c" label="Calculate Total Price"/>
        <rule id="id-2fff85d2331aa1e369d698392addb0a8">
            <description>string(-)</description>
            <inputEntry>
                <text>not(null)</text>
            </inputEntry>
            <inputEntry>
                <text>not(null)</text>
            </inputEntry>
            <outputEntry>
                <text>(collateOrder_iterator.itemPrice*collateOrder_iterator.itemQuantity)</text>
            </outputEntry>
        </rule>
    </decisionTable>
</decision>
<decision name="determineDiscount" id="id-bc493858d94a5f245b95febc081cb0c7" label="Determine Discount %" sigExt:shapeId="sid-6824DDAF-771A-4773-973E-1477F70EC90B" sigExt:diagramId="8462cb232d98419493d4ef846516a070">
    <extensionElements/>
    <variable typeRef="sig:determineDiscount" name="determineDiscount" id="id-bc493858d94a5f245b95febc081cb0c7_variable"/>
    <informationRequirement>
        <requiredDecision href="#id-d045696f950f3769011d375f7a1afd78"/>
    </informationRequirement>
    <decisionTable hitPolicy="UNIQUE">
        <input id="id-8a61ecb31c82e81d0b067a63f8a10b25" label="Calculate Price ">
            <inputExpression>
                <text>calculatePrice</text>
            </inputExpression>
        </input>
        <output name="determineDiscount" typeRef="sig:discount" id="id-cd2468e782346733c82b544eae541110" label="Determine Discount %"/>
        <rule id="id-8ce83be6aaf7113a136fadb09f2de83b">
            <description>string(-)</description>
            <inputEntry>
                <text>[0..500)</text>
            </inputEntry>
            <outputEntry>
                <text>1</text>
            </outputEntry>
        </rule>
        <rule id="id-ba19200060db4a933658db98400f5019">
            <description>string(-)</description>
            <inputEntry>
                <text>[500..1000)</text>
            </inputEntry>
            <outputEntry>
                <text>5</text>
            </outputEntry>
        </rule>
        <rule id="id-23a4b91a413530151413d2230f41e010">
            <description>string(-)</description>
            <inputEntry>
                <text>[1000..5000)</text>
            </inputEntry>
            <outputEntry>
                <text>10</text>
            </outputEntry>
        </rule>
        <rule id="id-9b4dbf30626d219d5e7937c1322b33fe">
            <description>string(-)</description>
            <inputEntry>
                <text>[5000..10000]</text>
            </inputEntry>
            <outputEntry>
                <text>20</text>
            </outputEntry>
        </rule>
        <rule id="id-37139385183b4a6ee481738ccccc02f4">
            <description>string(-)</description>
            <inputEntry>
                <text>&gt; 10000</text>
            </inputEntry>
            <outputEntry>
                <text>25</text>
            </outputEntry>
        </rule>
        <rule id="id-7d86977d4be287545686b09f982b55a9">
            <description>string(-)</description>
            <inputEntry>
                <text>&lt; 0</text>
            </inputEntry>
            <outputEntry>
                <text>0</text>
            </outputEntry>
        </rule>
    </decisionTable>
</decision>
<decision name="calculatePrice" id="id-d045696f950f3769011d375f7a1afd78" label="Calculate Price " sigExt:shapeId="sid-E3A6C7E0-BEE6-47C9-97EC-1C5A95EE2DB4" sigExt:diagramId="8462cb232d98419493d4ef846516a070">
    <extensionElements>
        <sigExt:MultiInstanceDecisionLogic>
            <sigExt:iterationExpression>collateOrder</sigExt:iterationExpression>
            <sigExt:iteratorShapeId>id-4835f35ebd354e9d65c600afb02d9d3c</sigExt:iteratorShapeId>
            <sigExt:aggregationFunction>SUM</sigExt:aggregationFunction>
            <sigExt:topLevelDecisionId>id-be5d8465feb66b570cf75aeee595bf21</sigExt:topLevelDecisionId>
        </sigExt:MultiInstanceDecisionLogic>
    </extensionElements>
    <variable typeRef="sig:calculatePrice" name="calculatePrice" id="id-d045696f950f3769011d375f7a1afd78_variable"/>
    <informationRequirement>
        <requiredDecision href="#id-85c7398c9bc186c1e2396c4625ebbcc1"/>
    </informationRequirement>
</decision>
<decision name="collateOrder" id="id-85c7398c9bc186c1e2396c4625ebbcc1" label="Collate Order" sigExt:shapeId="sid-C47674E0-8CDE-4A4A-84E8-3DD179DCF72C" sigExt:diagramId="8462cb232d98419493d4ef846516a070">
    <extensionElements/>
    <variable typeRef="sig:collateOrder" name="collateOrder" id="id-85c7398c9bc186c1e2396c4625ebbcc1_variable"/>
    <informationRequirement>
        <requiredInput href="#id-a47f651b80111a121d93cf07939b20dc"/>
    </informationRequirement>
    <literalExpression expressionLanguage="http://www.omg.org/spec/FEEL/20140401">
        <text>zip(["Item Name", "Item Price", "Item Quantity"], order.itemName, order.price, order.quantity)</text>
    </literalExpression>
</decision>

'

I made changes to zip function as per what you said. When i run my java code,it says

15:24:39.930 [main] ERROR org.kie.dmn.feel.runtime.functions.DTInvokerFunction - Error invoking decision table 'determineDiscount': ClassCastException java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.math.BigDecimal (java.util.ArrayList and java.math.BigDecimal are in module java.base of loader 'bootstrap')

Appreciate any pointers