【问题标题】:kie-dmn-signavio-7.37.0.Final - unable to execute a DMN decision model that contains multi instance decision and zip functionkie-dmn-signavio-7.37.0.Final - 无法执行包含多实例决策和 zip 函数的 DMN 决策模型
【发布时间】:2020-05-26 04:15:00
【问题描述】:

我正在执行从 signavio 工具中提取的基于 DMN 的决策模型。该模型包含 zip 功能以及 MID。请参阅下面的决策表示例

<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>

我正在使用 kie-dmn-signavio-7.37.0.Final.jar

在我的 java 代码中,我传递如下参数

    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);

当我运行我的代码时,我收到以下错误消息 23:52:26.989 [main] 错误 org.kie.dmn.core.ast.DMNLiteralExpressionEvaluator - 评估文字表达式 'zip(["Item Name", "Item Price", "Item Quantity"], ... [字符串剪裁50个字符后,总长度为96]':参数'values',在函数zip()中,values必须是一个与属性大小相同的列表。

不确定我的输入有什么问题。

感谢您的帮助。

【问题讨论】:

    标签: drools dmn


    【解决方案1】:

    请看下面我的决策表示例

    您提供的示例 sn-p 实际上不是决策表,而是 FEEL 文字表达式:)

    无论如何,我相信您没有正确使用 Signavio 的扩展 zip 功能。

    zip(attributes, values1, ..., valuesN) 从属性列表和多个值列表中组合出对象列表。

    问题 1:修复扩展 zip 功能的正确使用

    所以在你的情况下,因为你有大小为 3 的属性,你必须提供 3 个列表,每个列表有 N 个元素。

    换句话说:

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

    对于您的 DMN 模型,就像这样说:

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

    问题 2:修复 Java 复合对象的正确供应

    此外,在您的 Java 输入中,您没有提供预期的复合对象,order 是一个复杂对象列表,每个对象都具有 "itemName", "price", "quantity" 属性。

    结论

    一旦我解决了这些问题,它就可以正常工作了,我将在下面包含示例 DMN 和 Java 测试 sn-p。

    重要。但是,根据原始问题中提供的元素来理解用例有点困难,因此您可能需要修改是否需要使用 zip() 函数,并仅使用 DMN 标准功能。


    完整的固定示例 DMN 模型:

    <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>
    

    测试sn-p:

            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());
    

    结果:

    {
        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}]
    }
    

    【讨论】:

    • 感谢您的回复
    • @JavaExplorer 如果对解决有帮助,请不要忘记标记为已回答
    • 我很抱歉。我是这个博客的新手。我的回答高于你的回答。我正在使用 zip 函数来合并多个值。
    • @JavaExplorer 这听起来像是一个不同的问题。您最初的问题是关于 zip 函数的错误,我相信我的回答为您解决了。如果情况属实,请将此标记为已接受。对于您的新问题,请随时发布新的 StackOverflow 问题,或者您也可以在 Drools 使用论坛上提问
    • 我同意 - 您的解决方案已解决我的原始查询。非常感谢您抽出宝贵时间。
    【解决方案2】:

    感谢您的回复。下面是完整的模型,我可以在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>
    

    '

    我按照您所说的对 zip 功能进行了更改。当我运行我的java代码时,它说

    15:24:39.930 [main] 错误 org.kie.dmn.feel.runtime.functions.DTInvokerFunction - 调用决策表“determineDiscount”时出错:ClassCastException java.lang.ClassCastException:类 java.util.ArrayList 无法转换为类 java.math.BigDecimal(java.util.ArrayList 和 java.math.BigDecimal 位于加载器“bootstrap”的模块 java.base 中)

    感谢任何指针

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2021-11-19
      • 2016-03-18
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多