Search code examples
postmandroolsworkbench

Postman does not responds using arrays in WHEN condition with Drools


I'm trying to test the solution proposed by @tarilabs (which makes all sense) in this thread, using a drl file from Business Central:

Drools Business Central - Decision tables with spreadsheets, using arrays at WHEN condition

Here is the rule code:

package com.myspace.arraystreatmentconditions;
import com.myspace.arraystreatmentconditions.Client;
import java.util.*;

rule R1
when
  $c: Client( client_status == "Active")
  $item: String($c.client_products.contains(this)) from $c.cart

then
  modify ($c) { setResult($item + " from the cart in the " + $c.getClient_products());}
end

Here is the Client.java class:

package com.myspace.arraystreatmentconditions;

/**
 * This class was automatically generated by the data modeler tool.
 */

public class Client implements java.io.Serializable {

    static final long serialVersionUID = 1L;

    private java.util.List<java.lang.String> cart;
    private java.util.List<java.lang.String> client_products;
    private java.lang.String client_status;
    private java.lang.String serviceability;
    private java.lang.String result;

    public Client() {
    }

    public java.util.List<java.lang.String> getCart() {
        return this.cart;
    }

    public void setCart(java.util.List<java.lang.String> cart) {
        this.cart = cart;
    }

    public java.util.List<java.lang.String> getClient_products() {
        return this.client_products;
    }

    public void setClient_products(
            java.util.List<java.lang.String> client_products) {
        this.client_products = client_products;
    }

    public java.lang.String getClient_status() {
        return this.client_status;
    }

    public void setClient_status(java.lang.String client_status) {
        this.client_status = client_status;
    }

    public java.lang.String getServiceability() {
        return this.serviceability;
    }

    public void setServiceability(java.lang.String serviceability) {
        this.serviceability = serviceability;
    }

    public java.lang.String getResult() {
        return this.result;
    }

    public void setResult(java.lang.String result) {
        this.result = result;
    }

    public Client(java.util.List<java.lang.String> cart,
            java.util.List<java.lang.String> client_products,
            java.lang.String client_status, java.lang.String serviceability,
            java.lang.String result) {
        this.cart = cart;
        this.client_products = client_products;
        this.client_status = client_status;
        this.serviceability = serviceability;
        this.result = result;
    }

}

This is my JSON:

{
  "commands": [
    {
      "insert": {
        "object": {
          "com.myspace.arraystreatmentconditions.Client": {
            "cart": ["item1", "item2", "item3"],
            "client_products": ["item1", "item2", "item3", "item4"],
            "client_status": "Active",
            "serviceability": "cable",
            "result": ""
          }
        },
        "out-identifier": "client"
      }
    },
    {
      "fire-all-rules": {}
    },
    {
      "get-object": {
        "out-identifier": "client"
      }
    }
  ]
}

But at the time to send the request from Postman, it keeps sending request for hours and I don´t get response.

This is the simple code of the whole project:

https://github.com/jesurod09/DroolsValidation

And here is the problem: enter image description here

Any idea?


Solution

  • That's a very odd way of trying to figure out if the item $c.cart is present in $c.client_products.

    It would probably work better like this:

    $c: Client( client_status == "Active",
                $item: cart,
                client_products contains $item )
    

    This is assuming that your model, which you haven't shared, has appropriate accessors for client_status, client_products, etc.


    If, as mentioned in the comment, $c.cart is actually a collection and not a string, the rule would look something like:

    $c: Client( client_status == "Active",
                $items: cart)
    $item: String() from $items
    Client( client_product contains $item ) from $c
    

    The lack of a Client model in the question makes it a bit difficult to answer. The DRL in the question indicates that $c.cart is a String, but that might be in error as well.