Search in sources :

Example 1 with SegmentCache

use of mondrian.spi.SegmentCache in project mondrian by pentaho.

the class SegmentCacheTest method testSegmentCacheEvents.

public void testSegmentCacheEvents() throws Exception {
    SegmentCache mockCache = new MockSegmentCache();
    SegmentCacheWorker testWorker = new SegmentCacheWorker(mockCache, null);
    // Flush the cache before we start. Wait a second for the cache
    // flush to propagate.
    final CacheControl cc = getTestContext().getConnection().getCacheControl(null);
    Cube salesCube = getCube("Sales");
    cc.flush(cc.createMeasuresRegion(salesCube));
    Thread.sleep(1000);
    MondrianServer.forConnection(getTestContext().getConnection()).getAggregationManager().cacheMgr.segmentCacheWorkers.add(testWorker);
    final List<SegmentHeader> createdHeaders = new ArrayList<SegmentHeader>();
    final List<SegmentHeader> deletedHeaders = new ArrayList<SegmentHeader>();
    final SegmentCache.SegmentCacheListener listener = new SegmentCache.SegmentCacheListener() {

        public void handle(SegmentCacheEvent e) {
            switch(e.getEventType()) {
                case ENTRY_CREATED:
                    createdHeaders.add(e.getSource());
                    break;
                case ENTRY_DELETED:
                    deletedHeaders.add(e.getSource());
                    break;
                default:
                    throw new UnsupportedOperationException();
            }
        }
    };
    try {
        // Register our custom listener.
        ((CompositeSegmentCache) MondrianServer.forConnection(getTestContext().getConnection()).getAggregationManager().cacheMgr.compositeCache).addListener(listener);
        // Now execute a query and check the events
        executeQuery("select {[Measures].[Unit Sales]} on columns from [Sales]");
        // Wait for propagation.
        Thread.sleep(2000);
        assertEquals(2, createdHeaders.size());
        assertEquals(0, deletedHeaders.size());
        assertEquals("Sales", createdHeaders.get(0).cubeName);
        assertEquals("FoodMart", createdHeaders.get(0).schemaName);
        assertEquals("Unit Sales", createdHeaders.get(0).measureName);
        createdHeaders.clear();
        deletedHeaders.clear();
        // Now flush the segment and check the events.
        cc.flush(cc.createMeasuresRegion(salesCube));
        // Wait for propagation.
        Thread.sleep(2000);
        assertEquals(0, createdHeaders.size());
        assertEquals(2, deletedHeaders.size());
        assertEquals("Sales", deletedHeaders.get(0).cubeName);
        assertEquals("FoodMart", deletedHeaders.get(0).schemaName);
        assertEquals("Unit Sales", deletedHeaders.get(0).measureName);
    } finally {
        ((CompositeSegmentCache) MondrianServer.forConnection(getTestContext().getConnection()).getAggregationManager().cacheMgr.compositeCache).removeListener(listener);
        MondrianServer.forConnection(getTestContext().getConnection()).getAggregationManager().cacheMgr.segmentCacheWorkers.remove(testWorker);
    }
}
Also used : SegmentHeader(mondrian.spi.SegmentHeader) ArrayList(java.util.ArrayList) CompositeSegmentCache(mondrian.rolap.agg.SegmentCacheManager.CompositeSegmentCache) Cube(mondrian.olap.Cube) CompositeSegmentCache(mondrian.rolap.agg.SegmentCacheManager.CompositeSegmentCache) SegmentCache(mondrian.spi.SegmentCache) CacheControl(mondrian.olap.CacheControl)

Aggregations

ArrayList (java.util.ArrayList)1 CacheControl (mondrian.olap.CacheControl)1 Cube (mondrian.olap.Cube)1 CompositeSegmentCache (mondrian.rolap.agg.SegmentCacheManager.CompositeSegmentCache)1 SegmentCache (mondrian.spi.SegmentCache)1 SegmentHeader (mondrian.spi.SegmentHeader)1