diff --git a/api/src/main/java/org/eclipse/daanse/olap/api/Context.java b/api/src/main/java/org/eclipse/daanse/olap/api/Context.java index 457fd094..d71d4ff9 100644 --- a/api/src/main/java/org/eclipse/daanse/olap/api/Context.java +++ b/api/src/main/java/org/eclipse/daanse/olap/api/Context.java @@ -176,4 +176,6 @@ default List getKeywordList() { ExpressionCompiler createDependencyTestingCompiler(ExpressionCompiler compiler); List getCustomAggregators(); + + boolean isCashEnabled(String cube); } diff --git a/common/src/main/java/org/eclipse/daanse/olap/common/ConfigConstants.java b/common/src/main/java/org/eclipse/daanse/olap/common/ConfigConstants.java index 267760ad..35082c77 100644 --- a/common/src/main/java/org/eclipse/daanse/olap/common/ConfigConstants.java +++ b/common/src/main/java/org/eclipse/daanse/olap/common/ConfigConstants.java @@ -28,6 +28,8 @@ public class ConfigConstants { public static final String SOLVE_ORDER_MODE = "solveOrderMode"; public static final String CHOOSE_AGGREGATE_BY_VOLUME = "chooseAggregateByVolume"; public static final String DISABLE_CACHING = "disableCaching"; + public static final String DISABLE_CACHING_CATALOGS = "disableCachingCatalogs"; + public static final String DISABLE_CACHING_CUBES = "disableCachingCubes"; public static final String DISABLE_LOCAL_SEGMENT_CACHE = "disableLocalSegmentCache"; public static final String ENABLE_GROUPING_SETS = "enableGroupingSets"; public static final String ENABLE_SESSION_CACHING = "enableSessionCaching"; @@ -81,6 +83,8 @@ public class ConfigConstants { public static final String SOLVE_ORDER_MODE_DEFAULT_VALUE = "ABSOLUTE"; public static final boolean CHOOSE_AGGREGATE_BY_VOLUME_DEFAULT_VALUE = false; public static final boolean DISABLE_CACHING_DEFAULT_VALUE = false; + public static final String DISABLE_CACHING_CATALOGS_DEFAULT_VALUE = ""; + public static final String DISABLE_CACHING_CUBES_DEFAULT_VALUE = ""; public static final boolean DISABLE_LOCAL_SEGMENT_CACHE_DEFAULT_VALUE = false; public static final boolean ENABLE_GROUPING_SETS_DEFAULT_VALUE = false; public static final boolean ENABLE_SESSION_CACHING_DEFAULT_VALUE = false; diff --git a/common/src/main/java/org/eclipse/daanse/olap/core/AbstractBasicContext.java b/common/src/main/java/org/eclipse/daanse/olap/core/AbstractBasicContext.java index 645eb5ce..c4cf70a6 100644 --- a/common/src/main/java/org/eclipse/daanse/olap/core/AbstractBasicContext.java +++ b/common/src/main/java/org/eclipse/daanse/olap/core/AbstractBasicContext.java @@ -14,7 +14,9 @@ package org.eclipse.daanse.olap.core; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; @@ -35,6 +37,7 @@ import org.eclipse.daanse.olap.api.monitor.event.MdxStatementStartEvent; import org.eclipse.daanse.olap.api.monitor.event.ServertEventCommon; import org.eclipse.daanse.olap.api.result.ResultShepherd; +import org.eclipse.daanse.olap.common.ConfigConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -249,4 +252,34 @@ public T getConfigValue(String key, T dflt, Class clazz) { return dflt; } } + + @Override + public boolean isCashEnabled(String cubeName) { + final String catalog = getName(); + if (getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class)) { + return false; + } else { + String catalogNames = getConfigValue(ConfigConstants.DISABLE_CACHING_CATALOGS, ConfigConstants.DISABLE_CACHING_CATALOGS_DEFAULT_VALUE, String.class); + String[] catalogNamesArray = catalogNames.split(";"); + if (catalogNamesArray != null && Arrays.stream(catalogNamesArray).anyMatch(it -> catalog.equals(it))) { + return false; + } else { + String catalogCubeNames = getConfigValue(ConfigConstants.DISABLE_CACHING_CUBES, ConfigConstants.DISABLE_CACHING_CUBES_DEFAULT_VALUE, String.class); + String[] cubesNamesArray = catalogCubeNames.split(";"); + if (cubesNamesArray != null){ + Map> map = new HashMap<>(); + for (String p : catalogNamesArray) { + String[] arr = p.split("-->"); + if (arr != null && arr.length == 2) { + map.computeIfAbsent(arr[0], k -> new ArrayList<>()).add(arr[1]); + } + } + if (map.containsKey(catalog) && map.get(catalog).contains(cubeName)) { + return false; + } + } + } + } + return true; + } }