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

tkobayas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new c4711a9bda [incubator-kie-drools-6180] accumulate min doesn't evaluate 
correctly… (#6186)
c4711a9bda is described below

commit c4711a9bda44e926104c3801ad87492753ed9ecd
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Fri Dec 13 18:05:42 2024 +0900

    [incubator-kie-drools-6180] accumulate min doesn't evaluate correctly… 
(#6186)
    
    * [incubator-kie-drools-6180] accumulate min doesn't evaluate correctly 
with more than 18 digits BigDecimal
    
    * fixed assertion
---
 .../compiler/rule/builder/util/AccumulateUtil.java |   8 ++
 .../BigDecimalMaxAccumulateFunction.java           | 100 +++++++++++++
 .../BigDecimalMinAccumulateFunction.java           |  98 +++++++++++++
 .../BigIntegerMaxAccumulateFunction.java           | 100 +++++++++++++
 .../BigIntegerMinAccumulateFunction.java           |  98 +++++++++++++
 .../resources/META-INF/kie.default.properties.conf |   4 +
 .../compiler/integrationtests/AccumulateTest.java  | 156 +++++++++++++++++++++
 7 files changed, 564 insertions(+)

diff --git 
a/drools-compiler/src/main/java/org/drools/compiler/rule/builder/util/AccumulateUtil.java
 
b/drools-compiler/src/main/java/org/drools/compiler/rule/builder/util/AccumulateUtil.java
index 192873909f..9fc2564123 100644
--- 
a/drools-compiler/src/main/java/org/drools/compiler/rule/builder/util/AccumulateUtil.java
+++ 
b/drools-compiler/src/main/java/org/drools/compiler/rule/builder/util/AccumulateUtil.java
@@ -55,6 +55,10 @@ public class AccumulateUtil {
                 functionName = "maxI";
             } else if (exprClass == Long.class) {
                 functionName = "maxL";
+            } else if (exprClass == BigInteger.class) {
+                functionName = "maxBI";
+            } else if (exprClass == BigDecimal.class) {
+                functionName = "maxBD";
             } else if (Number.class.isAssignableFrom( exprClass )) {
                 functionName = "maxN";
             }
@@ -64,6 +68,10 @@ public class AccumulateUtil {
                 functionName = "minI";
             } else if (exprClass == Long.class) {
                 functionName = "minL";
+            } else if (exprClass == BigInteger.class) {
+                functionName = "minBI";
+            } else if (exprClass == BigDecimal.class) {
+                functionName = "minBD";
             } else if (Number.class.isAssignableFrom( exprClass )) {
                 functionName = "minN";
             }
diff --git 
a/drools-core/src/main/java/org/drools/core/base/accumulators/BigDecimalMaxAccumulateFunction.java
 
b/drools-core/src/main/java/org/drools/core/base/accumulators/BigDecimalMaxAccumulateFunction.java
new file mode 100644
index 0000000000..884fa35a82
--- /dev/null
+++ 
b/drools-core/src/main/java/org/drools/core/base/accumulators/BigDecimalMaxAccumulateFunction.java
@@ -0,0 +1,100 @@
+/**
+ * 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.drools.core.base.accumulators;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.math.BigDecimal;
+
+/**
+ * An implementation of an accumulator capable of calculating maximum values
+ */
+public class BigDecimalMaxAccumulateFunction extends 
AbstractAccumulateFunction<BigDecimalMaxAccumulateFunction.MaxData> {
+
+    public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+
+    }
+
+    protected static class MaxData implements Externalizable {
+        public BigDecimal max = null;
+
+        public MaxData() {}
+
+        public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+            max = (BigDecimal) in.readObject();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject(max);
+        }
+
+        @Override
+        public String toString() {
+            return "max";
+        }
+    }
+
+    public MaxData createContext() {
+        return new MaxData();
+    }
+
+    public void init(MaxData data) {
+        data.max = null;
+    }
+
+    public void accumulate(MaxData data,
+                           Object value) {
+        if (value != null) {
+            BigDecimal bdValue = (BigDecimal) value;
+            data.max = data.max == null || data.max.compareTo(bdValue) < 0 ?
+                       bdValue :
+                       data.max;
+        }
+    }
+
+    public void reverse(MaxData data,
+                        Object value) {
+    }
+
+    @Override
+    public boolean tryReverse( MaxData data, Object value ) {
+        if (value != null) {
+            return data.max.compareTo((BigDecimal) value) > 0;
+        }
+        return true;
+    }
+
+    public Object getResult(MaxData data) {
+        return data.max;
+    }
+
+    public boolean supportsReverse() {
+        return false;
+    }
+
+    public Class<?> getResultType() {
+        return BigDecimal.class;
+    }
+}
diff --git 
a/drools-core/src/main/java/org/drools/core/base/accumulators/BigDecimalMinAccumulateFunction.java
 
