← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 17005: performance improvements for event import

 

------------------------------------------------------------
revno: 17005
committer: Morten Olav Hansen <mortenoh@xxxxxxxxx>
branch nick: dhis2
timestamp: Wed 2014-10-08 18:24:12 +0700
message:
  performance improvements for event import
modified:
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/event/AbstractEventService.java


--
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/event/AbstractEventService.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/event/AbstractEventService.java	2014-10-08 10:23:24 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/event/AbstractEventService.java	2014-10-08 11:24:12 +0000
@@ -77,8 +77,10 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -491,8 +493,8 @@
 
         saveTrackedEntityComment( programStageInstance, event, storedBy );
 
-        Set<TrackedEntityDataValue> dataValues = new HashSet<>(
-            dataValueService.getTrackedEntityDataValues( programStageInstance ) );
+        Set<TrackedEntityDataValue> dataValues = new HashSet<>( dataValueService.getTrackedEntityDataValues( programStageInstance ) );
+        Map<String, TrackedEntityDataValue> existingDataValues = getDataElementDataValueMap( dataValues );
 
         for ( DataValue value : event.getDataValues() )
         {
@@ -510,8 +512,10 @@
             }
             else
             {
+                TrackedEntityDataValue existingDataValue = existingDataValues.get( value.getDataElement() );
+
                 saveDataValue( programStageInstance, event.getStoredBy(), dataElement, value.getValue(),
-                    value.getProvidedElsewhere() );
+                    value.getProvidedElsewhere(), existingDataValue );
             }
         }
 
@@ -527,7 +531,7 @@
 
     public void updateEventForNote( Event event )
     {
-        ProgramStageInstance programStageInstance = programStageInstanceService.getProgramStageInstance( 
+        ProgramStageInstance programStageInstance = programStageInstanceService.getProgramStageInstance(
             event.getEvent() );
 
         if ( programStageInstance == null )
@@ -729,23 +733,20 @@
                     new ImportConflict( "stored by", storedBy
                         + " is more than 31 characters, using current username instead" ) );
             }
-            
+
             storedBy = currentUserService.getCurrentUsername();
         }
         return storedBy;
     }
 
     private void saveDataValue( ProgramStageInstance programStageInstance, String storedBy, DataElement dataElement,
-        String value, Boolean providedElsewhere )
+        String value, Boolean providedElsewhere, TrackedEntityDataValue dataValue )
     {
         if ( value != null && value.trim().length() == 0 )
         {
             value = null;
         }
 
-        TrackedEntityDataValue dataValue = dataValueService.getTrackedEntityDataValue( programStageInstance,
-            dataElement );
-
         if ( value != null )
         {
             if ( dataValue == null )
@@ -772,7 +773,7 @@
         }
     }
 
-    private ProgramStageInstance createProgramStageInstance( ProgramStage programStage, ProgramInstance programInstance, 
+    private ProgramStageInstance createProgramStageInstance( ProgramStage programStage, ProgramInstance programInstance,
         OrganisationUnit organisationUnit, Date dueDate, Date executionDate, int status,
         Coordinate coordinate, String storedBy, String programStageInstanceUid )
     {
@@ -860,36 +861,55 @@
             importSummary.setReference( programStageInstance.getUid() );
         }
 
+        Collection<TrackedEntityDataValue> existingDataValues = dataValueService.getTrackedEntityDataValues( programStageInstance );
+        Map<String, TrackedEntityDataValue> dataElementValueMap = getDataElementDataValueMap( existingDataValues );
+
         for ( DataValue dataValue : event.getDataValues() )
         {
-            DataElement dataElement = dataElementService.getDataElement( dataValue.getDataElement() );
-
-            if ( dataElement == null )
-            {
-                importSummary.getConflicts().add(
-                    new ImportConflict( "dataElement", dataValue.getDataElement() + " is not a valid data element" ) );
-                importSummary.getDataValueCount().incrementIgnored();
-            }
-            else
-            {
+            DataElement dataElement;
+
+            if ( dataElementValueMap.containsKey( dataValue.getDataElement() ) )
+            {
+                dataElement = dataElementValueMap.get( dataValue.getDataElement() ).getDataElement();
+
                 if ( validateDataValue( dataElement, dataValue.getValue(), importSummary ) )
                 {
                     String dataValueStoredBy = dataValue.getStoredBy() != null ? dataValue.getStoredBy() : storedBy;
 
                     if ( !dryRun )
                     {
+                        TrackedEntityDataValue existingDataValue = dataElementValueMap.get( dataValue.getDataElement() );
+
                         saveDataValue( programStageInstance, dataValueStoredBy, dataElement, dataValue.getValue(),
-                            dataValue.getProvidedElsewhere() );
+                            dataValue.getProvidedElsewhere(), existingDataValue );
                     }
 
                     importSummary.getDataValueCount().incrementImported();
                 }
             }
+            else
+            {
+                importSummary.getConflicts().add(
+                    new ImportConflict( "dataElement", dataValue.getDataElement() + " is not a valid data element" ) );
+                importSummary.getDataValueCount().incrementIgnored();
+            }
         }
 
         return importSummary;
     }
 
+    private Map<String, TrackedEntityDataValue> getDataElementDataValueMap( Collection<TrackedEntityDataValue> dataValues )
+    {
+        Map<String, TrackedEntityDataValue> map = new HashMap<>();
+
+        for ( TrackedEntityDataValue value : dataValues )
+        {
+            map.put( value.getDataElement().getUid(), value );
+        }
+
+        return map;
+    }
+
     private void saveTrackedEntityComment( ProgramStageInstance programStageInstance, Event event, String storedBy )
     {
         for ( Note note : event.getNotes() )