diff --git a/reasoner/runner/runner-common/src/test/java/com/antgroup/openspg/reasoner/rule/RuleRunnerTest.java b/reasoner/runner/runner-common/src/test/java/com/antgroup/openspg/reasoner/rule/RuleRunnerTest.java index 4e4bd402..d885bf2b 100644 --- a/reasoner/runner/runner-common/src/test/java/com/antgroup/openspg/reasoner/rule/RuleRunnerTest.java +++ b/reasoner/runner/runner-common/src/test/java/com/antgroup/openspg/reasoner/rule/RuleRunnerTest.java @@ -133,18 +133,20 @@ public class RuleRunnerTest { Map context = new HashMap<>(); context.put("A", 1000); context.put("B", 100); + context.put("A/B*C", 200); boolean rst = RuleRunner.getInstance() .check( context, Lists.newArrayList( + "R0 = get_value(\"A/B*C\") == 200 && get_value() == null && get_value(\"B\") == 100", "R1 = A + B == 1100", "R2 = A > B", "R3 = A >= B", "R4 = B < A", "R5 = B <= A", "R6 = A != B", - "R1 && R2 && R3 && R4 && R5 && R6"), + "R0 && R1 && R2 && R3 && R4 && R5 && R6"), ""); Assert.assertTrue(rst); } diff --git a/reasoner/udf/src/main/java/com/antgroup/openspg/reasoner/udf/rule/RuleRunner.java b/reasoner/udf/src/main/java/com/antgroup/openspg/reasoner/udf/rule/RuleRunner.java index b25312a8..e67633cf 100644 --- a/reasoner/udf/src/main/java/com/antgroup/openspg/reasoner/udf/rule/RuleRunner.java +++ b/reasoner/udf/src/main/java/com/antgroup/openspg/reasoner/udf/rule/RuleRunner.java @@ -20,6 +20,7 @@ import com.antgroup.openspg.reasoner.udf.UdfMngFactory; import com.antgroup.openspg.reasoner.udf.model.RuntimeUdfMeta; import com.antgroup.openspg.reasoner.udf.model.UdfOperatorTypeEnum; import com.antgroup.openspg.reasoner.udf.rule.op.OperatorEqualsLessMore; +import com.antgroup.openspg.reasoner.udf.rule.op.OperatorGetValue; import com.antgroup.openspg.reasoner.udf.rule.op.OperatorIn; import com.antgroup.openspg.reasoner.udf.rule.op.OperatorLike; import com.antgroup.openspg.reasoner.udf.rule.op.OperatorMultiDiv; @@ -179,6 +180,7 @@ public class RuleRunner { EXPRESS_RUNNER.setShortCircuit(true); registerUdf(); overrideOperator(); + EXPRESS_RUNNER.addFunction("get_value", new OperatorGetValue()); } /** register all udfs */ diff --git a/reasoner/udf/src/main/java/com/antgroup/openspg/reasoner/udf/rule/op/OperatorGetValue.java b/reasoner/udf/src/main/java/com/antgroup/openspg/reasoner/udf/rule/op/OperatorGetValue.java new file mode 100644 index 00000000..7bd9097b --- /dev/null +++ b/reasoner/udf/src/main/java/com/antgroup/openspg/reasoner/udf/rule/op/OperatorGetValue.java @@ -0,0 +1,42 @@ +/* + * Copyright 2023 OpenSPG Authors + * + * Licensed 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. + */ + +package com.antgroup.openspg.reasoner.udf.rule.op; + +import com.ql.util.express.ArraySwap; +import com.ql.util.express.InstructionSetContext; +import com.ql.util.express.OperateData; +import com.ql.util.express.config.QLExpressRunStrategy; +import com.ql.util.express.instruction.OperateDataCacheManager; +import com.ql.util.express.instruction.op.OperatorBase; + +public class OperatorGetValue extends OperatorBase { + @Override + public OperateData executeInner(InstructionSetContext parent, ArraySwap list) throws Exception { + Object[] parameters = new Object[list.length]; + + for (int i = 0; i < list.length; ++i) { + if (list.get(i) == null && QLExpressRunStrategy.isAvoidNullPointer()) { + parameters[i] = null; + } else { + parameters[i] = list.get(i).getObject(parent); + } + } + if (parameters.length <= 0) { + return OperateDataCacheManager.fetchOperateData(null, Object.class); + } + String key = String.valueOf(parameters[0]); + Object result = parent.getParent().get(key); + return OperateDataCacheManager.fetchOperateData(result, Object.class); + } +}