b/drools-core/src/main/java/org/drools/core/base/accumulators/BigDecimalMinAccumulateFunction.java
new file mode 100644
index 0000000000..c3f0a62831
--- /dev/null
+++ 
b/drools-core/src/main/java/org/drools/core/base/accumulators/BigDecimalMinAccumulateFunction.java
@@ -0,0 +1,98 @@
+/**
+ * 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.drools.core.base.accumulators;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.math.BigDecimal;
+
+/**
+ * An implementation of an accumulator capable of calculating minimum values
+ */
+public class BigDecimalMinAccumulateFunction extends 
AbstractAccumulateFunction<BigDecimalMinAccumulateFunction.MinData> {
+
+    public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+    }
+
+    protected static class MinData implements Externalizable {
+        public BigDecimal min = null;
+
+        public MinData() {}
+
+        public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+            min = (BigDecimal) in.readObject();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject(min);
+        }
+
+        @Override
+        public String toString() {
+            return "min";
+        }
+    }
+
+    public MinData createContext() {
+        return new MinData();
+    }
+
+    public void init(MinData data) {
+        data.min = null;
+    }
+
+    public void accumulate(MinData data,
+                           Object value) {
+        if (value != null) {
+            BigDecimal bdValue = (BigDecimal) value;
+            data.min = data.min == null || data.min.compareTo(bdValue) > 0 ?
+                       bdValue :
+                       data.min;
+        }
+    }
+
+    @Override
+    public boolean tryReverse( MinData data, Object value ) {
+        if (value != null) {
+            return data.min.compareTo((BigDecimal) value) < 0;
+        }
+        return true;
+    }
+
+    public void reverse(MinData data,
+                        Object value) {
+    }
+
+    public Object getResult(MinData data) {
+        return data.min;
+    }
+
+    public boolean supportsReverse() {
+        return false;
+    }
+
+    public Class<?> getResultType() {
+        return BigDecimal.class;
+    }
+}
diff --git 
a/drools-core/src/main/java/org/drools/core/base/accumulators/BigIntegerMaxAccumulateFunction.java
 
b/drools-core/src/main/java/org/drools/core/base/accumulators/BigIntegerMaxAccumulateFunction.java
new file mode 100644
index 0000000000..2fee047f05
--- /dev/null
+++ 
b/drools-core/src/main/java/org/drools/core/base/accumulators/BigIntegerMaxAccumulateFunction.java
@@ -0,0 +1,100 @@
+/**
+ * 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.drools.core.base.accumulators;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.math.BigInteger;
+
+/**
+ * An implementation of an accumulator capable of calculating maximum values
+ */
+public class BigIntegerMaxAccumulateFunction extends 
AbstractAccumulateFunction<BigIntegerMaxAccumulateFunction.MaxData> {
+
+    public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+
+    }
+
+    protected static class MaxData implements Externalizable {
+        public BigInteger max = null;
+
+        public MaxData() {}
+
+        public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+            max = (BigInteger) in.readObject();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject(max);
+        }
+
+        @Override
+        public String toString() {
+            return "max";
+        }
+    }
+
+    public MaxData createContext() {
+        return new MaxData();
+    }
+
+    public void init(MaxData data) {
+        data.max = null;
+    }
+
+    public void accumulate(MaxData data,
+                           Object value) {
+        if (value != null) {
+            BigInteger biValue = (BigInteger) value;
+            data.max = data.max == null || data.max.compareTo(biValue) < 0 ?
+                       biValue :
+                       data.max;
+        }
+    }
+
+    public void reverse(MaxData data,
+                        Object value) {
+    }
+
+    @Override
+    public boolean tryReverse( MaxData data, Object value ) {
+        if (value != null) {
+            return data.max.compareTo((BigInteger) value) > 0;
+        }
+        return true;
+    }
+
+    public Object getResult(MaxData data) {
+        return data.max;
+    }
+
+    public boolean supportsReverse() {
+        return false;
+    }
+
+    public Class<?> getResultType() {
+        return BigInteger.class;
+    }
+}
diff --git 
a/drools-core/src/main/java/org/drools/core/base/accumulators/BigIntegerMinAccumulateFunction.java
 
