r2128 - in trunk: wao-persistence/src/main/java/fr/ifremer/wao/entity wao-services/src/main/java/fr/ifremer/wao/services/service wao-web/src/main/webapp
Author: bleny Date: 2014-07-07 17:30:39 +0200 (Mon, 07 Jul 2014) New Revision: 2128 Url: http://forge.codelutin.com/projects/wao/repository/revisions/2128 Log: improve contacts filter values query to prevent N+1 Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValues.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValues.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java trunk/wao-web/src/main/webapp/endpoints-js.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-07-07 13:26:22 UTC (rev 2127) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-07-07 15:30:39 UTC (rev 2128) @@ -30,6 +30,7 @@ import fr.ifremer.wao.WaoUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.Range; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; @@ -433,4 +434,33 @@ } + public List<Contact> findAllForFilterValues(ContactsFilter filter) { + + HqlAndParametersBuilder<Contact> query = toContactHqlAndParametersBuilder(filter); + + String hql = query.getHql(); + + hql = StringUtils.replace( + hql, + "from fr.ifremer.wao.entity.Contact " + ALIAS, + "from fr.ifremer.wao.entity.ContactImpl " + ALIAS + + " left join fetch " + ALIAS + "." + Contact.PROPERTY_SAMPLE_ROW + " sr" + + " left join fetch sr." + SampleRow.PROPERTY_COMPANY + + " left join fetch sr." + SampleRow.PROPERTY_FISHING_ZONE + + " left join fetch sr." + SampleRow.PROPERTY_PROFESSION + + " left join fetch sr." + SampleRow.PROPERTY_D_CF5_CODE + " dcf" + + " left outer join fetch dcf." + DCF5Code.PROPERTY_FISHING_GEAR_DCF + + " left outer join fetch dcf." + DCF5Code.PROPERTY_TARGET_SPECIES_DCF + + " left join fetch " + ALIAS + "." + Contact.PROPERTY_BOAT + " b" + + " left join fetch b." + Boat.PROPERTY_DISTRICT + + " left join fetch " + ALIAS + "." + Contact.PROPERTY_MAIN_OBSERVER + + " left join fetch " + ALIAS + "." + Contact.PROPERTY_SECONDARY_OBSERVERS + + " left outer join fetch " + ALIAS + "." + Contact.PROPERTY_CONTACT_STATE_MOTIF + ); + + List<Contact> contacts = findAll(hql, query.getHqlParameters()); + + return contacts; + + } } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValues.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValues.java 2014-07-07 13:26:22 UTC (rev 2127) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValues.java 2014-07-07 15:30:39 UTC (rev 2128) @@ -67,13 +67,18 @@ this.elligibleForSampleRowsFilterValues = new SampleRowsFilterValues(locale, obsProgram, optionalCompanyId); } + public void addBoatFromContacts(Boat boat) { + addBoat(boat, true); + } + public void addBoat(Boat boat) { + addBoat(boat, false); + } - ShipOwner shipOwner = boat.getShipOwner(); - shipOwners.add(FilterOption.forValueAndLabel( - shipOwner.getTopiaId(), - shipOwner.getFirstName() + " - " + shipOwner.getLastName())); + public void addBoat(Boat boat, boolean fromContacts) { + boatIds.add(boat.getTopiaId()); + TerrestrialLocation district = boat.getDistrict(); if (district != null) { districts.add(FilterOption.forValueAndLabel( @@ -81,31 +86,37 @@ district.getDescription())); } - TerrestrialLocation portOfRegistry = boat.getPortOfRegistry(); - if (portOfRegistry != null) { - portsOfRegistry.add(FilterOption.forValueAndLabel( - portOfRegistry.getTopiaId(), - portOfRegistry.getDescription()) - ); - } + if ( ! fromContacts) { - Fleet fleet = boat.getFleet(); - if (fleet != null) { - fleets.add(FilterOption.forValueAndLabel( - fleet.getTopiaId(), - fleet.getDescription())); - } + ShipOwner shipOwner = boat.getShipOwner(); + shipOwners.add(FilterOption.forValueAndLabel( + shipOwner.getTopiaId(), + shipOwner.getFirstName() + " - " + shipOwner.getLastName())); - boats.add(FilterOption.forValueAndLabel(boat.getTopiaId(), boat.getDescription())); + TerrestrialLocation portOfRegistry = boat.getPortOfRegistry(); + if (portOfRegistry != null) { + portsOfRegistry.add(FilterOption.forValueAndLabel( + portOfRegistry.getTopiaId(), + portOfRegistry.getDescription()) + ); + } - for (ElligibleBoat elligibleBoat : boat.getElligibleBoat()) { - SampleRow sampleRow = elligibleBoat.getSampleRow(); - if (elligibleBoat.isBoatElligible()) { - elligibleForSampleRowsFilterValues.addSampleRowForBoatFilter(sampleRow); + Fleet fleet = boat.getFleet(); + if (fleet != null) { + fleets.add(FilterOption.forValueAndLabel( + fleet.getTopiaId(), + fleet.getDescription())); } + + boats.add(FilterOption.forValueAndLabel(boat.getTopiaId(), boat.getDescription())); + + for (ElligibleBoat elligibleBoat : boat.getElligibleBoat()) { + SampleRow sampleRow = elligibleBoat.getSampleRow(); + if (elligibleBoat.isBoatElligible()) { + elligibleForSampleRowsFilterValues.addSampleRowForBoatFilter(sampleRow); + } + } } - - boatIds.add(boat.getTopiaId()); } public SampleRowsFilterValues getElligibleForSampleRowsFilterValues() { Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValues.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValues.java 2014-07-07 13:26:22 UTC (rev 2127) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValues.java 2014-07-07 15:30:39 UTC (rev 2128) @@ -91,7 +91,7 @@ public void addContact(Contact contact) { Boat boat = contact.getBoat(); - boatsFilterValues.addBoat(boat); + boatsFilterValues.addBoatFromContacts(boat); boatRegistrationCodes.add(FilterOption.forValueAndLabel(String.valueOf(boat.getImmatriculation()), boat.getDescription())); SampleRow sampleRow = contact.getSampleRow(); Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java 2014-07-07 13:26:22 UTC (rev 2127) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java 2014-07-07 15:30:39 UTC (rev 2128) @@ -136,7 +136,7 @@ public ContactsFilterValues getContactsFilterValues(AuthenticatedWaoUser authenticatedWaoUser, ContactsFilter filter) { ContactTopiaDao dao = getContactDao(); - List<Contact> contacts = dao.forFilter(filter, false).findAll(); + List<Contact> contacts = dao.findAllForFilterValues(filter); Optional<String> optionalCompanyId = Optional.absent(); if (authenticatedWaoUser.isCoordinatorOrObserver()) { Modified: trunk/wao-web/src/main/webapp/endpoints-js.jsp =================================================================== --- trunk/wao-web/src/main/webapp/endpoints-js.jsp 2014-07-07 13:26:22 UTC (rev 2127) +++ trunk/wao-web/src/main/webapp/endpoints-js.jsp 2014-07-07 15:30:39 UTC (rev 2128) @@ -18,11 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #L% --%> -<%@ page language="java" contentType="text/javascript; charset=utf-8" pageEncoding="utf-8"%><%@ taglib uri="/struts-tags" prefix="s" %> -<% - // allow this page to be cached by browser - response.setDateHeader("Expires", System.currentTimeMillis() + 3600000L); // 1 hour in future. -%> +<%@ page language="java" contentType="text/javascript; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib uri="/struts-tags" prefix="s" %> $(document).ready(function () { @@ -40,5 +37,3 @@ WAO.BOAT_DETAILS_URL = '<s:url namespace="/" action="boat-details"/>'; }); - -
participants (1)
-
bleny@users.forge.codelutin.com