From a1b8bfaf4f9ed85465d0d759c1dad191019b7653 Mon Sep 17 00:00:00 2001 From: dbulahov Date: Thu, 26 Mar 2026 16:55:26 +0300 Subject: [PATCH] add cash by catalog and cube Signed-off-by: dbulahov --- .../rolap/common/agg/SegmentCacheManager.java | 4 +-- .../rolap/common/agg/SegmentLoader.java | 22 +++++++------ .../rolap/common/nativize/RolapNativeSet.java | 9 ++--- .../rolap/common/result/BatchLoader.java | 2 +- .../common/result/FastBatchingCellReader.java | 4 +-- .../daanse/rolap/common/star/RolapStar.java | 10 +++++- .../rolap/common/star/RolapStarRegistry.java | 9 ++--- .../daanse/rolap/element/RolapCatalog.java | 10 +++--- .../daanse/rolap/element/RolapCube.java | 8 ++--- .../rolap/element/RolapCubeHierarchy.java | 7 ++-- .../daanse/rolap/element/RolapCubeLevel.java | 2 +- .../daanse/rolap/element/RolapDimension.java | 4 +-- .../daanse/rolap/element/RolapHierarchy.java | 13 ++++---- .../rolap/element/RolapPhysicalCube.java | 2 +- .../rolap/element/RolapVirtualCube.java | 2 +- .../daanse/rolap/common/RolapSchemaTest.java | 33 ++++++++++++------- .../daanse/rolap/common/RolapStarTest.java | 5 ++- 17 files changed, 86 insertions(+), 60 deletions(-) diff --git a/core/src/main/java/org/eclipse/daanse/rolap/common/agg/SegmentCacheManager.java b/core/src/main/java/org/eclipse/daanse/rolap/common/agg/SegmentCacheManager.java index 5c49b1d..c2fc15b 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/common/agg/SegmentCacheManager.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/common/agg/SegmentCacheManager.java @@ -521,7 +521,7 @@ public void remove( public void externalSegmentCreated( SegmentHeader header, Context context ) { - if ( context.getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class) ) { + if ( !context.isCashEnabled(header.cubeName) ) { // Ignore cache requests. return; } @@ -544,7 +544,7 @@ public void externalSegmentCreated( public void externalSegmentDeleted( SegmentHeader header, Context context ) { - if ( context.getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class) ) { + if ( !context.isCashEnabled( header.cubeName ) ) { // Ignore cache requests. return; } diff --git a/core/src/main/java/org/eclipse/daanse/rolap/common/agg/SegmentLoader.java b/core/src/main/java/org/eclipse/daanse/rolap/common/agg/SegmentLoader.java index 413f8c5..d451d36 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/common/agg/SegmentLoader.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/common/agg/SegmentLoader.java @@ -148,18 +148,20 @@ public SegmentLoader( SegmentCacheManager cacheMgr ) { */ public void load( int cellRequestCount, List groupingSets, List compoundPredicateList, List>> segmentFutures ) { - if ( !cacheMgr.getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class) ) { + //if ( !cacheMgr.getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class) ) { for ( GroupingSet groupingSet : groupingSets ) { for ( Segment segment : groupingSet.getSegments() ) { - final SegmentCacheIndex index = ((SegmentCacheIndexRegistry)cacheMgr.getIndexRegistry()).getIndex( segment.star ); - index.add( segment.getHeader(), new SegmentBuilder.StarSegmentConverter( segment.measure, - compoundPredicateList ), true ); - // Make sure that we are registered as a client of - // the segment by invoking getFuture. - index.getFuture( ExecutionContext.current().getExecution(), segment.getHeader() ) ; + if ( cacheMgr.getContext().isCashEnabled(segment.star.getCube().getName()) ) { + final SegmentCacheIndex index = ((SegmentCacheIndexRegistry)cacheMgr.getIndexRegistry()).getIndex( segment.star ); + index.add( segment.getHeader(), new SegmentBuilder.StarSegmentConverter( segment.measure, + compoundPredicateList ), true ); + // Make sure that we are registered as a client of + // the segment by invoking getFuture. + index.getFuture( ExecutionContext.current().getExecution(), segment.getHeader() ) ; + } } } - } + //} try { segmentFutures.add( cacheMgr.sqlExecutor.submit( new SegmentLoadCommand( ExecutionContext.current(), this, cellRequestCount, groupingSets, compoundPredicateList ) ) ); @@ -263,7 +265,7 @@ private void cacheSegment( RolapStar star, SegmentHeader header, SegmentBody bod // Also note that we push the segments to external cache after we have // called cacheMgr.loadSucceeded. That call will allow the current // query to proceed. - if ( !cacheMgr.getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class) ) { + if ( cacheMgr.getContext().isCashEnabled(header.cubeName) ) { cacheMgr.compositeCache.put( header, body ); cacheMgr.loadSucceeded( star, header, body ); } @@ -546,7 +548,7 @@ public void accept(final Statement stmt) { return RolapUtil.executeQuery( star.getContext(), pair.left, pair.right, 0, 0, executionContext, -1, -1, // Only one of the two callbacks are required, depending if we // cache the segments or not. - cacheMgr.getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class) ? callbackNoCaching : callbackWithCaching ); + !star.getContext().isCashEnabled(star.getCube().getName()) ? callbackNoCaching : callbackWithCaching ); } catch ( Throwable t ) { if ( Util.getMatchingCause( t, AbortException.class ) != null ) { return null; diff --git a/core/src/main/java/org/eclipse/daanse/rolap/common/nativize/RolapNativeSet.java b/core/src/main/java/org/eclipse/daanse/rolap/common/nativize/RolapNativeSet.java index fbed8c4..095a692 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/common/nativize/RolapNativeSet.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/common/nativize/RolapNativeSet.java @@ -41,6 +41,7 @@ import org.eclipse.daanse.olap.api.calc.ResultStyle; import org.eclipse.daanse.olap.api.calc.tuple.TupleList; import org.eclipse.daanse.olap.api.catalog.CatalogReader; +import org.eclipse.daanse.olap.api.element.Cube; import org.eclipse.daanse.olap.api.element.Hierarchy; import org.eclipse.daanse.olap.api.element.Level; import org.eclipse.daanse.olap.api.element.Member; @@ -229,15 +230,15 @@ public void setCompleteWithNullValues( boolean completeWithNullValues ) { public Object execute( ResultStyle desiredResultStyle ) { return switch (desiredResultStyle) { case ITERABLE -> executeList( - new SqlTupleReader( constraint ) ); - case MUTABLE_LIST, LIST -> executeList( new SqlTupleReader( constraint ) ); + new SqlTupleReader( constraint), constraint.getEvaluator().getCube() ); + case MUTABLE_LIST, LIST -> executeList( new SqlTupleReader( constraint ), constraint.getEvaluator().getCube() ); default -> throw ResultStyleException.generate( ResultStyle.ITERABLE_MUTABLELIST_LIST, Collections.singletonList( desiredResultStyle ) ); }; } - protected TupleList executeList( final SqlTupleReader tr ) { + protected TupleList executeList( final SqlTupleReader tr, Cube cube ) { tr.setMaxRows( maxRows ); for ( CrossJoinArg arg : args ) { addLevel( tr, arg ); @@ -328,7 +329,7 @@ protected TupleList executeList( final SqlTupleReader tr ) { context, null, new ArrayList<>() ) ); } - if ( !schemaReader.getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class) ) { + if ( schemaReader.getContext().isCashEnabled(cube.getName()) ) { if ( hasEnumTargets ) { if ( newPartialResult != null ) { cache.put( diff --git a/core/src/main/java/org/eclipse/daanse/rolap/common/result/BatchLoader.java b/core/src/main/java/org/eclipse/daanse/rolap/common/result/BatchLoader.java index 0e357dc..46a5de9 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/common/result/BatchLoader.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/common/result/BatchLoader.java @@ -143,7 +143,7 @@ private boolean loadFromCaches( final AggregationKey key, final SegmentBuilder.SegmentConverterImpl converter) { - if (cacheMgr.getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class)) { + if (!cacheMgr.getContext().isCashEnabled(request.getMeasure().getCubeName())) { // Caching is disabled. Return always false. return false; } diff --git a/core/src/main/java/org/eclipse/daanse/rolap/common/result/FastBatchingCellReader.java b/core/src/main/java/org/eclipse/daanse/rolap/common/result/FastBatchingCellReader.java index b3470c4..5b08c9b 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/common/result/FastBatchingCellReader.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/common/result/FastBatchingCellReader.java @@ -139,7 +139,7 @@ public FastBatchingCellReader( this.aggMgr = (AggregationManager)aggMgr; cacheMgr = (SegmentCacheManager)aggMgr.getCacheMgr(execution.getDaanseStatement().getDaanseConnection()); pinnedSegments = this.aggMgr.createPinSet(); - cacheEnabled = !cube.getCatalog().getInternalConnection().getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class); + cacheEnabled = cube.getCatalog().getInternalConnection().getContext().isCashEnabled(cube.getName()); Integer cellBatchSize = cube.getCatalog().getInternalConnection().getContext() .getConfigValue(ConfigConstants.CELL_BATCH_SIZE, ConfigConstants.CELL_BATCH_SIZE_DEFAULT_VALUE ,Integer.class); cellRequestLimit = @@ -376,7 +376,7 @@ public boolean loadAggregations() { // Then we insert the segment body into the SlotFuture. // This has to be done on the SegmentCacheManager's // Actor thread to ensure thread safety. - if (!cacheMgr.getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class)) { + if (cacheMgr.getContext().isCashEnabled(header.cubeName)) { final ExecutionContext executionContext = ExecutionContext.current(); cacheMgr.execute( new CacheCommand() { diff --git a/core/src/main/java/org/eclipse/daanse/rolap/common/star/RolapStar.java b/core/src/main/java/org/eclipse/daanse/rolap/common/star/RolapStar.java index 3b685db..fb8d815 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/common/star/RolapStar.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/common/star/RolapStar.java @@ -63,6 +63,7 @@ import org.eclipse.daanse.olap.api.Context; import org.eclipse.daanse.olap.api.aggregator.Aggregator; import org.eclipse.daanse.olap.api.cache.OlapSegmentCacheManager; +import org.eclipse.daanse.olap.api.element.Cube; import org.eclipse.daanse.olap.api.element.Member; import org.eclipse.daanse.olap.api.exception.OlapRuntimeException; import org.eclipse.daanse.olap.api.execution.ExecutionContext; @@ -122,6 +123,7 @@ public class RolapStar { private final Table factTable; + private final Cube cube; /** * Number of columns (column and columnName). */ @@ -165,10 +167,12 @@ public class RolapStar { protected RolapStar( final RolapCatalog catalog, final Context context, + final Cube cube, final org.eclipse.daanse.rolap.mapping.model.RelationalQuery fact) { this.cacheAggregations = true; this.catalog = catalog; + this.cube = cube; this.context = context; this.factTable = new RolapStar.Table(this, fact, null, null); @@ -631,7 +635,7 @@ public boolean isCacheAggregations() { } boolean isCacheDisabled() { - return context.getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class); + return !context.isCashEnabled(cube.getName()); } /** @@ -2218,4 +2222,8 @@ public int compare(Column o1, Column o2) { return result; } } + + public Cube getCube() { + return cube; + } } diff --git a/core/src/main/java/org/eclipse/daanse/rolap/common/star/RolapStarRegistry.java b/core/src/main/java/org/eclipse/daanse/rolap/common/star/RolapStarRegistry.java index b76ce53..ffc5db3 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/common/star/RolapStarRegistry.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/common/star/RolapStarRegistry.java @@ -36,6 +36,7 @@ import org.eclipse.daanse.olap.api.Context; import org.eclipse.daanse.olap.api.cache.OlapSegmentCacheManager; import org.eclipse.daanse.olap.api.connection.Connection; +import org.eclipse.daanse.olap.api.element.Cube; import org.eclipse.daanse.olap.core.AbstractBasicContext; import org.eclipse.daanse.rolap.common.RolapUtil; import org.eclipse.daanse.rolap.common.agg.SegmentCacheManager; @@ -59,11 +60,11 @@ public RolapStarRegistry(RolapCatalog schema, Context context) { * * {@link RolapStar.Table#addJoin} works in a similar way. */ - public synchronized RolapStar getOrCreateStar(final org.eclipse.daanse.rolap.mapping.model.RelationalQuery fact) { + public synchronized RolapStar getOrCreateStar(final org.eclipse.daanse.rolap.mapping.model.RelationalQuery fact, Cube cube) { final List rolapStarKey = RolapUtil.makeRolapStarKey(fact); RolapStar star = stars.get(rolapStarKey); if (star == null) { - star = makeRolapStar(fact); + star = makeRolapStar(fact, cube); stars.put(rolapStarKey, star); // let cache manager load pending segments // from external cache if needed @@ -79,8 +80,8 @@ public RolapStar getStar(final String factTableName) { return getStar(makeRolapStarKey(factTableName)); } - public RolapStar makeRolapStar(final org.eclipse.daanse.rolap.mapping.model.RelationalQuery fact) { - return new RolapStar(schema, context, fact); + public RolapStar makeRolapStar(final org.eclipse.daanse.rolap.mapping.model.RelationalQuery fact, Cube cube) { + return new RolapStar(schema, context, cube, fact); } public synchronized RolapStar getStar(List starKey) { diff --git a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCatalog.java b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCatalog.java index fcfd105..0e5ba38 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCatalog.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCatalog.java @@ -946,13 +946,13 @@ public Parameter[] getParameters() { * * Synchronization: thread safe */ - synchronized MemberReader createMemberReader(final org.eclipse.daanse.rolap.mapping.model.Dimension xmlDimension, final RolapHierarchy hierarchy, + synchronized MemberReader createMemberReader(final org.eclipse.daanse.rolap.mapping.model.Dimension xmlDimension, final RolapHierarchy hierarchy, final Cube cube, final String memberReaderClass) { MemberReader reader; if (xmlDimension != null) { reader = mapSharedHierarchyToReader.get(xmlDimension); if (reader == null) { - reader = createMemberReader(hierarchy, memberReaderClass); + reader = createMemberReader(hierarchy, memberReaderClass, cube); // share, for other uses of the same shared hierarchy if (false) { mapSharedHierarchyToReader.put(xmlDimension, reader); @@ -972,7 +972,7 @@ synchronized MemberReader createMemberReader(final org.eclipse.daanse.rolap.mapp // sharedDimension.getGlobalOrdinal()); } } else { - reader = createMemberReader(hierarchy, memberReaderClass); + reader = createMemberReader(hierarchy, memberReaderClass, cube); } return reader; } @@ -980,7 +980,7 @@ synchronized MemberReader createMemberReader(final org.eclipse.daanse.rolap.mapp /** * Creates a {@link MemberReader} with which to Read a hierarchy. */ - private MemberReader createMemberReader(final RolapHierarchy hierarchy, final String memberReaderClass) { + private MemberReader createMemberReader(final RolapHierarchy hierarchy, final String memberReaderClass, Cube cube) { if (memberReaderClass != null) { Exception e2; try { @@ -1004,7 +1004,7 @@ private MemberReader createMemberReader(final RolapHierarchy hierarchy, final St SqlMemberSource source = new SqlMemberSource(hierarchy); LOGGER.debug("Normal cardinality for {}", hierarchy.getDimension()); - if (internalConnection.getContext().getConfigValue(ConfigConstants.DISABLE_CACHING, ConfigConstants.DISABLE_CACHING_DEFAULT_VALUE, Boolean.class)) { + if (!internalConnection.getContext().isCashEnabled(cube.getName())) { // If the cell cache is disabled, we can't cache // the members or else we get undefined results, // depending on the functions used and all. diff --git a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCube.java b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCube.java index 709e6e3..d18c414 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCube.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCube.java @@ -314,7 +314,7 @@ private RolapCube( this.context = context; if (getFact() != null && this instanceof RolapPhysicalCube) { - this.star = catalog.getRolapStarRegistry().getOrCreateStar(getFact()); + this.star = catalog.getRolapStarRegistry().getOrCreateStar(getFact(), this); // only set if different from default (so that if two cubes share // the same fact table, either can turn off caching and both are // effected). @@ -1017,10 +1017,10 @@ private org.eclipse.daanse.rolap.mapping.model.DimensionConnector lookup( return null; } - protected void init(List mappingDimensions) { + protected void init(List mappingDimensions, Cube cube) { for (Dimension dimension1 : dimensions) { final RolapDimension dimension = (RolapDimension) dimension1; - dimension.init(lookup(mappingDimensions, dimension.getName())); + dimension.init(lookup(mappingDimensions, dimension.getName()), cube); } register(); } @@ -1105,7 +1105,7 @@ public RolapStar getStar() { if (star != null && star.getFactTable().getRelation().equals(getFact())) { return star; } - star = catalog.getRolapStarRegistry().makeRolapStar(getFact()); + star = catalog.getRolapStarRegistry().makeRolapStar(getFact(), this); } return star; } diff --git a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCubeHierarchy.java b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCubeHierarchy.java index 8d6fe65..407af38 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCubeHierarchy.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCubeHierarchy.java @@ -42,6 +42,7 @@ import java.util.Optional; import org.eclipse.daanse.olap.api.access.AccessMember; +import org.eclipse.daanse.olap.api.element.Cube; import org.eclipse.daanse.olap.api.element.Level; import org.eclipse.daanse.olap.api.element.Member; import org.eclipse.daanse.olap.api.query.component.Formula; @@ -513,11 +514,11 @@ public void setDefaultMember(Member defaultMeasure) { } @Override - void init(org.eclipse.daanse.rolap.mapping.model.DimensionConnector xmlDimension) { + void init(org.eclipse.daanse.rolap.mapping.model.DimensionConnector xmlDimension, Cube cube) { // first init shared hierarchy - rolapHierarchy.init(xmlDimension); + rolapHierarchy.init(xmlDimension, cube); // second init cube hierarchy - super.init(xmlDimension); + super.init(xmlDimension, cube); } /** diff --git a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCubeLevel.java b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCubeLevel.java index 13fb715..9aed17a 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCubeLevel.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapCubeLevel.java @@ -141,7 +141,7 @@ void init(org.eclipse.daanse.rolap.mapping.model.DimensionConnector xmlDimension (RolapCubeHierarchy) cubeDimensionInner.getHierarchies().getFirst(), xmlDimension); } - cubeDimensionInner.init(xmlDimension); + cubeDimensionInner.init(xmlDimension, cube); getCube().registerDimension(cubeDimensionInner); closedPeerCubeLevel = (RolapCubeLevel) cubeDimensionInner.getHierarchies().getFirst().getLevels().get(1); diff --git a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapDimension.java b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapDimension.java index 4965811..172a1f2 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapDimension.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapDimension.java @@ -198,10 +198,10 @@ protected Logger getLogger() { /** * Initializes a dimension within the context of a cube. */ - void init(org.eclipse.daanse.rolap.mapping.model.DimensionConnector mappingDimension) { + void init(org.eclipse.daanse.rolap.mapping.model.DimensionConnector mappingDimension, Cube cube) { for (Hierarchy h : hierarchies) { if (h != null) { - ((RolapHierarchy) h).init(mappingDimension); + ((RolapHierarchy) h).init(mappingDimension, cube); } } } diff --git a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapHierarchy.java b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapHierarchy.java index 7f11f79..982bde6 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapHierarchy.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapHierarchy.java @@ -57,6 +57,7 @@ import org.eclipse.daanse.olap.api.calc.tuple.TupleList; import org.eclipse.daanse.olap.api.calc.tuple.TupleListCalc; import org.eclipse.daanse.olap.api.catalog.CatalogReader; +import org.eclipse.daanse.olap.api.element.Cube; import org.eclipse.daanse.olap.api.element.Dimension; import org.eclipse.daanse.olap.api.element.DimensionType; import org.eclipse.daanse.olap.api.element.Hierarchy; @@ -429,7 +430,7 @@ public RolapHierarchy( RolapLevel l = new RolapLevel(sb.toString(), LevelUtil.getParentExp(pch), pch.getNullParentValue(), pch.getParentChildLink(), this, i, pch.isParentAsLeafEnable(), pch.getParentAsLeafNameFormat(), xmlLevel); levels.add(l); - Map> childMap = getChildMap((RolapLevel)l); + Map> childMap = getChildMap((RolapLevel)l, cube); for (Map.Entry> e : childMap.entrySet()) { if (e.getKey() != 0) { i++; @@ -448,7 +449,7 @@ public RolapHierarchy( RolapLevel l = new RolapLevel(sb.toString(), LevelUtil.getParentExp(pch), pch.getNullParentValue(), pch.getParentChildLink(), this, i, pch.isParentAsLeafEnable(), pch.getParentAsLeafNameFormat(), xmlLevel); levels.add(l); - Map> childMap = getChildMap((RolapLevel)l); + Map> childMap = getChildMap((RolapLevel)l, cube); for (Map.Entry> e : childMap.entrySet()) { if (e.getKey() != 0) { i++; @@ -491,10 +492,10 @@ public RolapHierarchy( defaultMemberName = xmlHierarchy.getDefaultMember(); } - private Map> getChildMap(RolapLevel l) { + private Map> getChildMap(RolapLevel l, Cube cube) { if (this.memberReader == null) { this.memberReader = getRolapCatalog().createMemberReader( - null, this, memberReaderClass); + null, this, cube, memberReaderClass); } List members = this.memberReader.getMembers(); Map> childMap = new HashMap<>(); @@ -561,11 +562,11 @@ protected int computeHashCode() { /** * Initializes a hierarchy within the context of a cube. */ - void init(org.eclipse.daanse.rolap.mapping.model.DimensionConnector xmlDimension) { + void init(org.eclipse.daanse.rolap.mapping.model.DimensionConnector xmlDimension, Cube cube) { // first create memberReader if (this.memberReader == null) { this.memberReader = getRolapCatalog().createMemberReader( - xmlDimension != null ? xmlDimension.getDimension() : null, this, memberReaderClass); + xmlDimension != null ? xmlDimension.getDimension() : null, this, cube, memberReaderClass); } for (Level level : levels) { ((RolapLevel) level).init(xmlDimension); diff --git a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapPhysicalCube.java b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapPhysicalCube.java index 9a10768..cce7ed3 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapPhysicalCube.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapPhysicalCube.java @@ -106,7 +106,7 @@ public class RolapPhysicalCube extends RolapCube implements PhysicalCube { // done in a common constructor. List measureList = initMeasures(cubeMapping); - init(cubeMapping.getDimensionConnectors()); + init(cubeMapping.getDimensionConnectors(), this); init(cubeMapping, measureList); setMeasuresHierarchyMemberReader( diff --git a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapVirtualCube.java b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapVirtualCube.java index e1bdab5..cf59f89 100644 --- a/core/src/main/java/org/eclipse/daanse/rolap/element/RolapVirtualCube.java +++ b/core/src/main/java/org/eclipse/daanse/rolap/element/RolapVirtualCube.java @@ -76,7 +76,7 @@ public class RolapVirtualCube extends RolapCube implements VirtualCube { virtualCubeMapping, measureHash); List origCalcMeasureList = calculatedMembersMap.entrySet().stream().map(Map.Entry::getValue).flatMap(Collection::stream).toList(); // Must init the dimensions before dealing with calculated members - init(virtualCubeMapping.getDimensionConnectors()); + init(virtualCubeMapping.getDimensionConnectors(), this); // Loop through the base cubes containing calculated members // referenced by this virtual cube. Resolve those members relative diff --git a/core/src/test/java/org/eclipse/daanse/rolap/common/RolapSchemaTest.java b/core/src/test/java/org/eclipse/daanse/rolap/common/RolapSchemaTest.java index efc0929..2d1c254 100644 --- a/core/src/test/java/org/eclipse/daanse/rolap/common/RolapSchemaTest.java +++ b/core/src/test/java/org/eclipse/daanse/rolap/common/RolapSchemaTest.java @@ -316,20 +316,22 @@ void getOrCreateStarStarCreatedAndUsed() List rolapStarKey = RolapUtil.makeRolapStarKey(fact); //Expected result star RolapStar expectedStar = rlStarMock; + RolapCube cube = mock(RolapCube.class); + when(cube.getName()).thenReturn("CubeName"); RolapStarRegistry rolapStarRegistry = - getStarRegistryLinkedToRolapCatalogSpy(schemaSpy, fact); + getStarRegistryLinkedToRolapCatalogSpy(schemaSpy, fact, cube); //Test that a new rolap star has created and put to the registry - RolapStar actualStar = rolapStarRegistry.getOrCreateStar(fact); + RolapStar actualStar = rolapStarRegistry.getOrCreateStar(fact, cube); assertThat(actualStar).isSameAs(expectedStar); assertThat(rolapStarRegistry.getStars().size()).isEqualTo(1); assertThat(rolapStarRegistry.getStar(rolapStarKey)).isEqualTo(expectedStar); - verify(rolapStarRegistry, times(1)).makeRolapStar(fact); + verify(rolapStarRegistry, times(1)).makeRolapStar(fact, cube); //test that no new rolap star has created, //but extracted already existing one from the registry - RolapStar actualStar2 = rolapStarRegistry.getOrCreateStar(fact); - verify(rolapStarRegistry, times(1)).makeRolapStar(fact); + RolapStar actualStar2 = rolapStarRegistry.getOrCreateStar(fact, cube); + verify(rolapStarRegistry, times(1)).makeRolapStar(fact, cube); assertThat(actualStar2).isSameAs(expectedStar); assertThat(rolapStarRegistry.getStars().size()).isEqualTo(1); assertThat(rolapStarRegistry.getStar(rolapStarKey)).isEqualTo(expectedStar); @@ -350,13 +352,16 @@ void getStarFromRegistryByStarKey() throws Exception { fact.setTable(table); fact.setAlias("TableAlias"); fact.setSqlWhereExpression(sqlWhereExpression); - + + RolapCube cube = mock(RolapCube.class); + when(cube.getName()).thenReturn("CubeName"); + List rolapStarKey = RolapUtil.makeRolapStarKey(fact); //Expected result star RolapStarRegistry rolapStarRegistry = - getStarRegistryLinkedToRolapCatalogSpy(schemaSpy, fact); + getStarRegistryLinkedToRolapCatalogSpy(schemaSpy, fact, cube); //Put rolap star to the registry - rolapStarRegistry.getOrCreateStar(fact); + rolapStarRegistry.getOrCreateStar(fact, cube); RolapStar actualStar = rolapStarRegistry.getStar(rolapStarKey); assertThat(actualStar).isSameAs(rlStarMock); @@ -373,25 +378,29 @@ void getStarFromRegistryByFactTableName() throws Exception { fact.setTable(table); fact.setAlias("TableAlias"); + RolapCube cube = mock(RolapCube.class); + when(cube.getName()).thenReturn("CubeName"); + //Expected result star RolapStarRegistry rolapStarRegistry = - getStarRegistryLinkedToRolapCatalogSpy(schemaSpy, fact); + getStarRegistryLinkedToRolapCatalogSpy(schemaSpy, fact, cube); //Put rolap star to the registry - RolapStar actualStar = rolapStarRegistry.getOrCreateStar(fact); + RolapStar actualStar = rolapStarRegistry.getOrCreateStar(fact, cube); //RolapStar actualStar = schemaSpy.getRolapStarRegistry().getStar(RelationUtil.getAlias(fact)); assertThat(actualStar).isSameAs(rlStarMock); } private static RolapStarRegistry getStarRegistryLinkedToRolapCatalogSpy( - RolapCatalog schemaSpy, org.eclipse.daanse.rolap.mapping.model.RelationalQuery fact) throws Exception + RolapCatalog schemaSpy, org.eclipse.daanse.rolap.mapping.model.RelationalQuery fact, RolapCube cube) throws Exception { //the rolap star registry is linked to the origin rolap schema, //not to the schemaSpy //RolapStarRegistry rolapStarRegistry = schemaSpy.getRolapStarRegistry(); + RolapStarRegistry rolapStarRegistry = spy(new RolapStarRegistry(schemaSpy, contextMock)); //the star mock - doReturn(rlStarMock).when(rolapStarRegistry).makeRolapStar(fact); + doReturn(rlStarMock).when(rolapStarRegistry).makeRolapStar(fact, cube); //Set the schema spy to be linked with the rolap star registry //assertTrue( // replaceRolapCatalogLinkedToStarRegistry( diff --git a/core/src/test/java/org/eclipse/daanse/rolap/common/RolapStarTest.java b/core/src/test/java/org/eclipse/daanse/rolap/common/RolapStarTest.java index 8240bfc..c751bfc 100644 --- a/core/src/test/java/org/eclipse/daanse/rolap/common/RolapStarTest.java +++ b/core/src/test/java/org/eclipse/daanse/rolap/common/RolapStarTest.java @@ -30,6 +30,7 @@ import org.assertj.core.api.Assertions; import org.eclipse.daanse.olap.api.Context; import org.eclipse.daanse.olap.api.connection.Connection; +import org.eclipse.daanse.olap.api.element.Cube; import org.eclipse.daanse.rolap.common.star.RolapStar; import org.eclipse.daanse.rolap.common.star.RolapStar.Column; import org.eclipse.daanse.rolap.element.RolapCatalog; @@ -49,9 +50,10 @@ static class RolapStarForTests extends RolapStar { public RolapStarForTests( final RolapCatalog schema, final Context context, + final Cube cube, final RelationalQuery fact) { - super(schema, context, fact); + super(schema, context, cube, fact); } public Query cloneRelationForTests( @@ -74,6 +76,7 @@ RolapStarForTests getStar(Connection connection, String starName) { return new RolapStarForTests( rs.getCatalog(), rs.getContext(), + rs.getCube(), rs.getFactTable().getRelation()); }