=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodService.java 2010-06-23 17:50:25 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodService.java 2010-07-04 10:31:31 +0000 @@ -130,6 +130,8 @@ */ Collection getPeriodsBetweenDates( PeriodType periodType, Date startDate, Date endDate ); + Collection getPeriodsBetweenOrSpanningDates( Date startDate, Date endDate ); + /** * Returns all Intersecting Periods between the startDate and endDate based on PeriodType * For example if the startDate is 2007-05-01 and endDate is 2007-08-01 and periodType is Quartely === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodStore.java 2010-06-21 21:21:07 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/PeriodStore.java 2010-07-04 10:31:31 +0000 @@ -123,6 +123,8 @@ */ Collection getPeriodsBetweenDates( PeriodType periodType, Date startDate, Date endDate ); + Collection getPeriodsBetweenOrSpanningDates( Date startDate, Date endDate ); + /** * Returns all intersecting Periods between the startDate and endDate based on PeriodType * For example if the startDate is 2007-05-01 and endDate is 2007-08-01 and periodType is Quartely === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java 2010-06-23 17:50:25 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java 2010-07-04 10:31:31 +0000 @@ -111,12 +111,17 @@ { return periodStore.getPeriodsBetweenDates( startDate, endDate ); } - + public Collection getPeriodsBetweenDates( PeriodType periodType, Date startDate, Date endDate ) { return periodStore.getPeriodsBetweenDates( periodType, startDate, endDate ); } + public Collection getPeriodsBetweenOrSpanningDates( Date startDate, Date endDate ) + { + return periodStore.getPeriodsBetweenOrSpanningDates( startDate, endDate ); + } + public Collection getIntersectingPeriodsByPeriodType( PeriodType periodType, Date startDate, Date endDate ) { return periodStore.getIntersectingPeriodsByPeriodType( periodType, startDate, endDate ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/hibernate/HibernatePeriodStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/hibernate/HibernatePeriodStore.java 2010-06-23 17:50:25 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/hibernate/HibernatePeriodStore.java 2010-07-04 10:31:31 +0000 @@ -133,6 +133,14 @@ } @SuppressWarnings( "unchecked" ) + public Collection getPeriodsBetweenOrSpanningDates( Date startDate, Date endDate ) + { + String hql = "from Period p where ( p.startDate >= :startDate and p.endDate <= :endDate ) or ( p.startDate <= :startDate and p.endDate >= :endDate )"; + + return sessionFactory.getCurrentSession().createQuery( hql ).setDate( "startDate", startDate ).setDate( "endDate", endDate ).list(); + } + + @SuppressWarnings( "unchecked" ) public Collection getIntersectingPeriodsByPeriodType( PeriodType periodType, Date startDate, Date endDate ) { Session session = sessionFactory.getCurrentSession(); @@ -153,7 +161,7 @@ Criteria criteria = session.createCriteria( Period.class ); criteria.add( Restrictions.gt( "endDate", startDate ) ); criteria.add( Restrictions.lt( "startDate", endDate ) ); - + return criteria.list(); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/period/PeriodStoreTest.java' --- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/period/PeriodStoreTest.java 2010-04-12 21:23:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/period/PeriodStoreTest.java 2010-07-04 10:31:31 +0000 @@ -322,6 +322,54 @@ } @Test + public void testGetPeriodsBetweenOrSpanningDates() + throws Exception + { + Collection periodTypes = periodStore.getAllPeriodTypes(); + Iterator it = periodTypes.iterator(); + PeriodType periodTypeA = it.next(); + PeriodType periodTypeB = it.next(); + + Period periodA = new Period( periodTypeA, getDay( 0 ), getDay( 1 ) ); + Period periodB = new Period( periodTypeA, getDay( 1 ), getDay( 2 ) ); + Period periodC = new Period( periodTypeB, getDay( 2 ), getDay( 3 ) ); + Period periodD = new Period( periodTypeB, getDay( 3 ), getDay( 4 ) ); + Period periodE = new Period( periodTypeB, getDay( 0 ), getDay( 4 ) ); + periodStore.addPeriod( periodA ); + periodStore.addPeriod( periodB ); + periodStore.addPeriod( periodC ); + periodStore.addPeriod( periodD ); + periodStore.addPeriod( periodE ); + + Collection periods = periodStore.getPeriodsBetweenOrSpanningDates( getDay( 0 ), getDay( 0 ) ); + assertNotNull( periods ); + assertEquals( 2, periods.size() ); + assertTrue( periods.contains( periodA ) ); + assertTrue( periods.contains( periodE ) ); + + periods = periodStore.getPeriodsBetweenOrSpanningDates( getDay( 0 ), getDay( 1 ) ); + assertNotNull( periods ); + assertEquals( 2, periods.size() ); + assertTrue( periods.contains( periodA ) ); + assertTrue( periods.contains( periodE ) ); + + periods = periodStore.getPeriodsBetweenOrSpanningDates( getDay( 1 ), getDay( 3 ) ); + assertNotNull( periods ); + assertEquals( 3, periods.size() ); + assertTrue( periods.contains( periodB ) ); + assertTrue( periods.contains( periodC ) ); + assertTrue( periods.contains( periodE ) ); + + periods = periodStore.getPeriodsBetweenOrSpanningDates( getDay( 1 ), getDay( 4 ) ); + assertNotNull( periods ); + assertEquals( 4, periods.size() ); + assertTrue( periods.contains( periodB ) ); + assertTrue( periods.contains( periodC ) ); + assertTrue( periods.contains( periodD ) ); + assertTrue( periods.contains( periodE ) ); + } + + @Test public void testGetIntersectingPeriodsByPeriodType() throws Exception { === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/aggregation/cache/MemoryAggregationCache.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/aggregation/cache/MemoryAggregationCache.java 2010-07-04 08:53:02 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/aggregation/cache/MemoryAggregationCache.java 2010-07-04 10:31:31 +0000 @@ -51,8 +51,6 @@ private final ThreadLocal>> intersectingPeriodCache = new ThreadLocal>>(); - private final ThreadLocal>> periodsBetweenDatesCache = new ThreadLocal>>(); - private final ThreadLocal> periodCache = new ThreadLocal>(); private final ThreadLocal> organisationUnitLevelCache = new ThreadLocal>(); @@ -102,31 +100,7 @@ return periods; } - - public Collection getPeriodsBetweenDates( final Date startDate, final Date endDate ) - { - final String key = startDate.toString() + SEPARATOR + endDate.toString(); - - Map> cache = periodsBetweenDatesCache.get(); - - Collection periods = null; - - if ( cache != null && ( periods = cache.get( key ) ) != null ) - { - return periods; - } - - periods = ConversionUtils.getIdentifiers( Period.class, periodService.getPeriodsBetweenDates( startDate, endDate ) ); - - cache = ( cache == null ) ? new HashMap>() : cache; - - cache.put( key, periods ); - - periodsBetweenDatesCache.set( cache ); - - return periods; - } - + public Period getPeriod( final int id ) { final String key = String.valueOf( id ); @@ -178,7 +152,6 @@ public void clearCache() { intersectingPeriodCache.remove(); - periodsBetweenDatesCache.remove(); periodCache.remove(); organisationUnitLevelCache.remove(); }