[Suiviobsmer-commits] r1293 - in trunk/wao-business/src/main/java/fr/ifremer/wao: bean service
Author: bleny Date: 2011-05-24 16:55:13 +0000 (Tue, 24 May 2011) New Revision: 1293 Log: fix performances issues in Boats ; replace ArrayLists by HashSets + prevent lots of lazy loading by loading data for boats once for all Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/BoatFilterValuesImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ContactFilterValuesImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/bean/SamplingFilterValuesImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceBoatImpl.java Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/BoatFilterValuesImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/bean/BoatFilterValuesImpl.java 2011-05-23 16:43:46 UTC (rev 1292) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/BoatFilterValuesImpl.java 2011-05-24 16:55:13 UTC (rev 1293) @@ -30,6 +30,7 @@ import fr.ifremer.wao.entity.TerrestrialLocation; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; /** @@ -74,7 +75,23 @@ } @Override + protected void clear() { + super.clear(); + setPortsOfRegistry(new HashSet<TerrestrialLocation>()); + setFleets(new HashSet<Fleet>()); + } + + @Override + protected void removeNullValues() { + super.removeNullValues(); + getPortsOfRegistry().remove(null); + getFleets().remove(null); + } + + @Override public void fillBoats(List<Boat> boats) { + clear(); + for (Boat boat : boats) { List<ElligibleBoat> elligibleBoats = boat.getElligibleBoat(); for (ElligibleBoat elligibleBoat : elligibleBoats) { @@ -83,5 +100,7 @@ addPortsOfRegistry(boat.getPortOfRegistry()); addFleets(boat.getFleet()); } + + removeNullValues(); } } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ContactFilterValuesImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ContactFilterValuesImpl.java 2011-05-23 16:43:46 UTC (rev 1292) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ContactFilterValuesImpl.java 2011-05-24 16:55:13 UTC (rev 1293) @@ -29,9 +29,11 @@ import fr.ifremer.wao.entity.ObsDebCode; import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.entity.TerrestrialLocation; +import fr.ifremer.wao.entity.WaoUser; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; /** @@ -40,95 +42,41 @@ public class ContactFilterValuesImpl extends ContactFilterValues { @Override - public void addContactStateMotifs(ContactStateMotif toAdd) { - if (toAdd == null) { - return; - } - if (getContactStateMotifs() == null) { - setContactStateMotifs(new ArrayList<ContactStateMotif>()); - } - if (!containsContactStateMotifs(toAdd)) { - super.addContactStateMotifs(toAdd); - } + public List<ContactStateMotif> getContactStateMotifsAsList() { + return getAsList(getContactStateMotifs()); } @Override - public void addAllContactStateMotifs(Collection<ContactStateMotif> toAdds) { - if (toAdds == null) { - return; - } - if (getContactStateMotifs() == null) { - setContactStateMotifs(new ArrayList<ContactStateMotif>()); - } - if (!containsAllContactStateMotifs(toAdds)) { - super.addAllContactStateMotifs(toAdds); - } else { - for (ContactStateMotif toAdd : toAdds) { - addContactStateMotifs(toAdd); - } - } + public List<TerrestrialLocation> getTerrestrialLocationsAsList() { + return getAsList(getTerrestrialLocations()); } @Override - public void addTerrestrialLocations(TerrestrialLocation toAdd) { - if (toAdd == null) { - return; - } - if (getTerrestrialLocations() == null) { - setTerrestrialLocations(new ArrayList<TerrestrialLocation>()); - } - if (!containsTerrestrialLocations(toAdd)) { - super.addTerrestrialLocations(toAdd); - } + public List<ObsDebCode> getObsDebCodesAsList() { + return getAsList(getObsDebCodes()); } @Override - public void addAllTerrestrialLocations(Collection<TerrestrialLocation> toAdds) { - if (toAdds == null) { - return; - } - if (getTerrestrialLocations() == null) { - setTerrestrialLocations(new ArrayList<TerrestrialLocation>()); - } - if (!containsAllTerrestrialLocations(toAdds)) { - super.addAllTerrestrialLocations(toAdds); - } else { - for (TerrestrialLocation toAdd : toAdds) { - addTerrestrialLocations(toAdd); - } - } + protected void clear() { + super.clear(); + setObservers(new HashSet<WaoUser>()); + setTerrestrialLocations(new HashSet<TerrestrialLocation>()); + setObsDebCodes(new HashSet<ObsDebCode>()); } @Override - public void addObsDebCodes(ObsDebCode toAdd) { - if (toAdd == null) { - return; - } - if (getObsDebCodes() == null) { - setObsDebCodes(new ArrayList<ObsDebCode>()); - } - if (!containsObsDebCodes(toAdd)) { - super.addObsDebCodes(toAdd); - } + protected void removeNullValues() { + super.removeNullValues(); + getObservers().remove(null); + getTerrestrialLocations().remove(null); + getObsDebCodes().remove(null); } @Override - public List<ContactStateMotif> getContactStateMotifsAsList() { - return getAsList(getContactStateMotifs()); - } + public void fillContacts(List<Contact> contacts) { - @Override - public List<TerrestrialLocation> getTerrestrialLocationsAsList() { - return getAsList(getTerrestrialLocations()); - } + clear(); - @Override - public List<ObsDebCode> getObsDebCodesAsList() { - return getAsList(getObsDebCodes()); - } - - @Override - public void fillContacts(List<Contact> contacts) { for (Contact contact : contacts) { addObservers(contact.getMainObserver()); addTerrestrialLocations(contact.getTerrestrialLocation()); @@ -136,5 +84,7 @@ addObsDebCodes(contact.getObsDebCode()); fillSampleRow(contact.getSampleRow()); } + + removeNullValues(); } } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/SamplingFilterValuesImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/bean/SamplingFilterValuesImpl.java 2011-05-23 16:43:46 UTC (rev 1292) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/SamplingFilterValuesImpl.java 2011-05-24 16:55:13 UTC (rev 1293) @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -41,290 +42,6 @@ public class SamplingFilterValuesImpl extends SamplingFilterValues { @Override - public void addCompanies(Company toAdd) { - if (toAdd == null) { - return; - } - if (getCompanies() == null) { - setCompanies(new ArrayList<Company>()); - } - if (!containsCompanies(toAdd)) { - super.addCompanies(toAdd); - } - } - - @Override - public void addAllCompanies(Collection<Company> toAdds) { - if (toAdds == null) { - return; - } - if (getCompanies() == null) { - setCompanies(new ArrayList<Company>()); - } - if (!containsAllCompanies(toAdds)) { - super.addAllCompanies(toAdds); - } else { - for (Company toAdd : toAdds) { - addCompanies(toAdd); - } - } - } - - @Override - public void addPrograms(String toAdd) { - if (toAdd == null) { - return; - } - if (getPrograms() == null) { - setPrograms(new ArrayList<String>()); - } - if (!containsPrograms(toAdd)) { - super.addPrograms(toAdd); - } - } - - @Override - public void addAllPrograms(Collection<String> toAdds) { - if (toAdds == null) { - return; - } - if (getPrograms() == null) { - setPrograms(new ArrayList<String>()); - } - if (!containsAllPrograms(toAdds)) { - super.addAllPrograms(toAdds); - } else { - for (String toAdd : toAdds) { - addPrograms(toAdd); - } - } - } - - @Override - public void addFacadeNames(String toAdd) { - if (toAdd == null) { - return; - } - if (getFacadeNames() == null) { - setFacadeNames(new ArrayList<String>()); - } - if (!containsFacadeNames(toAdd)) { - // Remove doublons - super.addFacadeNames(toAdd); - } - } - - @Override - public void addAllFacadeNames(Collection<String> toAdds) { - if (toAdds == null) { - return; - } - if (getFacadeNames() == null) { - setFacadeNames(new ArrayList<String>()); - } - if (!containsAllFacadeNames(toAdds)) { - super.addAllFacadeNames(toAdds); - } else { - for (String toAdd : toAdds) { - addFacadeNames(toAdd); - } - } - } - - @Override - public void addSectorsNames(String toAdd) { - if (toAdd == null) { - return; - } - if (getSectorsNames() == null) { - setSectorsNames(new ArrayList<String>()); - } - if (!containsSectorsNames(toAdd)) { - super.addSectorsNames(toAdd); - } - } - - @Override - public void addAllSectorsNames(Collection<String> toAdds) { - if (toAdds == null) { - return; - } - if (getSectorsNames() == null) { - setSectorsNames(new ArrayList<String>()); - } - if (!containsAllSectorsNames(toAdds)) { - super.addAllSectorsNames(toAdds); - } else { - for (String toAdd : toAdds) { - addSectorsNames(toAdd); - } - } - } - - @Override - public void addFishingGearDCFCodes(FishingGearDCF toAdd) { - if (toAdd == null) { - return; - } - if (getFishingGearDCFCodes() == null) { - setFishingGearDCFCodes(new ArrayList<FishingGearDCF>()); - } - if (!containsFishingGearDCFCodes(toAdd)) { - super.addFishingGearDCFCodes(toAdd); - } - } - - @Override - public void addAllFishingGearDCFCodes(Collection<FishingGearDCF> toAdds) { - if (toAdds == null) { - return; - } - if (getFishingGearDCFCodes() == null) { - setFishingGearDCFCodes(new ArrayList<FishingGearDCF>()); - } - if (!containsAllFishingGearDCFCodes(toAdds)) { - super.addAllFishingGearDCFCodes(toAdds); - } else { - for (FishingGearDCF toAdd : toAdds) { - addFishingGearDCFCodes(toAdd); - } - } - } - - @Override - public void addTargetSpeciesDCFCodes(TargetSpeciesDCF toAdd) { - if (toAdd == null) { - return; - } - if (getTargetSpeciesDCFCodes() == null) { - setTargetSpeciesDCFCodes(new ArrayList<TargetSpeciesDCF>()); - } - if (!containsTargetSpeciesDCFCodes(toAdd)) { - super.addTargetSpeciesDCFCodes(toAdd); - } - } - - @Override - public void addAllTargetSpeciesDCFCodes(Collection<TargetSpeciesDCF> toAdds) { - if (toAdds == null) { - return; - } - if (getTargetSpeciesDCFCodes() == null) { - setTargetSpeciesDCFCodes(new ArrayList<TargetSpeciesDCF>()); - } - if (!containsAllTargetSpeciesDCFCodes(toAdds)) { - super.addAllTargetSpeciesDCFCodes(toAdds); - } else { - for (TargetSpeciesDCF toAdd : toAdds) { - addTargetSpeciesDCFCodes(toAdd); - } - } - } - - @Override - public void addTerrestrialDistricts(TerrestrialLocation toAdd) { - if (toAdd == null) { - return; - } - if (getTerrestrialDistricts() == null) { - setTerrestrialDistricts(new ArrayList<TerrestrialLocation>()); - } - if (!containsTerrestrialDistricts(toAdd)) { - super.addTerrestrialDistricts(toAdd); - } - } - - @Override - public void addAllTerrestrialDistricts(Collection<TerrestrialLocation> toAdds) { - if (toAdds == null) { - return; - } - if (getTerrestrialDistricts() == null) { - setTerrestrialDistricts(new ArrayList<TerrestrialLocation>()); - } - if (!containsAllTerrestrialDistricts(toAdds)) { - super.addAllTerrestrialDistricts(toAdds); - } else { - for (TerrestrialLocation toAdd : toAdds) { - addTerrestrialDistricts(toAdd); - } - } - } - - @Override - public void addObservers(WaoUser toAdd) { - if (toAdd == null) { - return; - } - if (getObservers() == null) { - setObservers(new ArrayList<WaoUser>()); - } - if (!containsObservers(toAdd)) { - super.addObservers(toAdd); - } - } - - @Override - public void addAllObservers(Collection<WaoUser> toAdds) { - if (toAdds == null) { - return; - } - if (getObservers() == null) { - setObservers(new ArrayList<WaoUser>()); - } - if (!containsAllObservers(toAdds)) { - super.addAllObservers(toAdds); - } else { - for (WaoUser toAdd : toAdds) { - addObservers(toAdd); - } - } - } - - @Override - public void addObservationUnits(TerrestrialDivision toAdd) { - if (toAdd == null) { - return; - } - if (getObservationUnits() == null) { - setObservationUnits(new ArrayList<TerrestrialDivision>()); - } - if (!containsObservationUnits(toAdd)) { - super.addObservationUnits(toAdd); - } - } - - @Override - public void addSampleRows(SampleRow toAdd) { - if (toAdd == null) { - return; - } - if (getSampleRows() == null) { - setSampleRows(new ArrayList<SampleRow>()); - } - if (!containsSampleRows(toAdd)) { - super.addSampleRows(toAdd); - } - } - - @Override - public void addAllSampleRows(Collection<SampleRow> toAdds) { - if (toAdds == null) { - return; - } - if (getSampleRows() == null) { - setSampleRows(new ArrayList<SampleRow>()); - } - if (!containsAllSampleRows(toAdds)) { - super.addAllSampleRows(toAdds); - } else { - for (SampleRow toAdd : toAdds) { - addSampleRows(toAdd); - } - } - } - - @Override public List<Company> getCompaniesAsList() { return getAsList(getCompanies()); } @@ -441,10 +158,40 @@ addSampleRows(sampleRow); } + protected void clear() { + setCompanies(new HashSet<Company>()); + setPrograms(new HashSet<String>()); + setFacadeNames(new HashSet<String>()); + setSectorsNames(new HashSet<String>()); + setFishingGearDCFCodes(new HashSet<FishingGearDCF>()); + setTargetSpeciesDCFCodes(new HashSet<TargetSpeciesDCF>()); + setTerrestrialDistricts(new HashSet<TerrestrialLocation>()); + setSampleRows(new HashSet<SampleRow>()); + setObservers(new HashSet<WaoUser>()); + setObservationUnits(new HashSet<TerrestrialDivision>()); + } + + protected void removeNullValues() { + getCompanies().remove(null); + getPrograms().remove(null); + getFacadeNames().remove(null); + getSectorsNames().remove(null); + getFishingGearDCFCodes().remove(null); + getTargetSpeciesDCFCodes().remove(null); + getTerrestrialDistricts().remove(null); + getObservers().remove(null); + getObservationUnits().remove(null); + } + @Override public void fillSampleRows(List<SampleRow> sampleRows) { + + clear(); + for (SampleRow sampleRow : sampleRows) { fillSampleRow(sampleRow); } + + removeNullValues(); } } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceBoatImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceBoatImpl.java 2011-05-23 16:43:46 UTC (rev 1292) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceBoatImpl.java 2011-05-24 16:55:13 UTC (rev 1293) @@ -101,7 +101,7 @@ */ public class ServiceBoatImpl extends ServiceBoatAbstract { - private static final Logger logger = + private static final Logger log = LoggerFactory.getLogger(ServiceBoatImpl.class); private WaoContext context; @@ -135,26 +135,44 @@ BoatDAO dao = WaoDAOHelper.getBoatDAO(transaction); WaoQueryBuilder builder = context.newQueryBuilder(); - builder.initializeForBoat(); + WaoQueryHelper.BoatProperty boatProperty = builder.initializeForBoat(); TopiaQuery query = builder.applyBoatFilter(filter); - query.addLoad(Boat.PROPERTY_ACTIVITY_CALENDAR); + query.addFetch( // boatProperty.activityCalendar(), + boatProperty.portOfRegistry(), + boatProperty.fleet(), + boatProperty.boatDistrict()); - if (logger.isDebugEnabled()) { - logger.debug("query to get boats by filter : " + query); + // join boat to sample rows through eligible boats + WaoQueryHelper.ElligibleBoatProperty eligibleBoatProperty = + WaoQueryHelper.newElligibleBoatProperty(); + + query.addLeftJoin(boatProperty.elligibleBoat(), + eligibleBoatProperty.$alias(), true); + + // load data for sample row: company, fishingZone, DCF5Code, profession + WaoQueryHelper.SampleRowProperty sampleRowProperty = + WaoQueryHelper.newSampleRowProperty(); + + query.addFetch( // XXX 20110524 bleny fetching those two data raise a + // 'cannot simultaneously fetch multiple bags' + // exception. Not fetching works but data will be lazily + // loaded and it costs performance in + // BoatFilterValues#fillBoats() + // + // sampleRowProperty.fishingZone(), + // sampleRowProperty.dCF5Code(), + sampleRowProperty.company(), + sampleRowProperty.profession()); + + if (log.isDebugEnabled()) { + log.debug("query to get boats by filter : " + query); } Map<Integer, Boat> results = dao.findAllMappedByQuery(query, Boat.PROPERTY_IMMATRICULATION, Integer.class); - if (filter.getObsProgram() == ObsProgram.OBSDEB) { - // force load - for (Boat boat : results.values()) { - boat.getPortOfRegistry(); - } - } - return results; } @@ -494,8 +512,8 @@ // Reset limit : no pagination needed for results query.resetLimit(); - if (logger.isDebugEnabled()) { - logger.debug("Exec query : " + query); + if (log.isDebugEnabled()) { + log.debug("Exec query : " + query); } List<Boat> boats = dao.findAllByQuery(query); @@ -594,7 +612,6 @@ @Override protected BoatFilterValues executeGetPossibleValuesForFilter(TopiaContext transaction, BoatFilter filter) throws Exception { - ServiceReferential serviceReferential = context.getServiceFactory().getServiceReferential(); ServiceSampling serviceSampling = context.getServiceFactory().getServiceSampling(); BoatFilterValues result = new BoatFilterValuesImpl(); @@ -604,43 +621,23 @@ filter.setStartIndex(null); filter.setEndIndex(null); - if (filter.isBoatFiltered() || filter.isSamplingFiltered()) { + // run the query and extract data + Map<Integer, Boat> indexedBoats = executeGetBoatsByFilter(transaction, filter); + List<Boat> boats = new ArrayList<Boat>(indexedBoats.values()); - // run the query and extract data - Map<Integer, Boat> indexedBoats = executeGetBoatsByFilter(transaction, filter); - List<Boat> boats = new ArrayList<Boat>(indexedBoats.values()); + // collect values + result.fillBoats(boats); - // collect values - result.fillBoats(boats); + if (filter.getObsProgram() == ObsProgram.OBSDEB) { + // in obsdeb, we don't consider boat eligibility and we + // cannot collect sample row, it would be too expensive, + // so we don't try to restrict the values et let all the sample + // rows - if (filter.getObsProgram() == ObsProgram.OBSDEB) { - // in obsdeb, we don't consider boat eligibility and we cannot collect - // sample row, it would be tee expensive, so we don't try to restrict - // the values et let all the sample rows - - SampleRow sampleRow = filter.getSampleRow(); - filter.setSampleRow(null); - result.setSampleRows(serviceSampling.getSampleRowsByFilter(filter)); - filter.setSampleRow(sampleRow); - } - - } else { - - // we can't run the query and browse thousand of boats so we - // fill with default values - - result.setFacadeNames(serviceReferential.getFacades(filter)); - result.setSectorsNames(serviceReferential.getSectors(filter)); - SampleRow sampleRow = filter.getSampleRow(); filter.setSampleRow(null); result.setSampleRows(serviceSampling.getSampleRowsByFilter(filter)); filter.setSampleRow(sampleRow); - - result.setPortsOfRegistry(serviceReferential.getAllPorts(null)); - - FleetDAO fleetDAO = WaoDAOHelper.getFleetDAO(transaction); - result.setFleets(fleetDAO.findAll()); } filter.setStartIndex(startIndex);
participants (1)
-
bleny@users.labs.libre-entreprise.org