b/drools-core/src/main/java/org/drools/core/base/accumulators/BigIntegerMinAccumulateFunction.java
new file mode 100644
index 0000000000..f292e73aff
--- /dev/null
+++ 
b/drools-core/src/main/java/org/drools/core/base/accumulators/BigIntegerMinAccumulateFunction.java
@@ -0,0 +1,98 @@
+/**
+ * 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.drools.core.base.accumulators;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.math.BigInteger;
+
+/**
+ * An implementation of an accumulator capable of calculating minimum values
+ */
+public class BigIntegerMinAccumulateFunction extends 
AbstractAccumulateFunction<BigIntegerMinAccumulateFunction.MinData> {
+
+    public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+    }
+
+    protected static class MinData implements Externalizable {
+        public BigInteger min = null;
+
+        public MinData() {}
+
+        public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+            min = (BigInteger) in.readObject();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject(min);
+        }
+
+        @Override
+        public String toString() {
+            return "min";
+        }
+    }
+
+    public MinData createContext() {
+        return new MinData();
+    }
+
+    public void init(MinData data) {
+        data.min = null;
+    }
+
+    public void accumulate(MinData data,
+                           Object value) {
+        if (value != null) {
+            BigInteger biValue = (BigInteger) value;
+            data.min = data.min == null || data.min.compareTo(biValue) > 0 ?
+                       biValue :
+                       data.min;
+        }
+    }
+
+    @Override
+    public boolean tryReverse( MinData data, Object value ) {
+        if (value != null) {
+            return data.min.compareTo((BigInteger) value) < 0;
+        }
+        return true;
+    }
+
+    public void reverse(MinData data,
+                        Object value) {
+    }
+
+    public Object getResult(MinData data) {
+        return data.min;
+    }
+
+    public boolean supportsReverse() {
+        return false;
+    }
+
+    public Class<?> getResultType() {
+        return BigInteger.class;
+    }
+}
diff --git 
a/drools-core/src/main/resources/META-INF/kie.default.properties.conf 
b/drools-core/src/main/resources/META-INF/kie.default.properties.conf
index f3fcd0b2e6..823723c7e1 100644
--- a/drools-core/src/main/resources/META-INF/kie.default.properties.conf
+++ b/drools-core/src/main/resources/META-INF/kie.default.properties.conf
@@ -44,10 +44,14 @@ drools.accumulate.function.max = 
org.drools.core.base.accumulators.MaxAccumulate
 drools.accumulate.function.maxN = 
org.drools.core.base.accumulators.NumericMaxAccumulateFunction
 drools.accumulate.function.maxI = 
org.drools.core.base.accumulators.IntegerMaxAccumulateFunction
 drools.accumulate.function.maxL = 
org.drools.core.base.accumulators.LongMaxAccumulateFunction
+drools.accumulate.function.maxBI = 
org.drools.core.base.accumulators.BigIntegerMaxAccumulateFunction
+drools.accumulate.function.maxBD = 
org.drools.core.base.accumulators.BigDecimalMaxAccumulateFunction
 drools.accumulate.function.min = 
org.drools.core.base.accumulators.MinAccumulateFunction
 drools.accumulate.function.minN = 
org.drools.core.base.accumulators.NumericMinAccumulateFunction
 drools.accumulate.function.minI = 
org.drools.core.base.accumulators.IntegerMinAccumulateFunction
 drools.accumulate.function.minL = 
org.drools.core.base.accumulators.LongMinAccumulateFunction
+drools.accumulate.function.minBI = 
org.drools.core.base.accumulators.BigIntegerMinAccumulateFunction
+drools.accumulate.function.minBD = 
org.drools.core.base.accumulators.BigDecimalMinAccumulateFunction
 drools.accumulate.function.count = 
