Author: echatellier Date: 2012-05-02 10:46:26 +0200 (Wed, 02 May 2012) New Revision: 996 Url: http://forge.codelutin.com/repositories/revision/coser/996 Log: closes #1189 : Les lignes non contigues ne sont pas merg?\195?\169es dans le fichier de taille Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java trunk/coser-business/src/test/resources/csv/correct/testlength.csv trunk/coser-business/src/test/resources/csv/correct/testreftax.csv trunk/pom.xml Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2012-03-26 16:18:13 UTC (rev 995) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2012-05-02 08:46:26 UTC (rev 996) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 - 2012 Codelutin, Chatellier Eric + * Copyright (C) 2010 - 2012 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -29,10 +29,11 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; -import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -113,40 +114,14 @@ // Campagne;Annee;Trait;Espece;Sexe;Maturite;Longueur;Nombre;Poids;Age // regroupement par Campagne;Annee;Trait;Espece;Sexe;Maturite;Longueur;Age - String[] commonTuple = null; - String[] mergeTuple = null; - int mergeTupleIndex = -1; + Map<String, Integer> firstLineForKey = new HashMap<String, Integer>(); // parcours des elements Iterator<String[]> itTuple = container.getLength().iterator(true); - int index = 1; // header skipped - + int lineIndex = 1; // skip header while (itTuple.hasNext()) { String[] tuple = itTuple.next(); - // search for diff in commonTuple and current tuple - // 1 = skip line index (0) - boolean diffFound = false; - if (commonTuple != null) { - for (int tupleIndex = 0 ; tupleIndex < commonTuple.length && !diffFound; ++tupleIndex) { - if (tupleIndex != Length.INDEX_LINE && tupleIndex != Length.INDEX_NUMBER - && tupleIndex != Length.INDEX_WEIGHT && tupleIndex != Length.INDEX_SPECIES) { - if (!commonTuple[tupleIndex].equals(tuple[tupleIndex])) { - diffFound = true; - } - } - } - } - else { - diffFound = true; - } - - if (diffFound) { - mergeTuple = null; - // clone parce que si c'est un tuple de merge... - commonTuple = (String[])ArrayUtils.clone(tuple); - } - // test si l'espece en cours fait partie de celle a merger String species = tuple[Length.INDEX_SPECIES]; boolean specyFound = false; @@ -160,24 +135,37 @@ // principale a merge, ou on merge avec le tuple // principal si on a deja un tuple principal if (specyFound) { - if (mergeTuple == null) { - mergeTuple = tuple; - mergeTuple[Length.INDEX_SPECIES] = newSpecyName; - mergeTupleIndex = index; + + // compute key (attention a ne pas prendre en compte l'espece : elle change) + StringBuffer sb = new StringBuffer(); + for (int tupleIndex = 0 ; tupleIndex < tuple.length; ++tupleIndex) { + if (tupleIndex == Length.INDEX_SURVEY || tupleIndex == Length.INDEX_YEAR || + tupleIndex == Length.INDEX_HAUL || tupleIndex == Length.INDEX_SEX || + tupleIndex == Length.INDEX_MATURITY || tupleIndex == Length.INDEX_LENGTH || + tupleIndex == Length.INDEX_AGE) { + sb.append(tuple[tupleIndex]).append(';'); + } } + + String key = sb.toString(); + Integer firstLineFound = firstLineForKey.get(key); + + if (firstLineFound == null) { + firstLineForKey.put(key, lineIndex); + ++lineIndex; + } else { - mergeTuple = mergeLengths(mergeTuple, tuple); + String[] previousTuple = container.getLength().get(firstLineFound); + String[] mergedTuple = mergeLengths(previousTuple, tuple); // et on supprime le tuple // qui a ete merge itTuple.remove(); - // bidouille le remove decalle les index suivants - index--; + // on update le precedent qui contient maintenant le merge + container.getLength().set(firstLineFound, mergedTuple); } - - container.getLength().set(mergeTupleIndex, mergeTuple); + } else { + ++lineIndex; } - - index++; } return project; } @@ -252,43 +240,18 @@ */ protected Project mergeCatch(Project project, AbstractDataContainer container, String newSpecyName, String... speciesNames) { - + // "Campagne","Annee","Trait","Espece","Nombre","Poids" // regroupement par campagne/annee/trait - String[] commonTuple = null; - String[] mergeTuple = null; - int mergeTupleIndex = -1; + Map<String, Integer> firstLineForKey = new HashMap<String, Integer>(); // parcours des elements Iterator<String[]> itTuple = container.getCatch().iterator(true); - int index = 1; // header skiped + int lineIndex = 1; // header skiped while (itTuple.hasNext()) { String[] tuple = itTuple.next(); - // si les valeurs servant au bornes de regroupement - // on changer, on reset les données du merge - boolean diffFound = false; - if (commonTuple != null) { - for (int tupleIndex = 0 ; tupleIndex < commonTuple.length && !diffFound; ++tupleIndex) { - if (tupleIndex != Catch.INDEX_LINE && tupleIndex != Catch.INDEX_NUMBER - && tupleIndex != Catch.INDEX_WEIGHT && tupleIndex != Catch.INDEX_SPECIES) { - if (!commonTuple[tupleIndex].equals(tuple[tupleIndex])) { - diffFound = true; - } - } - } - } - else { - diffFound = true; - } - - if (diffFound) { - mergeTuple = null; - // clone parce que si c'est un tuple de merge... - commonTuple = (String[])ArrayUtils.clone(tuple); - } - // test si l'espece en cours fait partie de celle a merger String species = tuple[Catch.INDEX_SPECIES]; boolean specyFound = false; @@ -302,24 +265,37 @@ // principale a merge, ou on merge avec le tuple // principal si on a deja un tuple principal if (specyFound) { - if (mergeTuple == null) { - mergeTuple = tuple; - mergeTuple[Catch.INDEX_SPECIES] = newSpecyName; - mergeTupleIndex = index; + + // compute key (attention a ne pas prendre en compte l'espece : elle change) + StringBuffer sb = new StringBuffer(); + for (int tupleIndex = 0 ; tupleIndex < tuple.length; ++tupleIndex) { + if (tupleIndex == Catch.INDEX_SURVEY || tupleIndex == Catch.INDEX_YEAR || + tupleIndex == Catch.INDEX_HAUL) { + sb.append(tuple[tupleIndex]).append(';'); + } } + + String key = sb.toString(); + Integer firstLineFound = firstLineForKey.get(key); + + if (firstLineFound == null) { + firstLineForKey.put(key, lineIndex); + ++lineIndex; + } else { - mergeTuple = mergeCatches(mergeTuple, tuple); + String[] previousTuple = container.getCatch().get(firstLineFound); + String[] mergeTuple = mergeCatches(previousTuple, tuple); // et on supprime le tuple // qui a ete merge itTuple.remove(); - // bidouille le remove decalle les index suivants - index--; + // on update le precedent qui contient maintenant le merge + container.getCatch().set(firstLineFound, mergeTuple); } - container.getCatch().set(mergeTupleIndex, mergeTuple); + } else { + lineIndex++; } - - index++; + } return project; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2012-03-26 16:18:13 UTC (rev 995) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2012-05-02 08:46:26 UTC (rev 996) @@ -2064,7 +2064,7 @@ // be sure that data are available for this project // or it will fail - projectService.loadSelectionData(projectsDirectory,project, selection); + projectService.loadSelectionData(projectsDirectory, project, selection); result = generateSourceZip(project, selection, resultFile, rsufiResult, locale); } Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2012-03-26 16:18:13 UTC (rev 995) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2012-05-02 08:46:26 UTC (rev 996) @@ -327,15 +327,19 @@ Selection selection = projectService.initProjectSelection(project); selection.setName("test"); - Assert.assertTrue(projectService.isSpeciesNameExist(project, "COSER_SPECIES_MERGE")); + Assert.assertTrue(projectService.isSpeciesNameExist(project, "COSER_SPECIES_1_3")); + Assert.assertTrue(projectService.isSpeciesNameExist(project, "COSER_SPECIES_2_4")); Assert.assertEquals(25, selection.getCatch().size()); Assert.assertEquals(30, selection.getLength().size()); - project = projectService.mergeSpecies(project, selection, "COSER_SPECIES_MERGE", null, "COSER_SPECIES1", "COSER_SPECIES2"); + project = projectService.mergeSpecies(project, selection, "COSER_SPECIES_1_3", null, "COSER_SPECIES1", "COSER_SPECIES3"); + Assert.assertEquals(19, selection.getCatch().size()); + Assert.assertEquals(28, selection.getLength().size()); - Assert.assertEquals(19, selection.getCatch().size()); - Assert.assertEquals(29, selection.getLength().size()); - + project = projectService.mergeSpecies(project, selection, "COSER_SPECIES_2_4", null, "COSER_SPECIES2", "COSER_SPECIES4"); + Assert.assertEquals(13, selection.getCatch().size()); + Assert.assertEquals(26, selection.getLength().size()); + projectService.createProjectSelection(project, selection); } Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java 2012-03-26 16:18:13 UTC (rev 995) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java 2012-05-02 08:46:26 UTC (rev 996) @@ -138,7 +138,7 @@ * @throws CoserBusinessException */ @Test - public void testUploadDirectoyMerge() throws CoserBusinessException { + public void testUploadDirectoryMerge() throws CoserBusinessException { registerUploadedResult("/web/upload1.zip"); // second upload with merge Modified: trunk/coser-business/src/test/resources/csv/correct/testlength.csv =================================================================== --- trunk/coser-business/src/test/resources/csv/correct/testlength.csv 2012-03-26 16:18:13 UTC (rev 995) +++ trunk/coser-business/src/test/resources/csv/correct/testlength.csv 2012-05-02 08:46:26 UTC (rev 996) @@ -14,7 +14,7 @@ COSER_TEST;2010;TRAIT3;COSER_SPECIES1;i;NA;20.39;3.00;0.28;NA COSER_TEST;2010;TRAIT3;COSER_SPECIES2;i;NA;19.88;3.00;0.31;NA COSER_TEST;2010;TRAIT3;COSER_SPECIES3;i;NA;18.16;1.00;0.34;NA -COSER_TEST;2010;TRAIT3;COSER_SPECIES4;i;NA;10.22;2.00;0.31;NA +COSER_TEST;2010;TRAIT3;COSER_SPECIES4;i;NA;19.88;2.00;0.31;NA COSER_TEST;2010;TRAIT3;COSER_SPECIES4;f;NA;33.03;5.00;0.26;NA COSER_TEST;2011;TRAIT1;COSER_SPECIES1;i;NA;1.00;4.00;0.81;NA COSER_TEST;2011;TRAIT1;COSER_SPECIES2;i;NA;27.61;3.00;NA @@ -22,9 +22,9 @@ COSER_TEST;2011;TRAIT1;COSER_SPECIES4;i;NA;6.86;1.00;0.23;NA COSER_TEST;2011;TRAIT2;COSER_SPECIES1;i;NA;15.04;4.00;0.95;NA COSER_TEST;2011;TRAIT2;COSER_SPECIES2;i;NA;35.03;1.00;0.26;NA -COSER_TEST;2011;TRAIT2;COSER_SPECIES3;i;NA;19.41;1.00;0.51;NA +COSER_TEST;2011;TRAIT2;COSER_SPECIES3;i;NA;15.04;1.00;0.51;NA COSER_TEST;2011;TRAIT2;COSER_SPECIES4;i;NA;24.58;2.00;NA COSER_TEST;2011;TRAIT3;COSER_SPECIES1;i;NA;2.46;3.00;0.32;NA COSER_TEST;2011;TRAIT3;COSER_SPECIES2;i;NA;18.93;5.00;0.22;NA -COSER_TEST;2011;TRAIT3;COSER_SPECIES3;i;NA;23.77;5.00;0.12;NA +COSER_TEST;2011;TRAIT3;COSER_SPECIES3;i;NA;2.46;5.00;0.12;NA COSER_TEST;2011;TRAIT3;COSER_SPECIES4;i;NA;0.94;3.00;0.77;NA Modified: trunk/coser-business/src/test/resources/csv/correct/testreftax.csv =================================================================== --- trunk/coser-business/src/test/resources/csv/correct/testreftax.csv 2012-03-26 16:18:13 UTC (rev 995) +++ trunk/coser-business/src/test/resources/csv/correct/testreftax.csv 2012-05-02 08:46:26 UTC (rev 996) @@ -3,4 +3,5 @@ "2";"000002";"2";"COSER_SPECIES2";"L'espece de test coser 2";"";"";""; "3";"000003";"3";"COSER_SPECIES3";"L'espece de test coser 3";"";"";""; "4";"000004";"4";"COSER_SPECIES4";"L'espece de test coser 4";"";"";""; -"5";"000005";"5";"COSER_SPECIES_MERGE";"L'espece de test coser pour fusion";"";"";""; +"5";"000005";"5";"COSER_SPECIES_1_3";"L'espece de test coser pour fusion1";"";"";""; +"5";"000005";"5";"COSER_SPECIES_2_4";"L'espece de test coser pour fusion2";"";"";""; Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2012-03-26 16:18:13 UTC (rev 995) +++ trunk/pom.xml 2012-05-02 08:46:26 UTC (rev 996) @@ -6,7 +6,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>mavenpom4redmine</artifactId> - <version>3.2</version> + <version>3.3</version> </parent> <groupId>fr.ifremer</groupId>