Author: bleny Date: 2014-06-05 14:53:25 +0200 (Thu, 05 Jun 2014) New Revision: 1999 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1999 Log: refs #4493 add data input reactivity Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompanySynthesis.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/synthesis.jsp Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-06-05 11:57:57 UTC (rev 1998) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-06-05 12:53:25 UTC (rev 1999) @@ -21,13 +21,17 @@ * #L% */ +import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; import com.google.common.collect.Sets; import fr.ifremer.wao.ContactsFilter; import fr.ifremer.wao.WaoUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.Range; import org.apache.commons.lang3.time.DateUtils; +import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.HqlAndParametersBuilder; @@ -401,4 +405,38 @@ return contactStatesStatistics; } + public Multimap<String, Pair<Date, Date>> getContactsDoneObservationBeginDateAndDateInputDate(ContactsFilter filter) { + + HqlAndParametersBuilder<Contact> hqlAndParametersBuilder = toContactHqlAndParametersBuilder(filter); + + hqlAndParametersBuilder.addEquals(Contact.PROPERTY_STATE, ContactState.OBSERVATION_DONE.ordinal()); + + String hql = "select c.sampleRow.company.topiaId, c.observationEndDate, c.dataInputDate " + hqlAndParametersBuilder.getHql(); + + List<Object[]> rows = findAll(hql, hqlAndParametersBuilder.getHqlParameters()); + + Multimap<String, Pair<Date, Date>> result = + Multimaps.newListMultimap( + new HashMap<String, Collection<Pair<Date, Date>>>(), + new Supplier<List<Pair<Date, Date>>>() { + @Override + public List<Pair<Date, Date>> get() { + return new LinkedList<>(); + } + } + ); + + for (Object[] row : rows) { + + String contactId = (String) row[0]; + Date observationEndDate = (Date) row[1]; + Date dataInputDate = (Date) row[2]; + + result.put(contactId, Pair.of(observationEndDate, dataInputDate)); + + } + + return result; + + } } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompanySynthesis.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompanySynthesis.java 2014-06-05 11:57:57 UTC (rev 1998) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/CompanySynthesis.java 2014-06-05 12:53:25 UTC (rev 1999) @@ -17,6 +17,8 @@ protected long contactsCount; + protected double dataInputDateReactivity; + public String getCompanyId() { return companyId; } @@ -56,4 +58,17 @@ public void setContactsCount(long contactsCount) { this.contactsCount = contactsCount; } + + public void setDataInputDateReactivity(double dataInputDateReactivity) { + this.dataInputDateReactivity = dataInputDateReactivity; + } + + public double getDataInputDateReactivity() { + return dataInputDateReactivity; + } + + public boolean isDataInputDateReactivityHigh() { + return dataInputDateReactivity > 15.; + } + } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java 2014-06-05 11:57:57 UTC (rev 1998) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java 2014-06-05 12:53:25 UTC (rev 1999) @@ -1,6 +1,7 @@ package fr.ifremer.wao.services.service; import com.google.common.cache.Cache; +import com.google.common.collect.Multimap; import fr.ifremer.wao.ContactsFilter; import fr.ifremer.wao.WaoUtils; import fr.ifremer.wao.entity.Boat; @@ -13,12 +14,14 @@ import fr.ifremer.wao.services.utils.BarChartData; import fr.ifremer.wao.services.utils.ChartDataAxis; import org.apache.commons.lang3.time.DateUtils; +import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.i18n.I18n; import org.nuiton.util.DateUtil; import java.util.Calendar; +import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.LinkedHashMap; @@ -26,6 +29,7 @@ import java.util.Locale; import java.util.Map; import java.util.SortedMap; +import java.util.TreeMap; public class SynthesisService extends WaoServiceSupport { @@ -63,6 +67,8 @@ setContactStatesStatistics(obsMerSynthesis, filter); + setDataInputDateReactivity(obsMerSynthesis, filter); + for (CompanySynthesis companySynthesis : obsMerSynthesis.getCompanySyntheses().values()) { String companyId = companySynthesis.getCompanyId(); Company company = getCompanyDao().findByTopiaId(companyId); @@ -77,6 +83,37 @@ } + protected void setDataInputDateReactivity(ObsMerSynthesis obsMerSynthesis, ContactsFilter filter) { + + ContactTopiaDao dao = getContactDao(); + + Multimap<String, Pair<Date, Date>> contactsDoneObservationBeginDateAndDateInputDate + = dao.getContactsDoneObservationBeginDateAndDateInputDate(filter); + + for (Map.Entry<String, Collection<Pair<Date, Date>>> entry : + contactsDoneObservationBeginDateAndDateInputDate.asMap().entrySet()) { + + String companyId = entry.getKey(); + CompanySynthesis companySynthesis = obsMerSynthesis.getCompanySynthesis(companyId); + + Collection<Pair<Date, Date>> dates = entry.getValue(); + + int days = 0; + for (Pair<Date, Date> pair : dates) { + Date observationEndDate = pair.getLeft(); + Date dataInputDate = pair.getRight(); + days += DateUtil.getDifferenceInDays(observationEndDate, dataInputDate); + } + + double dataInputDateReactivity = (double) days / dates.size(); + + companySynthesis.setDataInputDateReactivity(dataInputDateReactivity); + + } + + + } + protected void setContactStatesStatistics(ObsMerSynthesis obsMerSynthesis, ContactsFilter filter) { ContactTopiaDao dao = getContactDao(); @@ -191,7 +228,7 @@ Map<Boat, LinkedHashMap<String, List<Date>>> data = dao.getBoardingBoats(filter); - Map<String, Integer> mapBoarding = new LinkedHashMap<>(); + Map<Integer, Integer> mapBoarding = new TreeMap<>(); // Prepare map which contains for each entry the number of boardings // for the key and the number of boats for the value. @@ -246,14 +283,12 @@ } // update mapBoarding - String key = String.valueOf(boardingCount); - - Integer oldValue = mapBoarding.get(key); + Integer oldValue = mapBoarding.get(boardingCount); if (oldValue == null) { oldValue = 0; } // add one more boat for "key" number of boardings - mapBoarding.put(key, oldValue + 1); + mapBoarding.put(boardingCount, oldValue + 1); if (log.isTraceEnabled()) { log.trace(boat + " made " + boardingCount + " boardings"); @@ -266,8 +301,8 @@ new BarChartData.BarChartDataSeries(); numberOfBoatsWithBoardingsBarChartDataSeries.setLabel(I18n.l(locale, "wao.ui.chart.numberOfBoatsWithBoardings")); - for (Map.Entry<String, Integer> entry : mapBoarding.entrySet()) { - numberOfBoatsWithBoardingsBarChartDataSeries.addValue(entry.getKey(), entry.getValue()); + for (Map.Entry<Integer, Integer> entry : mapBoarding.entrySet()) { + numberOfBoatsWithBoardingsBarChartDataSeries.addValue(String.valueOf(entry.getKey()), entry.getValue()); } BarChartData boardingBoatsBarChartData = Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/synthesis.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/synthesis.jsp 2014-06-05 11:57:57 UTC (rev 1998) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/synthesis.jsp 2014-06-05 12:53:25 UTC (rev 1999) @@ -177,6 +177,35 @@ <s:text name="SynthesisId.IND_ALLEGRO_REACTIVITY"/> </h2> + <table class="table"> + <thead> + <tr> + <th> + <s:text name="wao.ui.entity.Company"/> + </th> + <th> + <s:text name="wao.ui.synthesis.allegroReactivity.title"/> + </th> + </tr> + </thead> + <tbody> + <s:iterator value="synthesis.companySynthesesOrderedByName"> + <tr> + <td> + <s:property value="companyName"/> + </td> + <td<s:if test="dataInputDateReactivityHigh"> class="lower-than-expected"</s:if>> + <s:property value="dataInputDateReactivity"/> + </td> + </tr> + </s:iterator> + </tbody> + </table> + + <p> + <s:text name="wao.ui.synthesis.allegroReactivity.description"/> + </p> + </article> <article>