org.drools.core.base.accumulators.CountAccumulateFunction
 drools.accumulate.function.collectList = 
org.drools.core.base.accumulators.CollectListAccumulateFunction
 drools.accumulate.function.collectSet = 
org.drools.core.base.accumulators.CollectSetAccumulateFunction
diff --git 
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java
 
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java
index 53b1c746f1..4213446b7b 100644
--- 
a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java
+++ 
b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/compiler/integrationtests/AccumulateTest.java
@@ -22,6 +22,7 @@ import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -37,6 +38,7 @@ import 
org.drools.compiler.integrationtests.incrementalcompilation.TestUtil;
 import org.drools.core.RuleSessionConfiguration;
 import org.drools.commands.runtime.rule.InsertElementsCommand;
 import org.drools.kiesession.rulebase.InternalKnowledgeBase;
+import org.drools.mvel.compiler.Primitives;
 import org.drools.testcoverage.common.model.Cheese;
 import org.drools.testcoverage.common.model.Cheesery;
 import org.drools.testcoverage.common.model.Order;
@@ -3941,4 +3943,158 @@ public class AccumulateTest {
             kieSession.dispose();
         }
     }
+
+    @ParameterizedTest(name = "KieBase type={0}")
+    @MethodSource("parameters")
+    void minWithBigDecimalHighAccuracy(KieBaseTestConfiguration 
kieBaseTestConfiguration) {
+        final String drl =
+                "import " + Primitives.class.getCanonicalName() + ";\n" +
+                        "global java.util.List results;\n" +
+                        "rule R1 when\n" +
+                        "    accumulate(Primitives($bd : bigDecimal), $min : 
min($bd))\n" +
+                        "then\n" +
+                        "    results.add($min);\n" +
+                        "    results.add($min.scale());\n" + // BigDecimal 
method
+                        "end";
+
+        final KieBase kieBase = 
KieBaseUtil.getKieBaseFromKieModuleFromDrl("accumulate-test", 
kieBaseTestConfiguration, drl);
+        final KieSession kieSession = kieBase.newKieSession();
+        try {
+            List<Number> results = new ArrayList<>();
+            kieSession.setGlobal("results", results);
+            Primitives p1 = new Primitives();
+            p1.setBigDecimal(new BigDecimal("2024043020240501130000"));
+            Primitives p2_smallest = new Primitives();
+            p2_smallest.setBigDecimal(new 
BigDecimal("2024043020240501120000"));
+            Primitives p3 = new Primitives();
+            p3.setBigDecimal(new BigDecimal("2024043020240501150000"));
+
+            kieSession.insert(p1);
+            kieSession.insert(p2_smallest);
+            kieSession.insert(p3);
+            kieSession.fireAllRules();
+            assertThat(results).hasSize(2);
+            assertThat(results.get(0)).isEqualTo(p2_smallest.getBigDecimal());
+            assertThat(results.get(1)).isEqualTo(0);
+        } finally {
+            kieSession.dispose();
+        }
+    }
+
+    @ParameterizedTest(name = "KieBase type={0}")
+    @MethodSource("parameters")
+    void minWithBigIntegerHighAccuracy(KieBaseTestConfiguration 
kieBaseTestConfiguration) {
+        final String drl =
+                "import " + Primitives.class.getCanonicalName() + ";\n" +
+                        "global java.util.List results;\n" +
+                        "rule R1 when\n" +
+                        "    accumulate(Primitives($bi : bigInteger), $min : 
min($bi))\n" +
+                        "then\n" +
+                        "    results.add($min);\n" +
+                        "    results.add($min.nextProbablePrime());\n" + // 
BigInteger method
+                        "end";
+
+        final KieBase kieBase = 
KieBaseUtil.getKieBaseFromKieModuleFromDrl("accumulate-test", 
kieBaseTestConfiguration, drl);
+        final KieSession kieSession = kieBase.newKieSession();
+        try {
+            List<Number> results = new ArrayList<>();
+            kieSession.setGlobal("results", results);
+            Primitives p1 = new Primitives();
+            p1.setBigInteger(new BigInteger("2024043020240501130000"));
+            Primitives p2_smallest = new Primitives();
+            p2_smallest.setBigInteger(new 
BigInteger("2024043020240501120000"));
+            Primitives p3 = new Primitives();
+            p3.setBigInteger(new BigInteger("2024043020240501150000"));
+
+            kieSession.insert(p1);
+            kieSession.insert(p2_smallest);
+            kieSession.insert(p3);
+            kieSession.fireAllRules();
+            assertThat(results).hasSize(2);
+            assertThat(results.get(0)).isEqualTo(p2_smallest.getBigInteger());
+
+            // nextProbablePrime value is not important.
+            // Just to make sure it doesn't raise a compilation error.
+            assertThat(results.get(1)).isNotNull();
+        } finally {
+            kieSession.dispose();
+        }
+    }
+
+    @ParameterizedTest(name = "KieBase type={0}")
+    @MethodSource("parameters")
+    void maxWithBigDecimalHighAccuracy(KieBaseTestConfiguration 
kieBaseTestConfiguration) {
+        final String drl =
+                "import " + Primitives.class.getCanonicalName() + ";\n" +
+                        "global java.util.List results;\n" +
+                        "rule R1 when\n" +
+                        "    accumulate(Primitives($bd : bigDecimal), $max : 
max($bd))\n" +
+                        "then\n" +
+                        "    results.add($max);\n" +
+                        "    results.add($max.scale());\n" + // BigDecimal 
method
+                        "end";
+
+        final KieBase kieBase = 
KieBaseUtil.getKieBaseFromKieModuleFromDrl("accumulate-test", 
kieBaseTestConfiguration, drl);
+        final KieSession kieSession = kieBase.newKieSession();
+        try {
+            List<Number> results = new ArrayList<>();
+            kieSession.setGlobal("results", results);
+            Primitives p1 = new Primitives();
+            p1.setBigDecimal(new BigDecimal("2024043020240501130000"));
+            Primitives p2_largest = new Primitives();
+            p2_largest.setBigDecimal(new BigDecimal("2024043020240501150000"));
+            Primitives p3 = new Primitives();
+            p3.setBigDecimal(new BigDecimal("2024043020240501120000"));
+
+            kieSession.insert(p1);
+            kieSession.insert(p2_largest);
+            kieSession.insert(p3);
+            kieSession.fireAllRules();
+            assertThat(results).hasSize(2);
+            assertThat(results.get(0)).isEqualTo(p2_largest.getBigDecimal());
+            assertThat(results.get(1)).isEqualTo(0);
+        } finally {
+            kieSession.dispose();
+        }
+    }
+
+    @ParameterizedTest(name = "KieBase type={0}")
+    @MethodSource("parameters")
+    void maxWithBigIntegerHighAccuracy(KieBaseTestConfiguration 
kieBaseTestConfiguration) {
+        final String drl =
+                "import " + Primitives.class.getCanonicalName() + ";\n" +
+                        "global java.util.List results;\n" +
+                        "rule R1 when\n" +
+                        "    accumulate(Primitives($bi : bigInteger), $max : 
max($bi))\n" +
+                        "then\n" +
+                        "    results.add($max);\n" +
+                        "    results.add($max.nextProbablePrime());\n" + // 
BigInteger method
+                        "end";
+
+        final KieBase kieBase = 
KieBaseUtil.getKieBaseFromKieModuleFromDrl("accumulate-test", 
kieBaseTestConfiguration, drl);
+        final KieSession kieSession = kieBase.newKieSession();
+        try {
+            List<Number> results = new ArrayList<>();
+            kieSession.setGlobal("results", results);
+            Primitives p1 = new Primitives();
+            p1.setBigInteger(new BigInteger("2024043020240501130000"));
+            Primitives p2_largest = new Primitives();
+            p2_largest.setBigInteger(new BigInteger("2024043020240501150000"));
+            Primitives p3 = new Primitives();
+            p3.setBigInteger(new BigInteger("2024043020240501120000"));
+
+            kieSession.insert(p1);
+            kieSession.insert(p2_largest);
+            kieSession.insert(p3);
+            kieSession.fireAllRules();
+            assertThat(results).hasSize(2);
+            assertThat(results.get(0)).isEqualTo(p2_largest.getBigInteger());
+
+            // nextProbablePrime value is not important.
+            // Just to make sure it doesn't raise a compilation error.
+            assertThat(results.get(1)).isNotNull();
+        } finally {
+            kieSession.dispose();
+        }
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to