From e01dc1c4e34aa016e1fb51f7ad2f2f4b84cd6b2b Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Tue, 17 Jun 2025 17:44:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=A0=B8=E5=BF=83=E5=8F=91?= =?UTF-8?q?=E5=B8=83:=208.2.80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基础框架发布: 8.2.18 1) 规则引擎中,修复资源深度复制时, 选项参数不应该加 NEW。 --- .../rule/core/code/ExecuteUnit4Resource.java | 131 +++++++++++++----- .../controller/ExecuteUnitWebController.java | 1 - 2 files changed, 98 insertions(+), 34 deletions(-) diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Resource.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Resource.java index 3b559e34..93c29e4d 100644 --- a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Resource.java +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Resource.java @@ -1,16 +1,18 @@ package io.sc.engine.rule.core.code; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.core.JsonProcessingException; import io.sc.engine.rule.core.po.lib.Indicator; import io.sc.engine.rule.core.po.lib.IndicatorLib; +import io.sc.engine.rule.core.po.lib.IndicatorProcessor; import io.sc.engine.rule.core.po.lib.Lib; import io.sc.engine.rule.core.po.model.Model; import io.sc.engine.rule.core.po.model.Parameter; -import io.sc.engine.rule.core.po.model.ParameterProcessor; import io.sc.engine.rule.core.po.model.parameter.IndicatorParameter; import io.sc.engine.rule.core.po.resource.ModelResource; import io.sc.engine.rule.core.po.resource.Resource; import io.sc.engine.rule.core.util.PlaceHolder; +import io.sc.platform.util.ObjectMapperUtil; import java.util.*; @@ -41,19 +43,7 @@ public class ExecuteUnit4Resource extends ExecuteUnit{ } public void optimize(){ - if(1==1) return; - if(resource instanceof ModelResource){ - ModelResource modelResource =(ModelResource) resource; - Model model =modelResource.getModel(); - List processors =model.getAllParameterProcessors(); - PlaceHolder placeHolder =new PlaceHolder(); - for(ParameterProcessor processor : processors){ - placeHolder.add(processor.extractPlaceHolder()); - } - for(String s : placeHolder.getVariableRefs()){ - System.out.println(s); - } - } + //optimizeLibs(); } private void optimizeLibs(){ @@ -64,52 +54,127 @@ public class ExecuteUnit4Resource extends ExecuteUnit{ if(parameters==null || parameters.isEmpty()){ return; } - List requiredLibs =new ArrayList<>(); + Map> cache =new HashMap<>(); for(Parameter parameter : parameters){ if(parameter instanceof IndicatorParameter){ IndicatorParameter indicatorParameter =(IndicatorParameter)parameter; String libCode =indicatorParameter.getLibCode(); Integer libVersion =indicatorParameter.getLibVersion(); + + LibId libId =new LibId(libCode,libVersion); String indicatorCode =indicatorParameter.getIndicatorCode(); - findRefIndicators(requiredLibs,indicatorParameter.getLibCode(),indicatorParameter.getLibVersion(),indicatorParameter.getIndicatorCode()); + Set requiredIndicatorCodes =cache.get(libId); + if(requiredIndicatorCodes==null){ + requiredIndicatorCodes =new LinkedHashSet<>(); + cache.put(libId,requiredIndicatorCodes); + } + IndicatorLib lib =findLib(libCode,libVersion); + if(lib!=null) { + findRefIndicators(lib, indicatorCode, requiredIndicatorCodes); + } } } - + resetLibs(cache); } } - private void optimizeDictionaries(){ - - } - - private void optimizeFunctions(){ - - } - - private Lib findLib(String code, Integer version){ + private IndicatorLib findLib(String code, Integer version){ if(libs==null && libs.isEmpty()){ return null; } for(Lib lib : libs) { - if(lib.getCode().equals(code) && lib.getVersion().equals(version)){ return lib; } + if(lib.getCode().equals(code) && lib.getVersion().equals(version)){ + if(lib instanceof IndicatorLib) { + return (IndicatorLib)lib; + } + } } return null; } - private List findIndicatorsByLib(String libCode, Integer libVersion){ - if(libs==null && libs.isEmpty()){ - return Collections.emptyList(); + private void findRefIndicators(IndicatorLib lib, String indicatorCode, Set requiredCodes){ + List indicators =lib.getIndicators(); + if(indicators!=null && !indicators.isEmpty()){ + for(Indicator indicator : indicators){ + if(indicator.getCode().equals(indicatorCode)){ + if(requiredCodes.contains(indicatorCode)){ + continue; + } + requiredCodes.add(indicatorCode); + List processors =indicator.getProcessors(); + if(processors!=null && !processors.isEmpty()){ + for(IndicatorProcessor processor : processors){ + PlaceHolder placeHolder =processor.extractPlaceHolder(); + Set refs =placeHolder.getVariableRefs(); + for(String ref : refs){ + findRefIndicators(lib,ref,requiredCodes); + } + } + } + } + } + } + } + + private void resetLibs(Map> requiredMap){ + if(libs==null || libs.isEmpty()){ + return; } for(Lib lib : libs){ if(lib instanceof IndicatorLib){ + List minIndicators =new ArrayList<>(); // 需要的最小化指标集 + Set minIndicatorCodes =requiredMap.get(new LibId(lib.getCode(),lib.getVersion())); + IndicatorLib indicatorLib =(IndicatorLib)lib; - return indicatorLib.getIndicators(); + List indicators =indicatorLib.getIndicators(); + if(indicators!=null && !indicators.isEmpty()){ + for(Indicator indicator : indicators){ + if(minIndicatorCodes.contains(indicator.getCode())){ + minIndicators.add(indicator); + } + } + } + indicatorLib.setIndicators(minIndicators); } } - return Collections.emptyList(); } - private void findRefIndicators(List requiredLibs, String libCode, Integer libVersion, String indicatorCode){ + static class LibId { + private String code; + private Integer version; + + public LibId(String code, Integer version){ + this.code =code; + this.version =version; + } + + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + LibId libID = (LibId) o; + return Objects.equals(code, libID.code) && Objects.equals(version, libID.version); + } + + @Override + public int hashCode() { + return Objects.hash(code, version); + } } } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/controller/ExecuteUnitWebController.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/controller/ExecuteUnitWebController.java index e68ef1a2..bed55cb0 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/controller/ExecuteUnitWebController.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/controller/ExecuteUnitWebController.java @@ -61,7 +61,6 @@ public class ExecuteUnitWebController { @PostMapping(value="validateGroovySourceCode") public void validateGroovySourceCode(@RequestBody Map body) throws Exception{ - System.out.println(body.get("script")); executableUnitService.validateGroovySourceCode(body.get("script")); } }