dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #37796
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 19305: Use CachingMap<> to speed up DXF2 TEI/Enrollment services
------------------------------------------------------------
revno: 19305
committer: Morten Olav Hansen <mortenoh@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2015-06-08 13:22:39 +0700
message:
Use CachingMap<> to speed up DXF2 TEI/Enrollment services
added:
dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/callable/IdentifiableObjectSearchCallable.java
modified:
dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/enrollment/AbstractEnrollmentService.java
dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java
dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/JacksonTrackedEntityInstanceService.java
dhis-2/dhis-services/dhis-service-dxf2/src/main/resources/META-INF/dhis/beans.xml
--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk
Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/enrollment/AbstractEnrollmentService.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/enrollment/AbstractEnrollmentService.java 2015-06-08 03:34:10 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/enrollment/AbstractEnrollmentService.java 2015-06-08 06:22:39 +0000
@@ -52,10 +52,10 @@
import org.hisp.dhis.program.ProgramInstanceService;
import org.hisp.dhis.program.ProgramService;
import org.hisp.dhis.program.ProgramTrackedEntityAttribute;
+import org.hisp.dhis.system.callable.IdentifiableObjectSearchCallable;
import org.hisp.dhis.system.util.DateUtils;
import org.hisp.dhis.system.util.MathUtils;
import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
import org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams;
import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService;
@@ -63,6 +63,7 @@
import org.hisp.dhis.trackedentitycomment.TrackedEntityCommentService;
import org.hisp.dhis.user.CurrentUserService;
import org.hisp.dhis.user.UserService;
+import org.hisp.dhis.util.CachingMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
@@ -94,9 +95,6 @@
protected org.hisp.dhis.trackedentity.TrackedEntityInstanceService teiService;
@Autowired
- protected TrackedEntityAttributeService trackedEntityAttributeService;
-
- @Autowired
protected TrackedEntityAttributeValueService trackedEntityAttributeValueService;
@Autowired
@@ -117,6 +115,12 @@
@Autowired
protected SessionFactory sessionFactory;
+ private CachingMap<String, OrganisationUnit> organisationUnitCache = new CachingMap<>();
+
+ private CachingMap<String, Program> programCache = new CachingMap<>();
+
+ private CachingMap<String, TrackedEntityAttribute> trackedEntityAttributeCache = new CachingMap<>();
+
// -------------------------------------------------------------------------
// READ
// -------------------------------------------------------------------------
@@ -713,7 +717,7 @@
for ( String key : attributeValueMap.keySet() )
{
- TrackedEntityAttribute attribute = trackedEntityAttributeService.getTrackedEntityAttribute( key );
+ TrackedEntityAttribute attribute = getTrackedEntityAttribute( key );
if ( attribute != null )
{
@@ -749,36 +753,10 @@
return entityInstance;
}
- private Program getProgram( String id )
- {
- Program program = programService.getProgram( id );
-
- if ( program == null )
- {
- throw new IllegalArgumentException( "Program does not exist." );
- }
-
- return program;
-
- }
-
- private OrganisationUnit getOrganisationUnit( String id )
- {
- OrganisationUnit organisationUnit = manager.search( OrganisationUnit.class, id );
-
- if ( organisationUnit == null )
- {
- throw new IllegalArgumentException( "OrganisationUnit does not exist." );
- }
-
- return organisationUnit;
- }
-
private List<ImportConflict> validateAttributeType( Attribute attribute )
{
List<ImportConflict> importConflicts = Lists.newArrayList();
- TrackedEntityAttribute teAttribute = trackedEntityAttributeService.getTrackedEntityAttribute( attribute
- .getAttribute() );
+ TrackedEntityAttribute teAttribute = getTrackedEntityAttribute( attribute.getAttribute() );
if ( teAttribute == null )
{
@@ -845,4 +823,19 @@
programInstanceService.updateProgramInstance( programInstance );
}
}
-}
\ No newline at end of file
+
+ private OrganisationUnit getOrganisationUnit( String id )
+ {
+ return organisationUnitCache.get( id, new IdentifiableObjectSearchCallable<>( manager, OrganisationUnit.class, id ) );
+ }
+
+ private Program getProgram( String id )
+ {
+ return programCache.get( id, new IdentifiableObjectSearchCallable<>( manager, Program.class, id ) );
+ }
+
+ private TrackedEntityAttribute getTrackedEntityAttribute( String id )
+ {
+ return trackedEntityAttributeCache.get( id, new IdentifiableObjectSearchCallable<>( manager, TrackedEntityAttribute.class, id ) );
+ }
+}
=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2015-06-08 03:24:16 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2015-06-08 06:22:39 +0000
@@ -44,16 +44,16 @@
import org.hisp.dhis.relationship.Relationship;
import org.hisp.dhis.relationship.RelationshipService;
import org.hisp.dhis.relationship.RelationshipType;
+import org.hisp.dhis.system.callable.IdentifiableObjectSearchCallable;
import org.hisp.dhis.system.util.DateUtils;
import org.hisp.dhis.system.util.MathUtils;
import org.hisp.dhis.trackedentity.TrackedEntity;
import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
import org.hisp.dhis.trackedentity.TrackedEntityInstanceQueryParams;
-import org.hisp.dhis.trackedentity.TrackedEntityService;
import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService;
import org.hisp.dhis.user.UserService;
+import org.hisp.dhis.util.CachingMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
@@ -80,15 +80,9 @@
protected TrackedEntityAttributeValueService attributeValueService;
@Autowired
- protected TrackedEntityAttributeService trackedEntityAttributeService;
-
- @Autowired
protected RelationshipService relationshipService;
@Autowired
- protected TrackedEntityService trackedEntityService;
-
- @Autowired
protected TrackedEntityAttributeValueService trackedEntityAttributeValueService;
@Autowired
@@ -103,6 +97,12 @@
@Autowired
protected SessionFactory sessionFactory;
+ private CachingMap<String, OrganisationUnit> organisationUnitCache = new CachingMap<>();
+
+ private CachingMap<String, TrackedEntity> trackedEntityCache = new CachingMap<>();
+
+ private CachingMap<String, TrackedEntityAttribute> trackedEntityAttributeCache = new CachingMap<>();
+
// -------------------------------------------------------------------------
// READ
// -------------------------------------------------------------------------
@@ -133,8 +133,7 @@
trackedEntityInstance.setTrackedEntity( entityInstance.getTrackedEntity().getUid() );
trackedEntityInstance.setCreated( entityInstance.getCreated().toString() );
- Collection<Relationship> relationships = relationshipService
- .getRelationshipsForTrackedEntityInstance( entityInstance );
+ Collection<Relationship> relationships = relationshipService.getRelationshipsForTrackedEntityInstance( entityInstance );
for ( Relationship entityRelationship : relationships )
{
@@ -186,11 +185,11 @@
org.hisp.dhis.trackedentity.TrackedEntityInstance entityInstance = new org.hisp.dhis.trackedentity.TrackedEntityInstance();
- OrganisationUnit organisationUnit = manager.get( OrganisationUnit.class, trackedEntityInstance.getOrgUnit() );
+ OrganisationUnit organisationUnit = getOrganisationUnit( trackedEntityInstance.getOrgUnit() );
Assert.notNull( organisationUnit );
entityInstance.setOrganisationUnit( organisationUnit );
- TrackedEntity trackedEntity = trackedEntityService.getTrackedEntity( trackedEntityInstance.getTrackedEntity() );
+ TrackedEntity trackedEntity = getTrackedEntity( trackedEntityInstance.getTrackedEntity() );
entityInstance.setTrackedEntity( trackedEntity );
entityInstance.setUid( CodeGenerator.isValidCode( trackedEntityInstance.getTrackedEntityInstance() ) ?
trackedEntityInstance.getTrackedEntityInstance() : CodeGenerator.generateCode() );
@@ -369,7 +368,7 @@
return importConflicts;
}
- TrackedEntity trackedEntity = trackedEntityService.getTrackedEntity( trackedEntityInstance.getTrackedEntity() );
+ TrackedEntity trackedEntity = getTrackedEntity( trackedEntityInstance.getTrackedEntity() );
if ( trackedEntity == null )
{
@@ -546,7 +545,7 @@
return importConflicts;
}
- TrackedEntityAttribute teAttribute = trackedEntityAttributeService.getTrackedEntityAttribute( attribute.getAttribute() );
+ TrackedEntityAttribute teAttribute = getTrackedEntityAttribute( attribute.getAttribute() );
if ( teAttribute == null )
{
@@ -589,4 +588,19 @@
return importConflicts;
}
+
+ private OrganisationUnit getOrganisationUnit( String id )
+ {
+ return organisationUnitCache.get( id, new IdentifiableObjectSearchCallable<>( manager, OrganisationUnit.class, id ) );
+ }
+
+ private TrackedEntity getTrackedEntity( String id )
+ {
+ return trackedEntityCache.get( id, new IdentifiableObjectSearchCallable<>( manager, TrackedEntity.class, id ) );
+ }
+
+ private TrackedEntityAttribute getTrackedEntityAttribute( String id )
+ {
+ return trackedEntityAttributeCache.get( id, new IdentifiableObjectSearchCallable<>( manager, TrackedEntityAttribute.class, id ) );
+ }
}
=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/JacksonTrackedEntityInstanceService.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/JacksonTrackedEntityInstanceService.java 2015-06-08 03:02:05 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/JacksonTrackedEntityInstanceService.java 2015-06-08 06:22:39 +0000
@@ -42,6 +42,7 @@
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
/**
=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/resources/META-INF/dhis/beans.xml 2015-05-14 12:28:25 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/resources/META-INF/dhis/beans.xml 2015-06-08 06:22:39 +0000
@@ -42,10 +42,15 @@
<bean id="org.hisp.dhis.dxf2.events.report.EventRowService" class="org.hisp.dhis.dxf2.events.report.AbstractEventRowService" />
- <bean id="org.hisp.dhis.dxf2.events.person.PersonService"
- class="org.hisp.dhis.dxf2.events.trackedentity.JacksonTrackedEntityInstanceService" />
+ <bean id="org.hisp.dhis.dxf2.events.trackedentity.TrackedEntityInstanceService"
+ class="org.hisp.dhis.dxf2.events.trackedentity.JacksonTrackedEntityInstanceService" scope="prototype">
+ <aop:scoped-proxy proxy-target-class="false" />
+ </bean>
- <bean id="org.hisp.dhis.dxf2.events.enrollment.EnrollmentService" class="org.hisp.dhis.dxf2.events.enrollment.JacksonEnrollmentService" />
+ <bean id="org.hisp.dhis.dxf2.events.enrollment.EnrollmentService"
+ class="org.hisp.dhis.dxf2.events.enrollment.JacksonEnrollmentService" scope="prototype">
+ <aop:scoped-proxy proxy-target-class="false" />
+ </bean>
<bean id="pdfDataEntryFormService" class="org.hisp.dhis.dxf2.pdfform.DefaultPdfDataEntryFormService" scope="prototype" />
@@ -261,11 +266,11 @@
<bean id="programStageSectionImporter" class="org.hisp.dhis.dxf2.metadata.importers.DefaultIdentifiableObjectImporter" scope="prototype">
<constructor-arg name="importerClass" type="java.lang.Class" value="org.hisp.dhis.program.ProgramStageSection" />
</bean>
-
+
<bean id="programRuleImporter" class="org.hisp.dhis.dxf2.metadata.importers.DefaultIdentifiableObjectImporter" scope="prototype">
<constructor-arg name="importerClass" type="java.lang.Class" value="org.hisp.dhis.programrule.ProgramRule" />
</bean>
-
+
<bean id="programRuleActionImporter" class="org.hisp.dhis.dxf2.metadata.importers.DefaultIdentifiableObjectImporter" scope="prototype">
<constructor-arg name="importerClass" type="java.lang.Class" value="org.hisp.dhis.programrule.ProgramRuleAction" />
</bean>
=== added file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/callable/IdentifiableObjectSearchCallable.java'
--- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/callable/IdentifiableObjectSearchCallable.java 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/callable/IdentifiableObjectSearchCallable.java 2015-06-08 06:22:39 +0000
@@ -0,0 +1,66 @@
+package org.hisp.dhis.system.callable;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of the HISP project nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import org.hisp.dhis.common.IdentifiableObject;
+import org.hisp.dhis.common.IdentifiableObjectManager;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
+ */
+public class IdentifiableObjectSearchCallable<T extends IdentifiableObject>
+ implements Callable<T>
+{
+ protected IdentifiableObjectManager manager;
+ protected Class<T> clazz;
+ protected String id;
+
+ public IdentifiableObjectSearchCallable( IdentifiableObjectManager manager, Class<T> clazz, String id )
+ {
+ this.manager = manager;
+ this.clazz = clazz;
+ this.id = id;
+ }
+
+ @Override
+ public T call()
+ throws ExecutionException
+ {
+ return manager.search( clazz, id );
+ }
+
+ public IdentifiableObjectSearchCallable<T> setId( String id )
+ {
+ this.id = id;
+ return this;
+ }
+}