From ba6f11507cbec99992d5a85f46dd64d9af5bd6ba Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Mon, 11 Jun 2012 13:42:26 +0000
Subject: [PATCH] execute the insert/updates in the order mapping has been
 defined.

SVN: 25641
---
 .../task/MaterialExternalDBSyncTask.java      | 12 +++----
 .../task/MaterialExternalDBSyncTaskTest.java  | 31 ++++++++++---------
 2 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTask.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTask.java
index 1035149ac9d..d657cc65da9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTask.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTask.java
@@ -450,14 +450,14 @@ public class MaterialExternalDBSyncTask implements IMaintenanceTask
         operationLog.info("Start reporting added or changed materials to the report database.");
         Map<String, List<Material>> materialsByType =
                 getRecentlyAddedOrChangedMaterials(contextOrNull.getSessionToken());
-        for (Entry<String, List<Material>> entry : materialsByType.entrySet())
+        Set<Entry<String, MappingInfo>> entrySet = mapping.entrySet();
+        for (Entry<String, MappingInfo> entry : entrySet)
         {
             String materialTypeCode = entry.getKey();
-            final List<Material> materials = entry.getValue();
-            MappingInfo mappingInfo = mapping.get(materialTypeCode);
-            if (mappingInfo != null)
+            List<Material> materials = materialsByType.get(materialTypeCode);
+            if (materials != null)
             {
-                addOrUpdate(mappingInfo, materials);
+                addOrUpdate(entry.getValue(), materials);
             }
         }
         writeTimestamp(newTimestamp);
@@ -680,7 +680,7 @@ public class MaterialExternalDBSyncTask implements IMaintenanceTask
     static Map<String, MappingInfo> readMappingFile(String mappingFileName)
     {
         Map<String, MaterialExternalDBSyncTask.MappingInfo> map =
-                new HashMap<String, MaterialExternalDBSyncTask.MappingInfo>();
+                new LinkedHashMap<String, MaterialExternalDBSyncTask.MappingInfo>();
         List<String> lines = FileUtilities.loadToStringList(new File(mappingFileName));
         MappingInfo currentMappingInfo = null;
         for (int i = 0; i < lines.size(); i++)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTaskTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTaskTest.java
index 365e92012cb..a6336961efb 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTaskTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTaskTest.java
@@ -106,9 +106,10 @@ public class MaterialExternalDBSyncTaskTest extends AbstractFileSystemTestCase
         createTestDatabase();
         createTables(
                 "create table timestamp (timestamp timestamp)",
-                "create table report1 (id bigint, code varchar(20), description varchar(200))",
-                "create table report2 (code varchar(20), rank integer, greetings varchar(200), "
-                        + "size double precision, organism varchar(100), material varchar(30), timestamp timestamp)");
+                "create table report1 (id bigint, code varchar(20), description varchar(200), constraint pk_report1 primary key (code))",
+                "create table report2 (code varchar(20), report1_code varchar(20), rank integer, greetings varchar(200), "
+                        + "size double precision, organism varchar(100), material varchar(30), timestamp timestamp)",
+                "alter table report2 add constraint r2_r1_fk foreign key (report1_code) references report1 (code)");
         dbConfigContext.closeConnections();
         mappingFile = new File(workingDirectory, "mapping-file.txt");
         properties = new Properties();
@@ -622,10 +623,10 @@ public class MaterialExternalDBSyncTaskTest extends AbstractFileSystemTestCase
     public void testInsert() throws Exception
     {
         FileUtilities.writeToFile(mappingFile, "# my mapping\n[T1:REPORT1,CODE]\n\n"
-                + "[T2: REPORT2, code]\nM:MATERIAL\nS:size\nP2: GREETINGS\nP1:RANK\nORG:ORGANISM\n"
-                + "T:timestamp");
+                + "[T2: REPORT2, code]\nM:MATERIAL\nS:size\nR1CODE: REPORT1_CODE\n"
+                + "P2: GREETINGS\nP1:RANK\nORG:ORGANISM\n" + "T:timestamp");
         prepareListMaterialTypes("T1:D=VARCHAR",
-                "T2:M=MATERIAL,S=REAL,P2=VARCHAR,P1=INTEGER,ORG=CONTROLLEDVOCABULARY,T=TIMESTAMP");
+                "T2:M=MATERIAL,S=REAL,R1CODE=VARCHAR,P2=VARCHAR,P1=INTEGER,ORG=CONTROLLEDVOCABULARY,T=TIMESTAMP");
         materialReportingTask.setUp("", properties);
         final Material m1 =
                 new MaterialBuilder().code("M1").type("T1").property("P1", "42").getMaterial();
@@ -638,7 +639,8 @@ public class MaterialExternalDBSyncTaskTest extends AbstractFileSystemTestCase
         mb2.property("T").type(DataTypeCode.TIMESTAMP).value(new Date(24 * 3600L * 1000L * 33));
         final Material m2 = mb2.getMaterial();
         final Material m3 =
-                new MaterialBuilder().code("M3").type("T2").property("P2", "hello").getMaterial();
+                new MaterialBuilder().code("M3").type("T2").property("P2", "hello")
+                        .property("R1CODE", "M1").getMaterial();
         final RecordingMatcher<DetailedSearchCriteria> criteriaRecorder =
                 new RecordingMatcher<DetailedSearchCriteria>();
         context.checking(new Expectations()
@@ -662,10 +664,11 @@ public class MaterialExternalDBSyncTaskTest extends AbstractFileSystemTestCase
         List<?> result = loadTable("report1");
         assertEquals("[{code=M1, description=null, id=null}]", result.toString());
         result = loadTable("report2");
-        assertEquals("[{code=M2, greetings=null, material=M1, organism=FLY, rank=42, "
-                + "size=1.00000005E7, timestamp=1970-02-03 01:00:00.0}, "
-                + "{code=M3, greetings=hello, material=null, organism=null, rank=null, "
-                + "size=null, timestamp=null}]", result.toString());
+        assertEquals(
+                "[{code=M2, greetings=null, material=M1, organism=FLY, rank=42, report1_code=null, "
+                        + "size=1.00000005E7, timestamp=1970-02-03 01:00:00.0}, "
+                        + "{code=M3, greetings=hello, material=null, organism=null, rank=null, report1_code=M1, "
+                        + "size=null, timestamp=null}]", result.toString());
         assertEquals("[{timestamp=1970-03-02 01:00:00.0}]", loadTable("timestamp", false)
                 .toString());
         DetailedSearchCriterion detailedSearchCriterion =
@@ -738,11 +741,11 @@ public class MaterialExternalDBSyncTaskTest extends AbstractFileSystemTestCase
         assertEquals("[{code=M1, description=null, id=null}]", result.toString());
         result = loadTable("report2");
         assertEquals("[{code=M2, greetings=blabla, material=null, organism=Tiger, "
-                + "rank=137, size=null, timestamp=null}, "
+                + "rank=137, report1_code=null, size=null, timestamp=null}, "
                 + "{code=M3, greetings=hello, material=null, organism=null, "
-                + "rank=null, size=null, timestamp=null}, "
+                + "rank=null, report1_code=null, size=null, timestamp=null}, "
                 + "{code=M4, greetings=hi, material=null, organism=null, "
-                + "rank=null, size=null, timestamp=null}]", result.toString());
+                + "rank=null, report1_code=null, size=null, timestamp=null}]", result.toString());
         assertEquals("[{timestamp=1970-03-04 01:00:00.0}]", loadTable("timestamp", false)
                 .toString());
         List<DetailedSearchCriteria> recordedObjects = criteriaRecorder.getRecordedObjects();
-- 
GitLab