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

mariofusco 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 011e17a70e Cache compiled dtables during the building of a KieProject 
(#6097)
011e17a70e is described below

commit 011e17a70e74988e4c75a83e208faf912ec147ac
Author: Mario Fusco <[email protected]>
AuthorDate: Tue Sep 24 11:45:14 2024 +0200

    Cache compiled dtables during the building of a KieProject (#6097)
    
    * Cache compiled dtables during the building of a KieProject
    
    * wip
    
    * wip
---
 .../compiler/kie/builder/impl/KieBuilderImpl.java  |  6 ++++
 .../decisiontable/DecisionTableProviderImpl.java   | 40 ++++++++++++++++------
 .../drl/extensions/DecisionTableFactory.java       |  6 ++++
 .../drl/extensions/DecisionTableProvider.java      |  8 ++---
 4 files changed, 45 insertions(+), 15 deletions(-)

diff --git 
a/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieBuilderImpl.java
 
b/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieBuilderImpl.java
index ec1cb65533..61e1796506 100644
--- 
a/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieBuilderImpl.java
+++ 
b/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieBuilderImpl.java
@@ -298,6 +298,12 @@ public class KieBuilderImpl
                 kieRepository.addKieModule( kDep );
             }
         }
+
+        clearBuilderCache();
+    }
+
+    private static void clearBuilderCache() {
+        DecisionTableFactory.clearCompilerCache();
     }
 
     private void addKBasesFilesToTrg() {
diff --git 
a/drools-decisiontables/src/main/java/org/drools/decisiontable/DecisionTableProviderImpl.java
 
b/drools-decisiontables/src/main/java/org/drools/decisiontable/DecisionTableProviderImpl.java
index a809b8ff8e..a843964a7f 100644
--- 
a/drools-decisiontables/src/main/java/org/drools/decisiontable/DecisionTableProviderImpl.java
+++ 
b/drools-decisiontables/src/main/java/org/drools/decisiontable/DecisionTableProviderImpl.java
@@ -27,6 +27,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.drools.decisiontable.parser.xls.PropertiesSheetListener;
 import org.drools.drl.extensions.DecisionTableProvider;
@@ -42,7 +43,9 @@ public class DecisionTableProviderImpl
     implements
     DecisionTableProvider {
 
-    private static final transient Logger logger = LoggerFactory.getLogger( 
DecisionTableProviderImpl.class );
+    private static final Logger logger = LoggerFactory.getLogger( 
DecisionTableProviderImpl.class );
+
+    private Map<String, String> compiledDtablesCache = new 
ConcurrentHashMap<>();
 
     @Override
     public String loadFromResource(Resource resource,
@@ -50,8 +53,6 @@ public class DecisionTableProviderImpl
 
         try {
             return compileResource( resource, configuration );
-        } catch (IOException e) {
-            throw new UncheckedIOException( e );
         } catch (Exception e) {
             throw new DecisionTableParseException(resource, e);
         }
@@ -78,29 +79,46 @@ public class DecisionTableProviderImpl
         return drls;
     }
 
-    private String compileResource(Resource resource,
-                                   DecisionTableConfiguration configuration) 
throws IOException {
+    private String compileResource(Resource resource, 
DecisionTableConfiguration configuration) {
+        if (resource.getSourcePath() == null) {
+            return internalCompileResource(resource, configuration);
+        }
+        String resourceKey = resource.getSourcePath() + "?trimCell=" + 
configuration.isTrimCell() + "&worksheetName=" + 
configuration.getWorksheetName();
+        return compiledDtablesCache.computeIfAbsent(resourceKey, path -> 
internalCompileResource(resource, configuration));
+    }
+
+    private String internalCompileResource(Resource resource, 
DecisionTableConfiguration configuration) throws UncheckedIOException {
         SpreadsheetCompiler compiler = new 
SpreadsheetCompiler(configuration.isTrimCell());
 
         switch ( configuration.getInputType() ) {
             case XLS :
             case XLSX :
                 if ( StringUtils.isEmpty( configuration.getWorksheetName() ) ) 
{
-                    return compiler.compile( resource,
-                                             InputType.XLS );
+                    return compiler.compile( resource, InputType.XLS );
                 } else {
-                    return compiler.compile( resource.getInputStream(),
-                                             configuration.getWorksheetName() 
);
+                    try {
+                        return compiler.compile( resource.getInputStream(), 
configuration.getWorksheetName() );
+                    } catch (IOException e) {
+                        throw new UncheckedIOException(e);
+                    }
                 }
             case CSV : {
-                return compiler.compile( resource.getInputStream(),
-                                         InputType.CSV );
+                try {
+                    return compiler.compile( resource.getInputStream(), 
InputType.CSV );
+                } catch (IOException e) {
+                    throw new UncheckedIOException(e);
+                }
             }
         }
 
         return null;
     }
 
+    @Override
+    public void clearCompilerCache() {
+        compiledDtablesCache.clear();
+    }
+
     @Override
     public Map<String, List<String[]>> loadPropertiesFromFile(File file, 
DecisionTableConfiguration configuration) {
         switch (configuration.getInputType()) {
diff --git 
a/drools-drl/drools-drl-extensions/src/main/java/org/drools/drl/extensions/DecisionTableFactory.java
 
b/drools-drl/drools-drl-extensions/src/main/java/org/drools/drl/extensions/DecisionTableFactory.java
index caef7c8ed2..ab46e27355 100644
--- 
a/drools-drl/drools-drl-extensions/src/main/java/org/drools/drl/extensions/DecisionTableFactory.java
+++ 
b/drools-drl/drools-drl-extensions/src/main/java/org/drools/drl/extensions/DecisionTableFactory.java
@@ -42,6 +42,12 @@ public class DecisionTableFactory {
         return getDecisionTableProvider().loadFromInputStreamWithTemplates( 
resource, configuration );
     }
 
+    public static void clearCompilerCache() {
+        if (provider != null) {
+            provider.clearCompilerCache();
+        }
+    }
+
     public static synchronized void 
setDecisionTableProvider(DecisionTableProvider provider) {
         DecisionTableFactory.provider = provider;
     }
diff --git 
a/drools-drl/drools-drl-extensions/src/main/java/org/drools/drl/extensions/DecisionTableProvider.java
 
b/drools-drl/drools-drl-extensions/src/main/java/org/drools/drl/extensions/DecisionTableProvider.java
index 7b2fbdc055..c11a1f9a78 100644
--- 
a/drools-drl/drools-drl-extensions/src/main/java/org/drools/drl/extensions/DecisionTableProvider.java
+++ 
b/drools-drl/drools-drl-extensions/src/main/java/org/drools/drl/extensions/DecisionTableProvider.java
@@ -29,13 +29,13 @@ import org.kie.internal.builder.DecisionTableConfiguration;
 
 public interface DecisionTableProvider extends KieService {
 
-    String loadFromResource(Resource resource,
-                            DecisionTableConfiguration configuration);
+    String loadFromResource(Resource resource, DecisionTableConfiguration 
configuration);
 
-    List<String> loadFromInputStreamWithTemplates(Resource resource,
-                                                  DecisionTableConfiguration 
configuration);
+    List<String> loadFromInputStreamWithTemplates(Resource resource, 
DecisionTableConfiguration configuration);
 
     Map<String,List<String[]>> loadPropertiesFromFile(File file, 
DecisionTableConfiguration configuration);
 
     Map<String,List<String[]>> loadPropertiesFromInputStream(InputStream 
inputStream, DecisionTableConfiguration configuration);
+
+    void clearCompilerCache();
 }


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

Reply via email to