diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/util/StageDischargeUtils.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/util/StageDischargeUtils.java index 61730984e3..c66c593bab 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/util/StageDischargeUtils.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/util/StageDischargeUtils.java @@ -29,39 +29,45 @@ import com.raytheon.viz.hydrocommon.HydroConstants; /** * Utility class for Stage/Discharge conversions. + * *
- *
+ * 
  * SOFTWARE HISTORY
- *
+ * 
  * Date			Ticket#		Engineer	Description
  * ------------	----------	-----------	--------------------------
  * Jul 7, 2008	1194		mpduff	Initial creation
  * May 11,2011  9281		lbousaid nothing get display in right y-axis when 
  * 							there is no rating curve
  * Jan 03,2013  15652       wkwock      Fix stage to discharge
+ * Mar 12, 2013 1781        mpduff      Fix stage2discharge flag preventing multiple db queries.
+ * 
  * 
  * 
  * 
- * + * * @author mpduff - * @version 1.0 + * @version 1.0 */ public class StageDischargeUtils { private static String previousLid = null; + private static Rating ratingData = null; - + private static String RATING_QUERY = "select lid,stage,discharge from rating where lid=':lid' order by stage asc"; - + private static String RATING_SHIFT_QUERY = "select lid,date,shift_amount from ratingshift where lid = ':lid' and active='T' order by date desc"; - + private static boolean needToFindShiftAmount = false; - + /** * Returns the corresponding stage value for the discharge value passed in. * - * @param gd the Graph Data - * @param stage the Discharge Value + * @param gd + * the Graph Data + * @param stage + * the Discharge Value * @return the corresponding stage value */ public static double getStageFromDischarge(GraphData gd, double stage) { @@ -72,36 +78,40 @@ public class StageDischargeUtils { break; } } - + return ystage; } - + public static boolean checkRatingTable(String lid) { boolean retVal = false; try { - if ((ratingData == null) || !ratingData.getLid().equalsIgnoreCase(lid)) { + if ((ratingData == null) + || !ratingData.getLid().equalsIgnoreCase(lid)) { ratingData = queryRatingData(lid); needToFindShiftAmount = true; - /* Check the Rating object for data and return true if data are available*/ + /* + * Check the Rating object for data and return true if data are + * available + */ if (ratingData.getStage().size() > 2) { retVal = true; } - /*return false if there is no data */ + /* return false if there is no data */ else { - retVal = false; + retVal = false; } } else { if (ratingData.getLid().equalsIgnoreCase(lid)) { - ratingData = queryRatingData(lid); - needToFindShiftAmount = true; - if (ratingData.getStage().size() > 2) { - retVal = true; - } else { - retVal = false; - } + ratingData = queryRatingData(lid); + needToFindShiftAmount = true; + if (ratingData.getStage().size() > 2) { + retVal = true; + } else { + retVal = false; + } } } - + } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -109,192 +119,203 @@ public class StageDischargeUtils { // TODO Auto-generated catch block e.printStackTrace(); } - + return retVal; } - + /** - * Convert the stage to discharge for the location and stage value passed in. + * Convert the stage to discharge for the location and stage value passed + * in. * - * @param lid The Location ID - * @param stage The Stage Value + * @param lid + * The Location ID + * @param stage + * The Stage Value * @return the corresponding discharge */ public static double stage2discharge(String lid, double stage) { - /* - * Check to determine if the stage value is missing. - * If it is then return a flow value of missing. - */ - if ( stage == HydroConstants.MISSING_VALUE ) { - return HydroConstants.RATING_CONVERT_FAILED ; - } - - double discharge = HydroConstants.MISSING_VALUE; - /* - * If the lid passed in is NOT the same as the previous lid - * then copy lid passed in to previous and get the rating curve + * Check to determine if the stage value is missing. If it is then + * return a flow value of missing. */ - if (!lid.equals(previousLid)) { - previousLid = lid; - - try { - if ((ratingData == null) || !ratingData.getLid().equalsIgnoreCase(lid)) { - needToFindShiftAmount = true; - ratingData = queryRatingData(lid); - } - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (NullPointerException e) { - // TODO Log no rating data here - } catch (Exception e) { - e.printStackTrace(); - } - } - - /* - * if the pointer to the head is NULL then that means there - * is NO rating curve for that location - */ - if (ratingData == null) { - return HydroConstants.RATING_CONVERT_FAILED; - } - - /* - * If there are less than 2 points (ie. one) then that means there - * is NO usable rating curve for that location - */ - if (ratingData.getDischarge().size() < 2) { - //TODO - Log this message printf("Rating table has less than 2 points for LID=%s\n", lid); - return HydroConstants.RATING_CONVERT_FAILED; - } + if (stage == HydroConstants.MISSING_VALUE) { + return HydroConstants.RATING_CONVERT_FAILED; + } - ArrayList ratingShiftArray = null; - double shiftAmount = 0; - ArrayList stageRatingCurve = ratingData.getStage(); - - /* - * Determine if there is a shift factor for this rating curve. - * If there is, then shift each point in the rating curve by this - * factor. - */ - if (needToFindShiftAmount) { - ratingShiftArray = queryRatingShift(lid); - - if ((ratingShiftArray != null) && (ratingShiftArray.size() > 0)) { - Object[] shiftData = ratingShiftArray.get(0); - shiftAmount = (Double)shiftData[2]; - double d; - for (int i = 0; i < stageRatingCurve.size(); i++) { - d = stageRatingCurve.get(i); - d += shiftAmount; - stageRatingCurve.set(i, d); - } - ratingData.setStage(stageRatingCurve); - needToFindShiftAmount = false; - } - } - - ArrayList dischargeList = ratingData.getDischarge(); - double minStage = stageRatingCurve.get(0); - double maxStage = stageRatingCurve.get(stageRatingCurve.size() - 1); - double minDischarge = dischargeList.get(0); - double maxDischarge = dischargeList.get(dischargeList.size() - 1); - - /* - * if the stage value passed in is less then the lowest stage in the - * rating table then extrapolate the discharge - */ - if (stage < minStage) { - double nextStage = stageRatingCurve.get(1); - double stageDifference = nextStage - stage; - double dischargeDifference = dischargeList.get(1) - minDischarge; - if (stageDifference == 0) { - discharge = minDischarge; - } else { - discharge = minDischarge - ((dischargeDifference/stageDifference) * - (minStage - stage)); - } - } + double discharge = HydroConstants.MISSING_VALUE; - /* - * if the stage value passed in is greater then the highest stage in the - * rating table then extrapolate the discharge - */ - if (stage > maxStage) { - double prevStage = stageRatingCurve.get(stageRatingCurve.size() - 2); - double dischargeDifference = maxDischarge - dischargeList.get(dischargeList.size() - 2); - double stageDifference = maxStage - prevStage; - if (stageDifference == 0) { - discharge = maxDischarge; - } else { - discharge = maxDischarge + ((dischargeDifference/stageDifference) * (stage - maxStage)); - } - } - - /* - * if the stage value passed in is between the lowest and highest stage - * in the rating table then interpolate the discharge - */ - if ( (stage >= minStage) && (stage <= (maxStage)) ) { - double lowerStage = minStage; - double lowerDischarge = minDischarge; - for (int i = 1; i < stageRatingCurve.size(); i++) { - double nextStage = stageRatingCurve.get(i); - double nextDischarge = dischargeList.get(i); - if ((stage >= lowerStage) && (stage <= nextStage)) { - double dischargeDifference = nextDischarge - lowerDischarge; - double stageDifference = nextStage - lowerStage; - if (stageDifference == 0) { - discharge = lowerDischarge; - } else { - discharge = lowerDischarge + ((dischargeDifference/stageDifference) * - (stage - lowerStage)); - } - break; - } - lowerStage = nextStage; - lowerDischarge = nextDischarge; - } - } - - /* If for some reason the discharge is < 0 then return missing */ - if (discharge < 0) { - return HydroConstants.RATING_CONVERT_FAILED; - } - - return discharge; + /* + * If the lid passed in is NOT the same as the previous lid then copy + * lid passed in to previous and get the rating curve + */ + if (!lid.equals(previousLid)) { + previousLid = lid; + + try { + if ((ratingData == null) + || !ratingData.getLid().equalsIgnoreCase(lid)) { + needToFindShiftAmount = true; + ratingData = queryRatingData(lid); + } + } catch (VizException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NullPointerException e) { + // TODO Log no rating data here + } catch (Exception e) { + e.printStackTrace(); + } + } + + /* + * if the pointer to the head is NULL then that means there is NO rating + * curve for that location + */ + if (ratingData == null) { + return HydroConstants.RATING_CONVERT_FAILED; + } + + /* + * If there are less than 2 points (ie. one) then that means there is NO + * usable rating curve for that location + */ + if (ratingData.getDischarge().size() < 2) { + // TODO - Log this message + // printf("Rating table has less than 2 points for LID=%s\n", lid); + return HydroConstants.RATING_CONVERT_FAILED; + } + + ArrayList ratingShiftArray = null; + double shiftAmount = 0; + ArrayList stageRatingCurve = ratingData.getStage(); + + /* + * Determine if there is a shift factor for this rating curve. If there + * is, then shift each point in the rating curve by this factor. + */ + if (needToFindShiftAmount) { + ratingShiftArray = queryRatingShift(lid); + + if ((ratingShiftArray != null) && (ratingShiftArray.size() > 0)) { + Object[] shiftData = ratingShiftArray.get(0); + shiftAmount = (Double) shiftData[2]; + double d; + for (int i = 0; i < stageRatingCurve.size(); i++) { + d = stageRatingCurve.get(i); + d += shiftAmount; + stageRatingCurve.set(i, d); + } + ratingData.setStage(stageRatingCurve); + } + needToFindShiftAmount = false; + } + + ArrayList dischargeList = ratingData.getDischarge(); + double minStage = stageRatingCurve.get(0); + double maxStage = stageRatingCurve.get(stageRatingCurve.size() - 1); + double minDischarge = dischargeList.get(0); + double maxDischarge = dischargeList.get(dischargeList.size() - 1); + + /* + * if the stage value passed in is less then the lowest stage in the + * rating table then extrapolate the discharge + */ + if (stage < minStage) { + double nextStage = stageRatingCurve.get(1); + double stageDifference = nextStage - stage; + double dischargeDifference = dischargeList.get(1) - minDischarge; + if (stageDifference == 0) { + discharge = minDischarge; + } else { + discharge = minDischarge + - ((dischargeDifference / stageDifference) * (minStage - stage)); + } + } + + /* + * if the stage value passed in is greater then the highest stage in the + * rating table then extrapolate the discharge + */ + if (stage > maxStage) { + double prevStage = stageRatingCurve + .get(stageRatingCurve.size() - 2); + double dischargeDifference = maxDischarge + - dischargeList.get(dischargeList.size() - 2); + double stageDifference = maxStage - prevStage; + if (stageDifference == 0) { + discharge = maxDischarge; + } else { + discharge = maxDischarge + + ((dischargeDifference / stageDifference) * (stage - maxStage)); + } + } + + /* + * if the stage value passed in is between the lowest and highest stage + * in the rating table then interpolate the discharge + */ + if ((stage >= minStage) && (stage <= (maxStage))) { + double lowerStage = minStage; + double lowerDischarge = minDischarge; + for (int i = 1; i < stageRatingCurve.size(); i++) { + double nextStage = stageRatingCurve.get(i); + double nextDischarge = dischargeList.get(i); + if ((stage >= lowerStage) && (stage <= nextStage)) { + double dischargeDifference = nextDischarge - lowerDischarge; + double stageDifference = nextStage - lowerStage; + if (stageDifference == 0) { + discharge = lowerDischarge; + } else { + discharge = lowerDischarge + + ((dischargeDifference / stageDifference) * (stage - lowerStage)); + } + break; + } + lowerStage = nextStage; + lowerDischarge = nextDischarge; + } + } + + /* If for some reason the discharge is < 0 then return missing */ + if (discharge < 0) { + return HydroConstants.RATING_CONVERT_FAILED; + } + + return discharge; } - + /** - * Convert the discharge to stage for the location and discharge value passed in. + * Convert the discharge to stage for the location and discharge value + * passed in. * - * @param lid The Location ID - * @param stage The Stage Value + * @param lid + * The Location ID + * @param stage + * The Stage Value * @return the corresponding discharge */ public static double discharge2stage(String lid, double discharge) { /* - * Check to see if the discharge value is bad, i.e. missing. - * If it is bad, then return a stage value of missing. + * Check to see if the discharge value is bad, i.e. missing. If it is + * bad, then return a stage value of missing. */ - if ( discharge < 0 ) { - return HydroConstants.RATING_CONVERT_FAILED ; + if (discharge < 0) { + return HydroConstants.RATING_CONVERT_FAILED; } double stage = HydroConstants.MISSING_VALUE; boolean needToFindShiftAmount = false; - + /* - * If the lid passed in is NOT the same as the previous lid - * then copy lid passed in to previous and get the rating curve + * If the lid passed in is NOT the same as the previous lid then copy + * lid passed in to previous and get the rating curve */ if (!lid.equals(previousLid)) { previousLid = lid; needToFindShiftAmount = true; try { - if ((ratingData == null) || !ratingData.getLid().equalsIgnoreCase(lid)) { + if ((ratingData == null) + || !ratingData.getLid().equalsIgnoreCase(lid)) { ratingData = queryRatingData(lid); needToFindShiftAmount = true; } @@ -307,19 +328,20 @@ public class StageDischargeUtils { } /* - * if the pointer to the head is NULL then that means there - * is NO rating curve for that location + * if the pointer to the head is NULL then that means there is NO rating + * curve for that location */ if (ratingData == null) { return HydroConstants.RATING_CONVERT_FAILED; } /* - * If there are less than 2 points (ie. one) then that means there - * is NO usable rating curve for that location + * If there are less than 2 points (ie. one) then that means there is NO + * usable rating curve for that location */ if (ratingData.getDischarge().size() < 2) { - //TODO - Log this message printf("Rating table has less than 2 points for LID=%s\n", lid); + // TODO - Log this message + // printf("Rating table has less than 2 points for LID=%s\n", lid); return HydroConstants.RATING_CONVERT_FAILED; } @@ -328,22 +350,22 @@ public class StageDischargeUtils { ArrayList dischargeRatingCurve = ratingData.getDischarge(); /* - * Determine if there is a shift factor for this rating curve. - * If there is, then shift each point in the rating curve by this - * factor. + * Determine if there is a shift factor for this rating curve. If there + * is, then shift each point in the rating curve by this factor. */ if (needToFindShiftAmount) { - ratingShiftArray = queryRatingShift(lid); + ratingShiftArray = queryRatingShift(lid); if ((ratingShiftArray != null) && (ratingShiftArray.size() > 0)) { Object[] shiftData = ratingShiftArray.get(0); - shiftAmount = (Double)shiftData[2]; + shiftAmount = (Double) shiftData[2]; } } ArrayList stageList = ratingData.getStage(); double minDischarge = dischargeRatingCurve.get(0); - double maxDischarge = dischargeRatingCurve.get(dischargeRatingCurve.size() - 1); + double maxDischarge = dischargeRatingCurve.get(dischargeRatingCurve + .size() - 1); double minStage = stageList.get(0); double maxStage = stageList.get(stageList.size() - 1); @@ -358,103 +380,116 @@ public class StageDischargeUtils { if (dischargeDifference == 0) { stage = minStage; } else { - stage = minStage - ((stageDifference/dischargeDifference) * - (minDischarge - discharge)); + stage = minStage + - ((stageDifference / dischargeDifference) * (minDischarge - discharge)); } } /* - * if the discharge value passed in is greater then the highest discharge - * in the rating table then extrapolate the stage + * if the discharge value passed in is greater then the highest + * discharge in the rating table then extrapolate the stage */ if (discharge > maxDischarge) { - double prevDischarge = dischargeRatingCurve.get(dischargeRatingCurve.size() - 2); + double prevDischarge = dischargeRatingCurve + .get(dischargeRatingCurve.size() - 2); double dischargeDifference = maxDischarge - prevDischarge; - double stageDifference = maxStage - stageList.get(stageList.size() - 2); + double stageDifference = maxStage + - stageList.get(stageList.size() - 2); if (dischargeDifference == 0) { stage = maxStage; } else { - stage = maxStage + ((stageDifference/dischargeDifference) * - (discharge - maxDischarge)); + stage = maxStage + + ((stageDifference / dischargeDifference) * (discharge - maxDischarge)); } - } - - /* - if the discharge value passed in is between the lowest and highest - discharge in the rating table then interpolate the stage - */ - if ((discharge <= maxDischarge) && (discharge >= minDischarge)) - { - double lowerStage = minStage; - double lowerDischarge = minDischarge; - - for (int i = 1; i < dischargeRatingCurve.size(); i++) { - double nextDischarge = dischargeRatingCurve.get(i); - double nextStage = stageList.get(i); - - if ((discharge >= lowerDischarge) && (discharge <= nextDischarge)) { - double dischargeDifference = nextDischarge - lowerDischarge; - double stageDifference = nextStage - lowerStage; + } - if (dischargeDifference == 0) { - stage = lowerStage; - } else { - stage = lowerStage + ((stageDifference/dischargeDifference) * - (discharge - lowerDischarge)); - } - break; - } - lowerStage = nextStage; - lowerDischarge = nextDischarge; - } - } - - stage += shiftAmount; - return stage; + /* + * if the discharge value passed in is between the lowest and highest + * discharge in the rating table then interpolate the stage + */ + if ((discharge <= maxDischarge) && (discharge >= minDischarge)) { + double lowerStage = minStage; + double lowerDischarge = minDischarge; + + for (int i = 1; i < dischargeRatingCurve.size(); i++) { + double nextDischarge = dischargeRatingCurve.get(i); + double nextStage = stageList.get(i); + + if ((discharge >= lowerDischarge) + && (discharge <= nextDischarge)) { + double dischargeDifference = nextDischarge - lowerDischarge; + double stageDifference = nextStage - lowerStage; + + if (dischargeDifference == 0) { + stage = lowerStage; + } else { + stage = lowerStage + + ((stageDifference / dischargeDifference) * (discharge - lowerDischarge)); + } + break; + } + lowerStage = nextStage; + lowerDischarge = nextDischarge; + } + } + + stage += shiftAmount; + return stage; } /** * Get the data from the IHFS Rating table for the specified Location Id. * - * @param lid The Location ID + * @param lid + * The Location ID * @return The data from the rating table in IHFS * @throws VizException */ - private static Rating queryRatingData(String lid) throws VizException, NullPointerException { + private static Rating queryRatingData(String lid) throws VizException, + NullPointerException { /* Query the rating table */ - + Rating rating = new Rating(lid); - - List results = DirectDbQuery.executeQuery(RATING_QUERY.replace(":lid", lid), HydroConstants.IHFS, QueryLanguage.SQL); + + List results = DirectDbQuery.executeQuery( + RATING_QUERY.replace(":lid", lid), HydroConstants.IHFS, + QueryLanguage.SQL); if (results != null) { - //the Rating constructor already add stage and discharge to it. so clear it... - rating.getStage().clear(); - rating.getDischarge().clear(); + // the Rating constructor already add stage and discharge to it. so + // clear it... + rating.getStage().clear(); + rating.getDischarge().clear(); for (int i = 0; i < results.size(); i++) { Object[] sa = results.get(i); - if (((sa[1] != null) || (sa[1] != "")) && ((sa[2] != null) || (sa[2] != ""))) { - rating.addStage((Double)sa[1]); - rating.addDischarge((Double)sa[2]); + if (((sa[1] != null) || (sa[1] != "")) + && ((sa[2] != null) || (sa[2] != ""))) { + rating.addStage((Double) sa[1]); + rating.addDischarge((Double) sa[2]); } } } return rating; } - + /** - * Get the data from the IHFS RatingShift table for the specified Location Id. + * Get the data from the IHFS RatingShift table for the specified Location + * Id. * - * @param lid The Location ID - * @return The data from the ratingShift table in IHFS, null if no data available + * @param lid + * The Location ID + * @return The data from the ratingShift table in IHFS, null if no data + * available * @throws VizException */ private static ArrayList queryRatingShift(String lid) { /* Query the ratingShift table */ ArrayList results = null; try { - results = (ArrayList)DirectDbQuery.executeQuery(RATING_SHIFT_QUERY.replace(":lid", lid), HydroConstants.IHFS, QueryLanguage.SQL); + results = (ArrayList) DirectDbQuery.executeQuery( + RATING_SHIFT_QUERY.replace(":lid", lid), + HydroConstants.IHFS, QueryLanguage.SQL); } catch (VizException e) { e.printStackTrace(); } catch (NullPointerException e) {