# HG changeset patch # User Raimund Renkert # Date 1351864096 -3600 # Node ID 6a65e7ef43c0052cd723cb701afaff12161f58ee # Parent 8ddab49ff29737decf34d697cc692aefdae40856 Updated data object and factory for sediment load. * Added new data fields to object and cache key. * Fixed SQL statement in factory and fill load objects correctly. * diff -r 8ddab49ff297 -r 6a65e7ef43c0 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/StaticSedimentLoadCacheKey.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/StaticSedimentLoadCacheKey.java Fri Nov 02 14:44:11 2012 +0100 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/StaticSedimentLoadCacheKey.java Fri Nov 02 14:48:16 2012 +0100 @@ -12,18 +12,21 @@ private String river; private double startKm; private double endKm; - private Date date; + private int sYear; + private int eYear; public StaticSedimentLoadCacheKey( String river, double startKm, double endKm, - Date date + int sYear, + int eYear ) { this.river = river; this.startKm = startKm; this.endKm = endKm; - this.date = date; + this.sYear = sYear; + this.eYear = eYear; } public int hashCode() { @@ -31,7 +34,8 @@ builder.append(river); builder.append(startKm); builder.append(endKm); - builder.append(date); + builder.append(sYear); + builder.append(eYear); return builder.toHashCode(); } @@ -43,6 +47,7 @@ return this.river == o.river && this.startKm == o.startKm && this.endKm == o.endKm && - this.date == o.date; + this.sYear == o.sYear && + this.eYear == o.eYear; } } diff -r 8ddab49ff297 -r 6a65e7ef43c0 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoad.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoad.java Fri Nov 02 14:44:11 2012 +0100 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoad.java Fri Nov 02 14:48:16 2012 +0100 @@ -1,8 +1,13 @@ package de.intevation.flys.artifacts.model.minfo; import gnu.trove.TDoubleArrayList; +import gnu.trove.TDoubleByteHashMap; +import gnu.trove.TDoubleHash; +import gnu.trove.TDoubleHashSet; import java.util.Date; +import java.util.HashMap; +import java.util.Set; import org.apache.log4j.Logger; @@ -19,14 +24,10 @@ protected Date end; protected boolean isEpoch; - protected TDoubleArrayList sand_values; - protected TDoubleArrayList fine_middle_values; - protected TDoubleArrayList coarse_values; - protected TDoubleArrayList susp_sediment_values; - protected TDoubleArrayList susp_sand_bed_values; - + protected HashMap kms; public SedimentLoad() { + kms = new HashMap(); } public SedimentLoad( @@ -35,6 +36,7 @@ Date end, boolean isEpoch ) { + this(); this.description = description; this.start = start; this.end = end; @@ -73,63 +75,95 @@ this.isEpoch = isEpoch; } - public void addSandValue(double value) { - this.sand_values.add(value); - } - - public void addSandValues(TDoubleArrayList values) { - this.sand_values.add(values.toNativeArray()); - } - - public TDoubleArrayList getSandValues() { - return this.sand_values; - } - - public void addFineMiddleValue(double value) { - this.fine_middle_values.add(value); - } - - public void addFineMiddleValues(TDoubleArrayList values) { - this.fine_middle_values.add(values.toNativeArray()); - } - - public TDoubleArrayList getFineMiddleValues() { - return this.fine_middle_values; - } - - public void addCoarseValue(double value) { - this.coarse_values.add(value); + public Set getKms() { + return kms.keySet(); } - public void addCoarseValues(TDoubleArrayList values) { - this.coarse_values.add(values.toNativeArray()); - } - - public TDoubleArrayList getCoarseValues() { - return this.coarse_values; - } - - public void addSuspSedimentValue(double value) { - this.susp_sediment_values.add(value); - } - - public void addSuspSedimentValues(TDoubleArrayList values) { - this.susp_sediment_values.add(values.toNativeArray()); + public void addKm(double km, SedimentLoadFraction fraction) { + kms.put(km, fraction); } - public TDoubleArrayList getSuspSedimentValues() { - return this.susp_sediment_values; - } - - public void addSuspSandBedValue(double value) { - this.susp_sand_bed_values.add(value); + public SedimentLoadFraction getFraction(double km) { + if (kms.get(km) == null) { + return new SedimentLoadFraction(); + } + return kms.get(km); } - public void addSuspSandBedValues(TDoubleArrayList values) { - this.susp_sand_bed_values.add(values.toNativeArray()); + public void setCoarse(double km, double coarse) { + if (kms.containsKey(km)) { + kms.get(km).setCoarse(coarse); + } + else { + SedimentLoadFraction f = new SedimentLoadFraction(); + f.setCoarse(coarse); + kms.put(km, f); + } } - public TDoubleArrayList getSuspSandBedValues() { - return this.susp_sand_bed_values; + public void setFineMiddle(double km, double fine_middle) { + if (kms.containsKey(km)) { + kms.get(km).setFine_middle(fine_middle); + } + else { + SedimentLoadFraction f = new SedimentLoadFraction(); + f.setFine_middle(fine_middle); + kms.put(km, f); + } + } + + public void setSand(double km, double sand) { + if (kms.containsKey(km)) { + kms.get(km).setSand(sand); + } + else { + SedimentLoadFraction f = new SedimentLoadFraction(); + f.setSand(sand); + kms.put(km, f); + } + } + + public void setSuspSand(double km, double susp_sand) { + if (kms.containsKey(km)) { + kms.get(km).setSusp_sand(susp_sand); + } + else { + SedimentLoadFraction f = new SedimentLoadFraction(); + f.setSusp_sand(susp_sand); + kms.put(km, f); + } + } + + public void setSuspSandBed(double km, double susp_sand_bed) { + if (kms.containsKey(km)) { + kms.get(km).setSusp_sand_bed(susp_sand_bed); + } + else { + SedimentLoadFraction f = new SedimentLoadFraction(); + f.setSusp_sand_bed(susp_sand_bed); + kms.put(km, f); + } + } + + public void setSuspSediment(double km, double susp_sediment) { + if (kms.containsKey(km)) { + kms.get(km).setSusp_sediment(susp_sediment); + } + else { + SedimentLoadFraction f = new SedimentLoadFraction(); + f.setSusp_sediment(susp_sediment); + kms.put(km, f); + } + } + + public void setTotal(double km, double total) { + if (kms.containsKey(km)) { + kms.get(km).setTotal(total); + } + else { + SedimentLoadFraction f = new SedimentLoadFraction(); + f.setTotal(total); + kms.put(km, f); + } } } diff -r 8ddab49ff297 -r 6a65e7ef43c0 flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFactory.java --- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFactory.java Fri Nov 02 14:44:11 2012 +0100 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFactory.java Fri Nov 02 14:48:16 2012 +0100 @@ -58,32 +58,34 @@ "SELECT" + " sy.description AS description, " + " ti.start_time AS year, " + - " syv.value AS load " + + " syv.value AS load, " + + " syv.station AS km " + " FROM sediment_yield sy " + " JOIN rivers r ON sy.river_id = r.id " + " JOIN time_intervals ti ON sy.time_interval_id = ti.id " + - " JOIN sediment_yield_vales syv ON sy.id = syv.sediment_yield_id " + + " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id " + " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id " + " WHERE r.name = :name " + " AND ti.start_time BETWEEN :begin AND :end " + - " AND ti_stop_time IS NULL " + + " AND ti.stop_time IS NULL " + " AND gf.name = :grain " + " AND syv.station BETWEEN :startKm AND :endKm"; public static final String SQL_SELECT_EPOCHS_DATA = "SELECT" + - " sy.description AS description," + - " ti.start_time AS year," + - " syv.value AS load" + + " sy.description AS description, " + + " ti.start_time AS year, " + + " syv.value AS load, " + + " syv.station AS km " + " FROM sediment_yield sy" + " JOIN rivers r ON sy.river_id = r.id " + " JOIN time_intervals ti ON sy.time_interval_id = ti.id" + - " JOIN sediment_yield_vales syv ON sy.id = syv.sediment_yield_id" + + " JOIN sediment_yield_values syv ON sy.id = syv.sediment_yield_id" + " JOIN grain_fraction gf ON sy.grain_fraction_id = gf.id" + " WHERE r.name = :name" + " AND ti.start_time BETWEEN :sbegin AND :send" + - " AND ti_stop_time IS NOT NULL" + - " AND ti_stop_time BETWEEN :ebegin AND :eend" + + " AND ti.stop_time IS NOT NULL" + + " AND ti.stop_time BETWEEN :ebegin AND :eend" + " AND gf.name = :grain " + " AND syv.station BETWEEN :startKm AND :endKm"; @@ -108,7 +110,7 @@ } StaticSedimentLoadCacheKey key = - new StaticSedimentLoadCacheKey(river, startKm, endKm, null); + new StaticSedimentLoadCacheKey(river, startKm, endKm, 0, 0); Element element = cache.get(key); @@ -121,7 +123,7 @@ getSedimentLoadsUncached(river, type, startKm, endKm); if (values != null && key != null) { - log.debug("Store static sediment loads values in cache."); + log.debug("Store static sediment load values in cache."); element = new Element(key, values); cache.put(element); } @@ -133,8 +135,8 @@ String type, double startKm, double endKm, - Date startDate, - Date endDate + int syear, + int eyear ) { log.debug("SedimentLoadFactory.getLoadWithData"); Cache cache = CacheFactory.getCache(LOAD_DATA_CACHE_NAME); @@ -146,12 +148,12 @@ type, startKm, endKm, - startDate, - endDate); + syear, + eyear); } StaticSedimentLoadCacheKey key = - new StaticSedimentLoadCacheKey(river, startKm, endKm, startDate); + new StaticSedimentLoadCacheKey(river, startKm, endKm, syear, eyear); Element element = cache.get(key); @@ -160,8 +162,13 @@ return (SedimentLoad)element.getValue(); } - SedimentLoad values = - getSedimentLoadWithDataUncached(river, type, startKm, endKm, startDate, endDate); + SedimentLoad values = getSedimentLoadWithDataUncached( + river, + type, + startKm, + endKm, + syear, + eyear); if (values != null && key != null) { log.debug("Store static bed height values in cache."); @@ -243,58 +250,52 @@ String type, double startKm, double endKm, - Date sdate, - Date edate + int syear, + int eyear ) { - log.debug("SedimentLoadFactory.getBedHeightUncached"); + log.debug("SedimentLoadFactory.getSedimentLoadWithDataUncached"); Session session = SessionHolder.HOLDER.get(); SQLQuery sqlQuery = null; - Calendar cal = Calendar.getInstance(); - cal.setTime(sdate); - int year = cal.get(Calendar.YEAR); - cal.set(year, 1, 1); + Calendar start = Calendar.getInstance(); + start.set(syear, 1, 1); Calendar end = Calendar.getInstance(); - end.set(year, 12, 31); + end.set(syear, 12, 31); - if (type.equals("single")) { + if (type.equals("year") || type.equals("epoch")) { sqlQuery = session.createSQLQuery(SQL_SELECT_SINGLES_DATA) .addScalar("description", StandardBasicTypes.STRING) .addScalar("year", StandardBasicTypes.DATE) - .addScalar("load", StandardBasicTypes.DOUBLE); + .addScalar("load", StandardBasicTypes.DOUBLE) + .addScalar("km", StandardBasicTypes.DOUBLE); sqlQuery.setString("name", river); sqlQuery.setDouble("startKm", startKm); sqlQuery.setDouble("endKm", endKm); - sqlQuery.setDate("begin", cal.getTime()); + sqlQuery.setDate("begin", start.getTime()); sqlQuery.setDate("end", end.getTime()); sqlQuery.setString("grain", "total"); List results = sqlQuery.list(); SedimentLoad load = new SedimentLoad(); - if (results.size() != 1) { - // should not happen. throw some exception. - return new SedimentLoad(); - } Object[] row = results.get(0); load = new SedimentLoad( (String) row[0], (Date) row[1], null, false); - load.addCoarseValues(getValues("coarse", sqlQuery)); - load.addFineMiddleValues(getValues("fine_middle", sqlQuery)); - load.addSandValues(getValues("sand", sqlQuery)); - load.addSuspSandBedValues(getValues("suspended_sediment", sqlQuery)); - load.addSuspSandBedValues(getValues("susp_sand_bed", sqlQuery)); + getValues("coarse", sqlQuery, load); + getValues("fine_middle", sqlQuery, load); + getValues("sand", sqlQuery, load); + getValues("suspended_sediment", sqlQuery, load); + getValues("susp_sand_bed", sqlQuery, load); + getValues("susp_sand", sqlQuery, load); return load; } - else if (type.equals("epoch")) { - Calendar send = Calendar.getInstance(); - send.setTime(edate); - int eyear = send.get(Calendar.YEAR); - send.set(year, 1, 1); - Calendar eend = Calendar.getInstance(); - eend.set(eyear, 12, 31); + else if (type.equals("off_epoch")) { + Calendar toStart = Calendar.getInstance(); + toStart.set(eyear, 1, 1); + Calendar toEnd = Calendar.getInstance(); + toEnd.set(eyear, 12, 31); sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCHS) .addScalar("description", StandardBasicTypes.STRING) @@ -304,30 +305,32 @@ sqlQuery.setString("name", river); sqlQuery.setDouble("startKm", startKm); sqlQuery.setDouble("endKm", endKm); - sqlQuery.setDate("sbegin", cal.getTime()); + sqlQuery.setDate("sbegin", start.getTime()); sqlQuery.setDate("sbegin", end.getTime()); - sqlQuery.setDate("ebegin",send.getTime()); - sqlQuery.setDate("eend", eend.getTime()); + sqlQuery.setDate("ebegin",toStart.getTime()); + sqlQuery.setDate("eend", toEnd.getTime()); sqlQuery.setString("grain", "total"); List results = sqlQuery.list(); SedimentLoad load = new SedimentLoad(); - if (results.size() != 1) { - // should not happen. throw some exception. - return new SedimentLoad(); - } Object[] row = results.get(0); load = new SedimentLoad( (String) row[0], (Date) row[1], null, false); - load.addCoarseValues(getValues("coarse", sqlQuery)); - load.addFineMiddleValues(getValues("fine_middle", sqlQuery)); - load.addSandValues(getValues("sand", sqlQuery)); - load.addSuspSandBedValues(getValues("suspended_sediment", sqlQuery)); - load.addSuspSandBedValues(getValues("susp_sand_bed", sqlQuery)); + TDoubleArrayList kms = new TDoubleArrayList(); + for (int i = 0; i < results.size(); i++) { + row = results.get(i); + kms.add((Double)row[3]); + } + getValues("coarse", sqlQuery, load); + getValues("fine_middle", sqlQuery, load); + getValues("sand", sqlQuery, load); + getValues("suspended_sediment", sqlQuery, load); + getValues("susp_sand_bed", sqlQuery, load); + getValues("susp_sand", sqlQuery, load); return load; } return new SedimentLoad(); @@ -336,17 +339,38 @@ /** * */ - protected static TDoubleArrayList getValues ( + protected static void getValues ( String fraction, - SQLQuery query + SQLQuery query, + SedimentLoad load ) { query.setString("grain", fraction); List results = query.list(); - TDoubleArrayList values = new TDoubleArrayList(); for (int i = 0; i < results.size(); i++) { Object[] row = results.get(i); - values.add(((Double)row[2]).doubleValue()); + double km = (Double)row[3]; + double v = -1; + if (row[2] != null) { + v = ((Double)row[2]).doubleValue(); + } + if (fraction.equals("coarse")) { + load.setCoarse(km, v); + } + else if (fraction.equals("sand")) { + load.setSand(km, v); + } + else if (fraction.equals("fine_middle")) { + load.setFineMiddle(km, v); + } + else if (fraction.equals("suspended_sediment")) { + load.setSuspSediment(km, v); + } + else if (fraction.equals("sups_sand")) { + load.setSuspSand(km, v); + } + else if (fraction.equals("susp_sand_bed")) { + load.setSuspSandBed(km, v); + } } - return values; } }