diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDataManager.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDataManager.java
index 1095891aed..30e2a0b8bc 100644
--- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDataManager.java
+++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/timeseries/TimeSeriesDataManager.java
@@ -53,7 +53,7 @@ import com.raytheon.viz.hydrocommon.util.DbUtils;
/**
* Class for managing database query calls. TimeSeriesDataManager.java
- *
+ *
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
@@ -70,1332 +70,1344 @@ import com.raytheon.viz.hydrocommon.util.DbUtils;
* July 25 2011 10082 djingtao modify edit()
* May 30 2012 14967 wkwock overload insertRejectedData method
* Feb 22 2013 14676 lbousaidi check when producttime is null
+ * Mar 25, 2013 1781 mpduff Constrain time series table query with a start time.
*
- *
+ *
* @author dhladky
* @version 1.0
*/
public class TimeSeriesDataManager extends HydroDataManager {
- private static final String TIME_SERIES_DATA_QUERY = "select lid,obstime,lid,product_id from latestobsvalue";
-
- private final String INGEST_FILTER_QUERY = "select lid,pe,ts,extremum,dur from ingestfilter where lid=':lid' and ingest = 'T' order by pe asc,ts_rank asc,ts asc,dur asc,extremum asc";
-
- private final String SHEF_PE_QUERY = "select name||' '|| eng_unit from shefpe where pe=':pe'";
-
- private static final String SHEF_PE_GENERIC_UNITS = "Generic Units";
-
- private static TimeSeriesDataManager manager = null;
-
- private Map stationData;
-
- private boolean sortChanged = false;
-
- private static SimpleDateFormat dateFormat;
-
- /**
- * Map holding the location id and display class.
- */
- private Map stnDisplayMap = null;
-
- static {
- dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
- }
-
- /**
- * private constructor
- */
- private TimeSeriesDataManager() {
- }
-
- /**
- * Get an instance of this singleton object
- *
- * @return instance of this class
- */
- public static synchronized TimeSeriesDataManager getInstance() {
- if (manager == null) {
- manager = new TimeSeriesDataManager();
- }
- return manager;
- }
-
- /**
- * Get TimeSeriesData from the DB
- *
- * @return Object[]
- */
- public Object[] getTimeSeriesData() {
- List data;
-
- try {
- data = DirectDbQuery.executeQuery(TIME_SERIES_DATA_QUERY,
- HydroConstants.IHFS, QueryLanguage.SQL);
- if (data != null) {
- return data.get(0);
- }
- } catch (VizException e) {
-
- }
- return null;
- }
-
- /**
- * Get TimeSeriesStationData from the DB
- *
- * @return map
- */
- public Map getTimeSeriesStationData() {
- return getTimeSeriesStationData(false);
- }
-
- /**
- * Get the station list data sorted by lid.
- *
- * @param sortByName
- * boolean
- * @return map
- */
- public Map getTimeSeriesStationData(boolean sortByName) {
- boolean stnDisplayMapSet = true;
-
- StringBuilder sql = new StringBuilder("Select ");
- sql.append("distinct location.lid, ingestfilter.pe, ");
- sql.append("upper(location.name) as uppername, stnclass.disp_Class ");
- sql.append("from ingestfilter, location, stnclass ");
- sql.append("where ingest='T' and location.lid = stnclass.lid ");
- sql.append("and location.lid=ingestfilter.lid ");
-
- if (sortByName) {
- sql.append("order by uppername asc");
- } else {
- sql.append("order by lid asc");
- }
-
- // if the sort changed then requery for the data
- if (sortChanged != sortByName) {
- sortChanged = true;
- }
-
- if (stnDisplayMap == null) {
- stnDisplayMap = new HashMap();
- stnDisplayMapSet = false;
- }
-
- if ((stationData == null) || sortChanged) {
- stationData = new LinkedHashMap();
-
- List data;
- try {
- data = DirectDbQuery.executeQuery(sql.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
- for (Object[] rowData : data) {
- if (rowData[2] == null) {
- rowData[2] = "";
- }
- stationData.put((String) rowData[0], (String) rowData[2]);
- if (!stnDisplayMapSet) {
- stnDisplayMap.put((String) rowData[0],
- (String) rowData[3]);
- }
- }
- } catch (VizException e) {
- e.printStackTrace();
- }
- }
-
- return stationData;
- }
-
- /**
- * Get the site's PE data for graphical display
- *
- * @param lid
- * The lid to query for
- * @return ArrayList of Object[] of data
- * @throws VizException
- */
- public List getSitePEData(String lid) throws VizException {
- return DirectDbQuery.executeQuery(
- INGEST_FILTER_QUERY.replace(":lid", lid), HydroConstants.IHFS,
- QueryLanguage.SQL);
- }
-
- /**
- * Get the site's PE data for tabular display
- *
- * @param lid
- * The lid to query for
- * @return List of SiteInfo objects
- * @throws VizException
- */
- public List getTabularPEData(String lid) throws VizException {
- StringBuilder sql = new StringBuilder("select ");
- sql.append("lid, pe, dur, ts, extremum from Ingestfilter ");
- sql.append("where lid = '" + lid + "' and ingest = 'T' ");
- sql.append("order by pe, dur, ts, extremum asc");
-
- ArrayList results = (ArrayList) DirectDbQuery
- .executeQuery(sql.toString(), HydroConstants.IHFS,
- QueryLanguage.SQL);
-
- ArrayList returnData = new ArrayList();
- for (int i = 0; i < results.size(); i++) {
- Object[] oa = results.get(i);
- SiteInfo si = new SiteInfo();
- si.setLid((String) oa[0]);
- si.setPe((String) oa[1]);
- si.setDur((Integer) oa[2]);
- si.setTs((String) oa[3]);
- si.setExt((String) oa[4]);
- returnData.add(si);
- }
-
- return returnData;
- }
-
- /**
- * Checks the record count in the Location and Stnclass tables.
- *
- * @return true if same count, otherwise false
- * @throws VizException
- */
- public boolean checkLidCount() throws VizException {
- /* Set up a location query */
- String locationTable = "locview";
- String stnClassTable = "stnclass";
-
- StringBuilder errMessage = null;
- errMessage = new StringBuilder(
- "Error querying the Location table, no data returned");
-
- /* Execute the location query */
- long locationCount = recordCount(locationTable, "");
- if (locationCount <= 0) {
- throw new VizException(errMessage.toString());
- }
- errMessage.setLength(0);
-
- errMessage.setLength(0);
- errMessage
- .append("Error querying the Stnclass table, no data returned");
-
- /* Execute the Stnclass query */
- long stnClassCount = recordCount(stnClassTable, "");
-
- if (stnClassCount <= 0) {
- throw new VizException(errMessage.toString());
- }
-
- if (stnClassCount == locationCount) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Get the shef pe data from IHFS.
- *
- * @param pe
- * The PE value
- * @return The units of the data
- * @throws VizException
- */
- public String getShefPE(String pe) throws VizException {
-
- List data = DirectDbQuery.executeQuery(
- SHEF_PE_QUERY.replace(":pe", pe), HydroConstants.IHFS,
- QueryLanguage.SQL);
- if ((data != null) && (data.size() > 0)) {
- Object[] sa = data.get(0);
- return (String) sa[0];
-
- }
- return SHEF_PE_GENERIC_UNITS;
- }
-
- /**
- * Query the table.
- *
- * @param tablename
- * The table to query
- * @param lid
- * The location id
- * @param pe
- * The physical element
- * @param ts
- * The type source
- * @param startTime
- * The start time
- * @param endTime
- * The end time
- * @return The List of Object[] data
- * @throws VizException
- * @throws ClassNotFoundException
- */
- public ArrayList getGraphData(String tablename, String lid,
- String pe, String ts, String dur, String extremum, Date startTime, Date endTime)
- throws VizException, ClassNotFoundException {
-
- StringBuilder graphQuery = new StringBuilder(
- "select lid,obstime,value,product_id from ");
- graphQuery.append(tablename + " where lid = '" + lid + "' and pe = '"
- + pe + "' " + "and dur = '" + dur + "' ");
- graphQuery.append("and ts = '" + ts + "' and extremum = '" + extremum.toUpperCase() + "' and obstime ");
- graphQuery.append("between '"
- + HydroConstants.DATE_FORMAT.format(startTime) + "' ");
- graphQuery.append("and '" + HydroConstants.DATE_FORMAT.format(endTime)
- + "' ");
- graphQuery.append("order by obstime asc");
-
- return (ArrayList) DirectDbQuery.executeQuery(
- graphQuery.toString(), HydroConstants.IHFS, QueryLanguage.SQL);
- }
-
- /**
- * Query the Riverstat table for the flood/action stage/flow.
- *
- * @param lid
- * The Location Id
- * @return The list of flood stage values
- * @throws VizException
- */
- public List getFloodStage(String lid) throws VizException {
- /* Query the floodCat table for the flood stage data */
- String floodQuerySql = "select lid,fs,fq,wstg,action_Flow from riverstat where lid = '"
- + lid + "'";
- return DirectDbQuery.executeQuery(floodQuerySql, HydroConstants.IHFS,
- QueryLanguage.SQL);
- }
-
- /**
- * Query the floodcat table for the flood stage.
- *
- * @param lid
- * The Location Id
- * @return The flood stage value as a String
- */
- public List getFloodCategories(String lid) throws VizException {
- String floodQuerySql = "select " + HydroConstants.LID + ","
- + HydroConstants.MINOR_STAGE + ","
- + HydroConstants.MODERATE_STAGE + ","
- + HydroConstants.MAJOR_STAGE + "," + HydroConstants.MINOR_FLOW
- + "," + HydroConstants.MODERATE_FLOW + ","
- + HydroConstants.MAJOR_FLOW + " from floodcat where lid = '"
- + lid + "'";
- return DirectDbQuery.executeQuery(floodQuerySql, HydroConstants.IHFS,
- QueryLanguage.SQL);
- }
-
- /**
- * Get the Station name and river name.
- *
- * @param lid
- * Location Id of the station
- * @return List of Object[] containing the data
- * @throws VizException
- */
- public String[] getStnRiverName(String lid) throws VizException {
- StringBuilder sql = new StringBuilder("select ");
- sql.append("name ");
- sql.append("from location ");
- sql.append(" where lid = '" + lid + "'");
-
- ArrayList result1 = (ArrayList) DirectDbQuery
- .executeQuery(sql.toString(), HydroConstants.IHFS,
- QueryLanguage.SQL);
-
- sql.setLength(0);
- sql.append("select stream from riverstat where lid = '" + lid + "'");
-
- ArrayList result2 = (ArrayList) DirectDbQuery
- .executeQuery(sql.toString(), HydroConstants.IHFS,
- QueryLanguage.SQL);
-
- ArrayList sa = new ArrayList();
-
- if ((result1 != null) && (result1.size() > 0)) {
- sa.add((String) result1.get(0)[0]);
- } else {
- sa.add(HydroConstants.UNDEFINED);
- }
-
- if ((result2 != null) && (result2.size() > 0)) {
- sa.add((String) result2.get(0)[0]);
- } else {
- sa.add(HydroConstants.UNDEFINED);
- }
-
- return sa.toArray(new String[sa.size()]);
- }
-
- /**
- * Gets a unique list of basis times.
- *
- * @param table
- * The table to query
- * @param lid
- * The lid to query on
- * @param pe
- * The pe to query on
- * @param dur
- * The duration to query on
- * @param ts
- * The type source to query on
- * @param ext
- * The extremum to query on
- * @param begin
- * The beginning time
- * @param end
- * The ending time
- * @return List of Object arrays
- * @throws VizException
- * @throws ClassNotFoundException
- */
- public List getUniqueList(String table, String lid, String pe,
- int dur, String ts, String ext, Date begin, Date end)
- throws VizException, ClassNotFoundException {
- StringBuilder sql = new StringBuilder("select ");
- sql.append("distinct(basistime) from " + table + " ");
- sql.append("where lid = '" + lid + "' and ts = '" + ts + "' and ");
- sql.append("dur = '" + dur + "' and extremum = '" + ext + "' and ");
- sql.append("validtime > '" + dateFormat.format(begin) + "' and ");
- sql.append("validtime < '" + dateFormat.format(end) + "' ");
- sql.append("order by basistime desc");
-
- return DirectDbQuery.executeQuery(sql.toString(), HydroConstants.IHFS,
- QueryLanguage.SQL);
- }
-
- /**
- * Query for the data records
- *
- * @param tablename
- * The table to query
- * @param lid
- * The lid to query on
- * @param pe
- * The pe to query on
- * @param ts
- * The type source to query on
- * @param dur
- * The duration to query on
- * @param ext
- * The extremum to query on
- * @param startTime
- * The start time of the data
- * @param endTime
- * The end time of the data
- * @param basisTime
- * The forecast basis time, null if not forecast data
- * @param forecastData
- * true if forecast data
- * @return ArrayList of TabularData
- * @throws VizException
- * @throws ClassNotFoundException
- */
- public ArrayList getTabularData(String tablename, String lid,
- String pe, String ts, String dur, String ext, Date startTime,
- Date endTime, String basisTime, boolean forecastData)
- throws VizException, ClassNotFoundException {
- StringBuilder sql = new StringBuilder("select ");
-
- if (forecastData) {
- sql.append("lid, validtime, value, revision, shef_qual_code, ");
- sql.append("quality_code, product_id, producttime, postingtime, ");
- sql.append("basistime, probability ");
- sql.append("from " + tablename);
- sql.append(" where lid = '" + lid + "'");
- sql.append(" and pe = '" + pe + "'");
- sql.append(" and ts = '" + ts + "'");
- sql.append(" and dur = " + dur);
- sql.append(" and extremum = '" + ext + "'");
- sql.append(" and validtime > '" + dateFormat.format(startTime)
- + "'");
- sql.append(" and validtime < '" + dateFormat.format(endTime) + "'");
- sql.append(" and basistime = '" + basisTime + "'");
- sql.append(" order by validtime desc");
- } else {
- sql.append("lid, obstime, value, revision, shef_qual_code, ");
- sql.append("quality_code, product_id, producttime, postingtime ");
- sql.append("from " + tablename);
- sql.append(" where lid = '" + lid + "'");
- sql.append(" and pe = '" + pe + "'");
- sql.append(" and ts = '" + ts + "'");
- sql.append(" and dur = " + dur);
- sql.append(" and extremum = '" + ext + "'");
- sql.append(" and obstime < '" + dateFormat.format(endTime) + "'");
- sql.append(" order by obstime desc");
- }
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sql.toString());
- }
-
- ArrayList tabularData = new ArrayList();
- ArrayList results = (ArrayList) DirectDbQuery
- .executeQuery(sql.toString(), HydroConstants.IHFS,
- QueryLanguage.SQL);
-
- for (int i = 0; i < results.size(); i++) {
- Object[] oa = results.get(i);
- TabularData td = new TabularData();
- td.setLid((String) oa[0]);
- td.setObsTime((Date) oa[1]);
- td.setValue((Double) oa[2]);
- td.setRevision((Integer) oa[3]);
- td.setShefQualCode((String) oa[4]);
- td.setQualityCode((Integer) oa[5]);
- td.setProductId((String) oa[6]);
- td.setProductTime((Date) oa[7]);
- td.setPostingTime((Date) oa[8]);
- if (forecastData) {
- td.setValidTime((Date) oa[9]);
- td.setProbability((Float) oa[10]);
- }
- tabularData.add(td);
- }
-
- return tabularData;
- }
-
- /**
- * Get the record count of the table.
- *
- * @param table
- * The table to query
- * @param where
- * The where statement
- * @return Number of rows in the table, or -1 if error
- * @throws VizException
- */
- public long recordCount(String table, String where) throws VizException {
- if ((table == null) || table.equals("")) {
- return -1;
- }
-
- String sql = "select count(*) from " + table + where;
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sql);
- }
-
- List results = DirectDbQuery.executeQuery(sql.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
-
- if ((results == null) || (results.get(0) == null)) {
- return -1;
- }
-
- return (Long) results.get(0)[0];
- }
-
- /**
- * Delete the record.
- *
- * @param tablename
- * The tablename to query
- * @param where
- * The where statement
- * @throws VizException
- */
- public void deleteRecord(String tablename, String where)
- throws VizException {
- String sql = "delete from " + tablename + " " + where;
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sql);
- }
- DirectDbQuery.executeStatement(sql, HydroConstants.IHFS,
- QueryLanguage.SQL);
- }
-
- /**
- * Delete a list of items.
- *
- * @param queryList
- * list of queries
- * @throws VizException
- */
- public void deleteRecords(ArrayList queryList) throws VizException {
- StringBuilder sb = new StringBuilder();
- for (String query : queryList) {
- sb.append(query);
- }
-
- DirectDbQuery.executeStatement(sb.toString(), HydroConstants.IHFS,
- QueryLanguage.SQL);
- }
-
- /**
- * Add a data record.
- *
- * @param tablename
- * The tablename to query
- * @param dr
- * The data record to add
- * @return int
- * @throws VizException
- */
- public int addDataRecord(String tablename, DataRecord dr)
- throws VizException {
- StringBuilder sb = new StringBuilder();
- Date now = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
- if (tablename.startsWith("Fcst") || tablename.startsWith("fcst")
- || tablename.startsWith("Contingency")) {
- sb.append("insert into " + tablename
- + "(lid, pe, dur, ts, extremum, ");
- sb.append("probability, validtime, basistime, value, quality_code, ");
- sb.append("shef_qual_code, revision, product_id, producttime, postingtime) ");
- sb.append("values ('" + dr.getLid() + "', '"
- + dr.getPe().toUpperCase() + "', ");
- sb.append(dr.getDur() + ", '" + dr.getTs().toUpperCase() + "', '");
- sb.append(dr.getExt().toUpperCase() + "', -1, ");
- Date d;
- if (dr.getObsTime() instanceof Timestamp) {
- d = timestampToDate((Timestamp) dr.getObsTime());
- sb.append("'" + dateFormat.format(d) + "', '");
- } else {
- sb.append("'" + dateFormat.format(dr.getObsTime()) + "', '");
- }
- sb.append(dr.getBasisTime() + "', " + dr.getValue() + ", ");
- sb.append(dr.getQualityCode() + ", '" + dr.getShefQualCode()
- + "', ");
- sb.append(dr.getRevision() + ", '" + dr.getProductId() + "', ");
- if (dr.getObsTime() instanceof Timestamp) {
- d = timestampToDate((Timestamp) dr.getProductTime());
- sb.append("'" + dateFormat.format(d) + "', '");
- } else {
- sb.append("'" + dateFormat.format(dr.getProductTime()) + "', '");
- }
- sb.append(dateFormat.format(now) + "')");
-
- } else {
- sb.append("insert into " + tablename
- + "(lid, pe, dur, ts, extremum, ");
- sb.append("obstime, postingtime, value, quality_code, shef_qual_code, productTime, ");
- sb.append("revision, product_Id) ");
- sb.append("values ('" + dr.getLid() + "', '"
- + dr.getPe().toUpperCase() + "', ");
- sb.append(dr.getDur() + ", '" + dr.getTs().toUpperCase() + "', '");
- sb.append(dr.getExt().toUpperCase() + "', ");
- Date d;
- if (dr.getObsTime() instanceof Timestamp) {
- d = timestampToDate((Timestamp) dr.getObsTime());
- sb.append("'" + dateFormat.format(d) + "', '");
- } else {
- sb.append("'" + dateFormat.format(dr.getObsTime()) + "', '");
- }
-
- sb.append(dateFormat.format(now) + "', ");
-
- sb.append(dr.getValue() + ", ");
- sb.append(dr.getQualityCode() + ", '");
- sb.append(dr.getShefQualCode() + "', '");
- sb.append(dr.getProductTime() + "', ");
- sb.append("0, '" + dr.getProductId() + "')");
- }
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sb.toString());
- }
-
- return DirectDbQuery.executeStatement(sb.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
- }
-
- /**
- * Update sql.
- *
- * @param sql
- * The sql string
- * @return int
- * @throws VizException
- */
- public int update(String sql) throws VizException {
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sql);
- }
-
- return DirectDbQuery.executeStatement(sql, HydroConstants.IHFS,
- QueryLanguage.SQL);
- }
-
- /**
- * Insert rejected data record.
- *
- * @param dr
- * The data record
- * @return int
- * @throws VizException
- */
- public int insertRejectedData(DataRecord dr) throws VizException {
- Rejecteddata rd = new Rejecteddata();
- RejecteddataId rdid = new RejecteddataId();
- Date d = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
-
- /* set basistime to obstime for observed data */
- if (dr.getBasisTime() != null) {
- try {
- rdid.setBasistime(HydroConstants.DATE_FORMAT.parse(dr
- .getBasisTime()));
- } catch (ParseException e) {
- rdid.setBasistime(dr.getObsTime());
- }
- } else {
- rdid.setBasistime(dr.getObsTime());
- }
-
- rdid.setDur((short) dr.getDur());
- rdid.setExtremum(dr.getExt());
- rdid.setLid(dr.getLid());
- rdid.setPe(dr.getPe());
-
- /* set postingtime to current time */
- rdid.setPostingtime(d);
-
- rdid.setProbability(-1);
- rdid.setTs(dr.getTs());
- rdid.setValidtime(dr.getValidTime());
- rd.setId(rdid);
-
- rd.setProductId(dr.getProductId());
- rd.setProducttime(dr.getProductTime());
- rd.setQualityCode((int) dr.getQualityCode());
-
- /* set reject_type to M for Manual */
- rd.setRejectType("M");
-
- rd.setRevision((short) dr.getRevision());
- rd.setShefQualCode(dr.getShefQualCode());
- rd.setUserid(LocalizationManager.getInstance().getCurrentUser());
- rd.setValue(dr.getValue());
-
- /* set validtime for observed data */
- if (rdid.getValidtime() == null) {
- rdid.setValidtime(dr.getObsTime());
- }
-
- return DirectDbQuery.saveOrUpdate(rd, HydroConstants.IHFS);
- }
-
- /**
- * Insert a list of items into the rejected table
- *
- * @param recordList
- * List of DataRecord objects
- * @return
- * @throws VizException
- */
- public int insertRejectedData(ArrayList recordList)
- throws VizException {
- StringBuilder sb = new StringBuilder();
-
- Date d = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
- for (DataRecord dr : recordList) {
- sb.append("insert into rejecteddata(lid, pe, dur, ts, extremum, ");
- sb.append("probability, validtime, basistime, postingtime, value, ");
- sb.append("revision, shef_qual_code, product_id, producttime, quality_code, ");
- sb.append("reject_type, userid) VALUES(");
-
- sb.append("'" + dr.getLid() + "', ");
- sb.append("'" + dr.getPe() + "', ");
- sb.append(dr.getDur() + ", ");
- sb.append("'" + dr.getTs() + "', ");
- sb.append("'" + dr.getExt() + "', ");
- sb.append(-1 + ", ");
-
- /* set validtime for observed data */
- if (dr.getValidTime() != null) {
- sb.append("'"
- + HydroConstants.DATE_FORMAT.format(dr.getValidTime())
- + "', ");
- } else {
- sb.append("'"
- + (HydroConstants.DATE_FORMAT.format(dr.getObsTime()))
- + "', ");
- }
-
- if (dr.getBasisTime() != null) {
- try {
- sb.append("'"
- + (HydroConstants.DATE_FORMAT.parse(dr
- .getBasisTime())) + "', ");
- } catch (ParseException e) {
- sb.append("'"
- + (HydroConstants.DATE_FORMAT.format(dr
- .getObsTime())) + "', ");
- }
- } else {
- sb.append("'"
- + (HydroConstants.DATE_FORMAT.format(dr.getObsTime()))
- + "', ");
- }
-
- sb.append("'" + HydroConstants.DATE_FORMAT.format(d) + "', ");
- sb.append(dr.getValue() + ", ");
- sb.append(dr.getRevision() + ", ");
- sb.append("'" + dr.getShefQualCode() + "', ");
- sb.append("'" + dr.getProductId() + "', ");
- sb.append("'"
- + HydroConstants.DATE_FORMAT.format(dr.getProductTime())
- + "', ");
- sb.append(dr.getQualityCode() + ", ");
- sb.append("'M', ");
- sb.append("'" + LocalizationManager.getInstance().getCurrentUser()
- + "');");
- }
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sb.toString());
- }
-
- return DirectDbQuery.executeStatement(sb.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
- }
-
- private Object getDataFromDB (ForecastData dr, String field) {
- StringBuilder sql = new StringBuilder("select "+field+" from ");
- String tablename = DbUtils.getTableName(dr.getPe(), dr.getTs());
- sql.append(tablename + " where ");
- sql.append("lid = '" + dr.getLid() + "' ");
- sql.append("and pe = '" + dr.getPe().toUpperCase() + "' ");
- sql.append("and dur =" +dr.getDur()+" ");
- sql.append("and ts = '"+dr.getTs().toUpperCase()+"' ");
- sql.append("and extremum = '" +dr.getExtremum().toUpperCase()+"' ");
- if (dr.getTs().toUpperCase().startsWith("F") || dr.getTs().toUpperCase().startsWith("C")){
- sql.append("and validtime = '"+dr.getValidTime()+"' ");
- sql.append("and basistime = '"+dr.getBasisTime()+"';");
- }else {//obs data
- sql.append("and obstime = '"+dr.getObsTime()+"';");
- }
- List sqlResult;
- try {
- sqlResult = (DirectDbQuery.executeQuery(sql.toString(), HydroConstants.IHFS, QueryLanguage.SQL));
- if (sqlResult !=null && sqlResult.size()>0 && sqlResult.get(0)[0]!=null) {
+ private static final String TIME_SERIES_DATA_QUERY = "select lid,obstime,lid,product_id from latestobsvalue";
+
+ private final String INGEST_FILTER_QUERY = "select lid,pe,ts,extremum,dur from ingestfilter where lid=':lid' and ingest = 'T' order by pe asc,ts_rank asc,ts asc,dur asc,extremum asc";
+
+ private final String SHEF_PE_QUERY = "select name||' '|| eng_unit from shefpe where pe=':pe'";
+
+ private static final String SHEF_PE_GENERIC_UNITS = "Generic Units";
+
+ private static TimeSeriesDataManager manager = null;
+
+ private Map stationData;
+
+ private boolean sortChanged = false;
+
+ private static SimpleDateFormat dateFormat;
+
+ /**
+ * Map holding the location id and display class.
+ */
+ private Map stnDisplayMap = null;
+
+ static {
+ dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
+ }
+
+ /**
+ * private constructor
+ */
+ private TimeSeriesDataManager() {
+ }
+
+ /**
+ * Get an instance of this singleton object
+ *
+ * @return instance of this class
+ */
+ public static synchronized TimeSeriesDataManager getInstance() {
+ if (manager == null) {
+ manager = new TimeSeriesDataManager();
+ }
+ return manager;
+ }
+
+ /**
+ * Get TimeSeriesData from the DB
+ *
+ * @return Object[]
+ */
+ public Object[] getTimeSeriesData() {
+ List data;
+
+ try {
+ data = DirectDbQuery.executeQuery(TIME_SERIES_DATA_QUERY,
+ HydroConstants.IHFS, QueryLanguage.SQL);
+ if (data != null) {
+ return data.get(0);
+ }
+ } catch (VizException e) {
+
+ }
+ return null;
+ }
+
+ /**
+ * Get TimeSeriesStationData from the DB
+ *
+ * @return map
+ */
+ public Map getTimeSeriesStationData() {
+ return getTimeSeriesStationData(false);
+ }
+
+ /**
+ * Get the station list data sorted by lid.
+ *
+ * @param sortByName
+ * boolean
+ * @return map
+ */
+ public Map getTimeSeriesStationData(boolean sortByName) {
+ boolean stnDisplayMapSet = true;
+
+ StringBuilder sql = new StringBuilder("Select ");
+ sql.append("distinct location.lid, ingestfilter.pe, ");
+ sql.append("upper(location.name) as uppername, stnclass.disp_Class ");
+ sql.append("from ingestfilter, location, stnclass ");
+ sql.append("where ingest='T' and location.lid = stnclass.lid ");
+ sql.append("and location.lid=ingestfilter.lid ");
+
+ if (sortByName) {
+ sql.append("order by uppername asc");
+ } else {
+ sql.append("order by lid asc");
+ }
+
+ // if the sort changed then requery for the data
+ if (sortChanged != sortByName) {
+ sortChanged = true;
+ }
+
+ if (stnDisplayMap == null) {
+ stnDisplayMap = new HashMap();
+ stnDisplayMapSet = false;
+ }
+
+ if ((stationData == null) || sortChanged) {
+ stationData = new LinkedHashMap();
+
+ List data;
+ try {
+ data = DirectDbQuery.executeQuery(sql.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+ for (Object[] rowData : data) {
+ if (rowData[2] == null) {
+ rowData[2] = "";
+ }
+ stationData.put((String) rowData[0], (String) rowData[2]);
+ if (!stnDisplayMapSet) {
+ stnDisplayMap.put((String) rowData[0],
+ (String) rowData[3]);
+ }
+ }
+ } catch (VizException e) {
+ e.printStackTrace();
+ }
+ }
+
+ return stationData;
+ }
+
+ /**
+ * Get the site's PE data for graphical display
+ *
+ * @param lid
+ * The lid to query for
+ * @return ArrayList of Object[] of data
+ * @throws VizException
+ */
+ public List getSitePEData(String lid) throws VizException {
+ return DirectDbQuery.executeQuery(
+ INGEST_FILTER_QUERY.replace(":lid", lid), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ }
+
+ /**
+ * Get the site's PE data for tabular display
+ *
+ * @param lid
+ * The lid to query for
+ * @return List of SiteInfo objects
+ * @throws VizException
+ */
+ public List getTabularPEData(String lid) throws VizException {
+ StringBuilder sql = new StringBuilder("select ");
+ sql.append("lid, pe, dur, ts, extremum from Ingestfilter ");
+ sql.append("where lid = '").append(lid).append("' and ingest = 'T' ");
+ sql.append("order by pe, dur, ts, extremum asc");
+
+ ArrayList results = (ArrayList) DirectDbQuery
+ .executeQuery(sql.toString(), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+
+ ArrayList returnData = new ArrayList();
+ for (int i = 0; i < results.size(); i++) {
+ Object[] oa = results.get(i);
+ SiteInfo si = new SiteInfo();
+ si.setLid((String) oa[0]);
+ si.setPe((String) oa[1]);
+ si.setDur((Integer) oa[2]);
+ si.setTs((String) oa[3]);
+ si.setExt((String) oa[4]);
+ returnData.add(si);
+ }
+
+ return returnData;
+ }
+
+ /**
+ * Checks the record count in the Location and Stnclass tables.
+ *
+ * @return true if same count, otherwise false
+ * @throws VizException
+ */
+ public boolean checkLidCount() throws VizException {
+ /* Set up a location query */
+ String locationTable = "locview";
+ String stnClassTable = "stnclass";
+
+ StringBuilder errMessage = null;
+ errMessage = new StringBuilder(
+ "Error querying the Location table, no data returned");
+
+ /* Execute the location query */
+ long locationCount = recordCount(locationTable, "");
+ if (locationCount <= 0) {
+ throw new VizException(errMessage.toString());
+ }
+ errMessage.setLength(0);
+
+ errMessage.setLength(0);
+ errMessage
+ .append("Error querying the Stnclass table, no data returned");
+
+ /* Execute the Stnclass query */
+ long stnClassCount = recordCount(stnClassTable, "");
+
+ if (stnClassCount <= 0) {
+ throw new VizException(errMessage.toString());
+ }
+
+ if (stnClassCount == locationCount) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the shef pe data from IHFS.
+ *
+ * @param pe
+ * The PE value
+ * @return The units of the data
+ * @throws VizException
+ */
+ public String getShefPE(String pe) throws VizException {
+
+ List data = DirectDbQuery.executeQuery(
+ SHEF_PE_QUERY.replace(":pe", pe), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ if ((data != null) && (data.size() > 0)) {
+ Object[] sa = data.get(0);
+ return (String) sa[0];
+
+ }
+ return SHEF_PE_GENERIC_UNITS;
+ }
+
+ /**
+ * Query the table.
+ *
+ * @param tablename
+ * The table to query
+ * @param lid
+ * The location id
+ * @param pe
+ * The physical element
+ * @param ts
+ * The type source
+ * @param startTime
+ * The start time
+ * @param endTime
+ * The end time
+ * @return The List of Object[] data
+ * @throws VizException
+ * @throws ClassNotFoundException
+ */
+ public ArrayList getGraphData(String tablename, String lid,
+ String pe, String ts, String dur, String extremum, Date startTime,
+ Date endTime) throws VizException, ClassNotFoundException {
+
+ StringBuilder graphQuery = new StringBuilder(
+ "select lid,obstime,value,product_id from ");
+ graphQuery.append(tablename + " where lid = '" + lid + "' and pe = '"
+ + pe + "' " + "and dur = '" + dur + "' ");
+ graphQuery.append("and ts = '" + ts + "' and extremum = '"
+ + extremum.toUpperCase() + "' and obstime ");
+ graphQuery.append("between '"
+ + HydroConstants.DATE_FORMAT.format(startTime) + "' ");
+ graphQuery.append("and '" + HydroConstants.DATE_FORMAT.format(endTime)
+ + "' ");
+ graphQuery.append("order by obstime asc");
+
+ return (ArrayList) DirectDbQuery.executeQuery(
+ graphQuery.toString(), HydroConstants.IHFS, QueryLanguage.SQL);
+ }
+
+ /**
+ * Query the Riverstat table for the flood/action stage/flow.
+ *
+ * @param lid
+ * The Location Id
+ * @return The list of flood stage values
+ * @throws VizException
+ */
+ public List getFloodStage(String lid) throws VizException {
+ /* Query the floodCat table for the flood stage data */
+ String floodQuerySql = "select lid,fs,fq,wstg,action_Flow from riverstat where lid = '"
+ + lid + "'";
+ return DirectDbQuery.executeQuery(floodQuerySql, HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ }
+
+ /**
+ * Query the floodcat table for the flood stage.
+ *
+ * @param lid
+ * The Location Id
+ * @return The flood stage value as a String
+ */
+ public List getFloodCategories(String lid) throws VizException {
+ String floodQuerySql = "select " + HydroConstants.LID + ","
+ + HydroConstants.MINOR_STAGE + ","
+ + HydroConstants.MODERATE_STAGE + ","
+ + HydroConstants.MAJOR_STAGE + "," + HydroConstants.MINOR_FLOW
+ + "," + HydroConstants.MODERATE_FLOW + ","
+ + HydroConstants.MAJOR_FLOW + " from floodcat where lid = '"
+ + lid + "'";
+ return DirectDbQuery.executeQuery(floodQuerySql, HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ }
+
+ /**
+ * Get the Station name and river name.
+ *
+ * @param lid
+ * Location Id of the station
+ * @return List of Object[] containing the data
+ * @throws VizException
+ */
+ public String[] getStnRiverName(String lid) throws VizException {
+ StringBuilder sql = new StringBuilder("select ");
+ sql.append("name ");
+ sql.append("from location ");
+ sql.append(" where lid = '" + lid + "'");
+
+ ArrayList result1 = (ArrayList) DirectDbQuery
+ .executeQuery(sql.toString(), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+
+ sql.setLength(0);
+ sql.append("select stream from riverstat where lid = '" + lid + "'");
+
+ ArrayList result2 = (ArrayList) DirectDbQuery
+ .executeQuery(sql.toString(), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+
+ ArrayList sa = new ArrayList();
+
+ if ((result1 != null) && (result1.size() > 0)) {
+ sa.add((String) result1.get(0)[0]);
+ } else {
+ sa.add(HydroConstants.UNDEFINED);
+ }
+
+ if ((result2 != null) && (result2.size() > 0)) {
+ sa.add((String) result2.get(0)[0]);
+ } else {
+ sa.add(HydroConstants.UNDEFINED);
+ }
+
+ return sa.toArray(new String[sa.size()]);
+ }
+
+ /**
+ * Gets a unique list of basis times.
+ *
+ * @param table
+ * The table to query
+ * @param lid
+ * The lid to query on
+ * @param pe
+ * The pe to query on
+ * @param dur
+ * The duration to query on
+ * @param ts
+ * The type source to query on
+ * @param ext
+ * The extremum to query on
+ * @param begin
+ * The beginning time
+ * @param end
+ * The ending time
+ * @return List of Object arrays
+ * @throws VizException
+ * @throws ClassNotFoundException
+ */
+ public List getUniqueList(String table, String lid, String pe,
+ int dur, String ts, String ext, Date begin, Date end)
+ throws VizException, ClassNotFoundException {
+ StringBuilder sql = new StringBuilder("select ");
+ sql.append("distinct(basistime) from " + table + " ");
+ sql.append("where lid = '" + lid + "' and ts = '" + ts + "' and ");
+ sql.append("dur = '" + dur + "' and extremum = '" + ext + "' and ");
+ sql.append("validtime > '" + dateFormat.format(begin) + "' and ");
+ sql.append("validtime < '" + dateFormat.format(end) + "' ");
+ sql.append("order by basistime desc");
+
+ return DirectDbQuery.executeQuery(sql.toString(), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ }
+
+ /**
+ * Query for the data records
+ *
+ * @param tablename
+ * The table to query
+ * @param lid
+ * The lid to query on
+ * @param pe
+ * The pe to query on
+ * @param ts
+ * The type source to query on
+ * @param dur
+ * The duration to query on
+ * @param ext
+ * The extremum to query on
+ * @param startTime
+ * The start time of the data
+ * @param endTime
+ * The end time of the data
+ * @param basisTime
+ * The forecast basis time, null if not forecast data
+ * @param forecastData
+ * true if forecast data
+ * @return ArrayList of TabularData
+ * @throws VizException
+ * @throws ClassNotFoundException
+ */
+ public ArrayList getTabularData(String tablename, String lid,
+ String pe, String ts, String dur, String ext, Date startTime,
+ Date endTime, String basisTime, boolean forecastData)
+ throws VizException, ClassNotFoundException {
+ StringBuilder sql = new StringBuilder("select ");
+
+ if (forecastData) {
+ sql.append("lid, validtime, value, revision, shef_qual_code, ");
+ sql.append("quality_code, product_id, producttime, postingtime, ");
+ sql.append("basistime, probability ");
+ sql.append("from ").append(tablename);
+ sql.append(" where lid = '").append(lid).append("'");
+ sql.append(" and pe = '").append(pe).append("'");
+ sql.append(" and ts = '").append(ts).append("'");
+ sql.append(" and dur = ").append(dur);
+ sql.append(" and extremum = '").append(ext).append("'");
+ sql.append(" and validtime > '")
+ .append(dateFormat.format(startTime)).append("'");
+ sql.append(" and validtime < '").append(dateFormat.format(endTime))
+ .append("'");
+ sql.append(" and basistime = '").append(basisTime).append("'");
+ sql.append(" order by validtime desc");
+ } else {
+ sql.append("lid, obstime, value, revision, shef_qual_code, ");
+ sql.append("quality_code, product_id, producttime, postingtime ");
+ sql.append("from ").append(tablename);
+ sql.append(" where lid = '").append(lid).append("'");
+ sql.append(" and pe = '").append(pe).append("'");
+ sql.append(" and ts = '").append(ts).append("'");
+ sql.append(" and dur = ").append(dur);
+ sql.append(" and extremum = '").append(ext).append("'");
+ sql.append(" and obstime > '").append(dateFormat.format(startTime))
+ .append("'");
+ sql.append(" and obstime < '").append(dateFormat.format(endTime))
+ .append("'");
+ sql.append(" order by obstime desc");
+ }
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sql.toString());
+ }
+
+ ArrayList tabularData = new ArrayList();
+ ArrayList results = (ArrayList) DirectDbQuery
+ .executeQuery(sql.toString(), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+
+ for (int i = 0; i < results.size(); i++) {
+ Object[] oa = results.get(i);
+ TabularData td = new TabularData();
+ td.setLid((String) oa[0]);
+ td.setObsTime((Date) oa[1]);
+ td.setValue((Double) oa[2]);
+ td.setRevision((Integer) oa[3]);
+ td.setShefQualCode((String) oa[4]);
+ td.setQualityCode((Integer) oa[5]);
+ td.setProductId((String) oa[6]);
+ td.setProductTime((Date) oa[7]);
+ td.setPostingTime((Date) oa[8]);
+ if (forecastData) {
+ td.setValidTime((Date) oa[9]);
+ td.setProbability((Float) oa[10]);
+ }
+ tabularData.add(td);
+ }
+
+ return tabularData;
+ }
+
+ /**
+ * Get the record count of the table.
+ *
+ * @param table
+ * The table to query
+ * @param where
+ * The where statement
+ * @return Number of rows in the table, or -1 if error
+ * @throws VizException
+ */
+ public long recordCount(String table, String where) throws VizException {
+ if ((table == null) || table.equals("")) {
+ return -1;
+ }
+
+ String sql = "select count(*) from " + table + where;
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sql);
+ }
+
+ List results = DirectDbQuery.executeQuery(sql.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+
+ if ((results == null) || (results.get(0) == null)) {
+ return -1;
+ }
+
+ return (Long) results.get(0)[0];
+ }
+
+ /**
+ * Delete the record.
+ *
+ * @param tablename
+ * The tablename to query
+ * @param where
+ * The where statement
+ * @throws VizException
+ */
+ public void deleteRecord(String tablename, String where)
+ throws VizException {
+ String sql = "delete from " + tablename + " " + where;
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sql);
+ }
+ DirectDbQuery.executeStatement(sql, HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ }
+
+ /**
+ * Delete a list of items.
+ *
+ * @param queryList
+ * list of queries
+ * @throws VizException
+ */
+ public void deleteRecords(ArrayList queryList) throws VizException {
+ StringBuilder sb = new StringBuilder();
+ for (String query : queryList) {
+ sb.append(query);
+ }
+
+ DirectDbQuery.executeStatement(sb.toString(), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ }
+
+ /**
+ * Add a data record.
+ *
+ * @param tablename
+ * The tablename to query
+ * @param dr
+ * The data record to add
+ * @return int
+ * @throws VizException
+ */
+ public int addDataRecord(String tablename, DataRecord dr)
+ throws VizException {
+ StringBuilder sb = new StringBuilder();
+ Date now = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
+ if (tablename.startsWith("Fcst") || tablename.startsWith("fcst")
+ || tablename.startsWith("Contingency")) {
+ sb.append("insert into " + tablename
+ + "(lid, pe, dur, ts, extremum, ");
+ sb.append("probability, validtime, basistime, value, quality_code, ");
+ sb.append("shef_qual_code, revision, product_id, producttime, postingtime) ");
+ sb.append("values ('" + dr.getLid() + "', '"
+ + dr.getPe().toUpperCase() + "', ");
+ sb.append(dr.getDur() + ", '" + dr.getTs().toUpperCase() + "', '");
+ sb.append(dr.getExt().toUpperCase() + "', -1, ");
+ Date d;
+ if (dr.getObsTime() instanceof Timestamp) {
+ d = timestampToDate((Timestamp) dr.getObsTime());
+ sb.append("'" + dateFormat.format(d) + "', '");
+ } else {
+ sb.append("'" + dateFormat.format(dr.getObsTime()) + "', '");
+ }
+ sb.append(dr.getBasisTime() + "', " + dr.getValue() + ", ");
+ sb.append(dr.getQualityCode() + ", '" + dr.getShefQualCode()
+ + "', ");
+ sb.append(dr.getRevision() + ", '" + dr.getProductId() + "', ");
+ if (dr.getObsTime() instanceof Timestamp) {
+ d = timestampToDate((Timestamp) dr.getProductTime());
+ sb.append("'" + dateFormat.format(d) + "', '");
+ } else {
+ sb.append("'" + dateFormat.format(dr.getProductTime()) + "', '");
+ }
+ sb.append(dateFormat.format(now) + "')");
+
+ } else {
+ sb.append("insert into " + tablename
+ + "(lid, pe, dur, ts, extremum, ");
+ sb.append("obstime, postingtime, value, quality_code, shef_qual_code, productTime, ");
+ sb.append("revision, product_Id) ");
+ sb.append("values ('" + dr.getLid() + "', '"
+ + dr.getPe().toUpperCase() + "', ");
+ sb.append(dr.getDur() + ", '" + dr.getTs().toUpperCase() + "', '");
+ sb.append(dr.getExt().toUpperCase() + "', ");
+ Date d;
+ if (dr.getObsTime() instanceof Timestamp) {
+ d = timestampToDate((Timestamp) dr.getObsTime());
+ sb.append("'" + dateFormat.format(d) + "', '");
+ } else {
+ sb.append("'" + dateFormat.format(dr.getObsTime()) + "', '");
+ }
+
+ sb.append(dateFormat.format(now) + "', ");
+
+ sb.append(dr.getValue() + ", ");
+ sb.append(dr.getQualityCode() + ", '");
+ sb.append(dr.getShefQualCode() + "', '");
+ sb.append(dr.getProductTime() + "', ");
+ sb.append("0, '" + dr.getProductId() + "')");
+ }
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sb.toString());
+ }
+
+ return DirectDbQuery.executeStatement(sb.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+ }
+
+ /**
+ * Update sql.
+ *
+ * @param sql
+ * The sql string
+ * @return int
+ * @throws VizException
+ */
+ public int update(String sql) throws VizException {
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sql);
+ }
+
+ return DirectDbQuery.executeStatement(sql, HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ }
+
+ /**
+ * Insert rejected data record.
+ *
+ * @param dr
+ * The data record
+ * @return int
+ * @throws VizException
+ */
+ public int insertRejectedData(DataRecord dr) throws VizException {
+ Rejecteddata rd = new Rejecteddata();
+ RejecteddataId rdid = new RejecteddataId();
+ Date d = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
+
+ /* set basistime to obstime for observed data */
+ if (dr.getBasisTime() != null) {
+ try {
+ rdid.setBasistime(HydroConstants.DATE_FORMAT.parse(dr
+ .getBasisTime()));
+ } catch (ParseException e) {
+ rdid.setBasistime(dr.getObsTime());
+ }
+ } else {
+ rdid.setBasistime(dr.getObsTime());
+ }
+
+ rdid.setDur((short) dr.getDur());
+ rdid.setExtremum(dr.getExt());
+ rdid.setLid(dr.getLid());
+ rdid.setPe(dr.getPe());
+
+ /* set postingtime to current time */
+ rdid.setPostingtime(d);
+
+ rdid.setProbability(-1);
+ rdid.setTs(dr.getTs());
+ rdid.setValidtime(dr.getValidTime());
+ rd.setId(rdid);
+
+ rd.setProductId(dr.getProductId());
+ rd.setProducttime(dr.getProductTime());
+ rd.setQualityCode((int) dr.getQualityCode());
+
+ /* set reject_type to M for Manual */
+ rd.setRejectType("M");
+
+ rd.setRevision((short) dr.getRevision());
+ rd.setShefQualCode(dr.getShefQualCode());
+ rd.setUserid(LocalizationManager.getInstance().getCurrentUser());
+ rd.setValue(dr.getValue());
+
+ /* set validtime for observed data */
+ if (rdid.getValidtime() == null) {
+ rdid.setValidtime(dr.getObsTime());
+ }
+
+ return DirectDbQuery.saveOrUpdate(rd, HydroConstants.IHFS);
+ }
+
+ /**
+ * Insert a list of items into the rejected table
+ *
+ * @param recordList
+ * List of DataRecord objects
+ * @return
+ * @throws VizException
+ */
+ public int insertRejectedData(ArrayList recordList)
+ throws VizException {
+ StringBuilder sb = new StringBuilder();
+
+ Date d = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
+ for (DataRecord dr : recordList) {
+ sb.append("insert into rejecteddata(lid, pe, dur, ts, extremum, ");
+ sb.append("probability, validtime, basistime, postingtime, value, ");
+ sb.append("revision, shef_qual_code, product_id, producttime, quality_code, ");
+ sb.append("reject_type, userid) VALUES(");
+
+ sb.append("'" + dr.getLid() + "', ");
+ sb.append("'" + dr.getPe() + "', ");
+ sb.append(dr.getDur() + ", ");
+ sb.append("'" + dr.getTs() + "', ");
+ sb.append("'" + dr.getExt() + "', ");
+ sb.append(-1 + ", ");
+
+ /* set validtime for observed data */
+ if (dr.getValidTime() != null) {
+ sb.append("'"
+ + HydroConstants.DATE_FORMAT.format(dr.getValidTime())
+ + "', ");
+ } else {
+ sb.append("'"
+ + (HydroConstants.DATE_FORMAT.format(dr.getObsTime()))
+ + "', ");
+ }
+
+ if (dr.getBasisTime() != null) {
+ try {
+ sb.append("'"
+ + (HydroConstants.DATE_FORMAT.parse(dr
+ .getBasisTime())) + "', ");
+ } catch (ParseException e) {
+ sb.append("'"
+ + (HydroConstants.DATE_FORMAT.format(dr
+ .getObsTime())) + "', ");
+ }
+ } else {
+ sb.append("'"
+ + (HydroConstants.DATE_FORMAT.format(dr.getObsTime()))
+ + "', ");
+ }
+
+ sb.append("'" + HydroConstants.DATE_FORMAT.format(d) + "', ");
+ sb.append(dr.getValue() + ", ");
+ sb.append(dr.getRevision() + ", ");
+ sb.append("'" + dr.getShefQualCode() + "', ");
+ sb.append("'" + dr.getProductId() + "', ");
+ sb.append("'"
+ + HydroConstants.DATE_FORMAT.format(dr.getProductTime())
+ + "', ");
+ sb.append(dr.getQualityCode() + ", ");
+ sb.append("'M', ");
+ sb.append("'" + LocalizationManager.getInstance().getCurrentUser()
+ + "');");
+ }
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sb.toString());
+ }
+
+ return DirectDbQuery.executeStatement(sb.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+ }
+
+ private Object getDataFromDB(ForecastData dr, String field) {
+ StringBuilder sql = new StringBuilder("select " + field + " from ");
+ String tablename = DbUtils.getTableName(dr.getPe(), dr.getTs());
+ sql.append(tablename + " where ");
+ sql.append("lid = '" + dr.getLid() + "' ");
+ sql.append("and pe = '" + dr.getPe().toUpperCase() + "' ");
+ sql.append("and dur =" + dr.getDur() + " ");
+ sql.append("and ts = '" + dr.getTs().toUpperCase() + "' ");
+ sql.append("and extremum = '" + dr.getExtremum().toUpperCase() + "' ");
+ if (dr.getTs().toUpperCase().startsWith("F")
+ || dr.getTs().toUpperCase().startsWith("C")) {
+ sql.append("and validtime = '" + dr.getValidTime() + "' ");
+ sql.append("and basistime = '" + dr.getBasisTime() + "';");
+ } else {// obs data
+ sql.append("and obstime = '" + dr.getObsTime() + "';");
+ }
+ List sqlResult;
+ try {
+ sqlResult = (DirectDbQuery.executeQuery(sql.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL));
+ if (sqlResult != null && sqlResult.size() > 0
+ && sqlResult.get(0)[0] != null) {
return sqlResult.get(0)[0];
}
- } catch (VizException e) {
- e.printStackTrace();
- return null;
- }
-
- return null;
- }
-
- public int insertRejectedData(List deleteList) throws VizException {
- StringBuilder sb = new StringBuilder();
-
- Date currentTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
- for (ForecastData dr : deleteList) {
-
- int probability=-1;
- int revision=0;
- if (dr.getTs().toUpperCase().startsWith("F") || dr.getTs().toUpperCase().startsWith("C")) {
- probability=0;
- revision=1;
- }
-
- Date productTime=dr.getProductTime();
- if (productTime==null) {
- productTime=(Date)getDataFromDB(dr,"producttime");
- }
-
- String productID=(String)getDataFromDB(dr,"product_id");
- if (productID==null) {
- productID=dr.getProductID();
- }
-
- Integer qualityCode=(Integer)getDataFromDB(dr,"quality_code");
- if (qualityCode==null) {
- qualityCode=new Integer(dr.getQualityCode());
- }
-
- sb.append("insert into rejecteddata(lid, pe, dur, ts, extremum, ");
- sb.append("probability, validtime, basistime, postingtime, value, ");
- sb.append("revision, shef_qual_code, product_id, producttime, quality_code, ");
- sb.append("reject_type, userid) VALUES(");
-
- sb.append("'" + dr.getLid() + "', ");
- sb.append("'" + dr.getPe().toUpperCase() + "', ");
- sb.append(dr.getDur() + ", ");
- sb.append("'" + dr.getTs().toUpperCase() + "', ");
- sb.append("'" + dr.getExtremum().toUpperCase() + "', ");
- sb.append(probability + ", ");
-
- /* set validtime for observed data */
- if (dr.getValidTime() != null) {
- sb.append("'"
- + HydroConstants.DATE_FORMAT.format(dr.getValidTime())
- + "', ");
- } else {
- sb.append("'"
- + (HydroConstants.DATE_FORMAT.format(dr.getObsTime()))
- + "', ");
- }
-
- if (dr.getBasisTime() != null) {
- sb.append("'"
- + (dr.getBasisTime()) + "', ");
- } else {
- sb.append("'"
- + (HydroConstants.DATE_FORMAT.format(dr.getObsTime()))
- + "', ");
- }
-
- sb.append("'" + HydroConstants.DATE_FORMAT.format(currentTime) + "', ");
- sb.append(dr.getValue() + ", ");
- sb.append(revision + ", ");
- sb.append("'M', ");//shef_qual_code always M
- sb.append("'" + productID + "', ");
- sb.append("'"
- + HydroConstants.DATE_FORMAT.format(productTime)
- + "', ");
- sb.append(qualityCode + ", ");
- sb.append("'M', ");
- sb.append("'" + LocalizationManager.getInstance().getCurrentUser()
- + "');");
- }
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sb.toString());
- }
-
- return DirectDbQuery.executeStatement(sb.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
-
- }
-
- /**
- * Deletes a list of Observations.
- *
- * @param deleteList
- * List of Observations to delete.
- * @return The number of rows modified
- * @throws VizException
- */
- public int delete(List deleteList) throws VizException {
- int status = -1;
-
- for (int i = 0; i < deleteList.size(); i++) {
- ForecastData data = deleteList.get(i);
- String tablename = DbUtils.getTableName(data.getPe(), data.getTs());
-
- StringBuilder sql = new StringBuilder("delete from ");
- sql.append(tablename + " where ");
- sql.append("lid = '" + data.getLid() + "' ");
- sql.append("and pe = '"+data.getPe().toUpperCase()+"' ");
- sql.append("and dur = " + data.getDur() + " ");
- sql.append("and ts = '"+data.getTs().toUpperCase()+"' ");
- sql.append("and extremum = '" + data.getExtremum().toUpperCase()
- + "' ");
-
- if (data.getValidTime() != null) {
- sql.append("and validtime = '"
- + dbFormat.format(data.getValidTime()) + "'");
- } else {
- sql.append("and obstime = '"
- + dbFormat.format(data.getObsTime()) + "'");
- }
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sql);
- }
-
- status = DirectDbQuery.executeStatement(sql.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
- }
-
- return status;
- }
-
- /**
- * Inserts a list of Observations.
- *
- * @param insertList
- * List of Observations to insert.
- * @return The number of rows modified
- * @throws VizException
- */
- public int insert(List insertList) throws VizException {
- int status = -1;
- Date now = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
-
- for (int i = 0; i < insertList.size(); i++) {
- ForecastData data = insertList.get(i);
- String tablename = DbUtils.getTableName(data.getPe(), data.getTs());
-
- SqlBuilder sql = new SqlBuilder(tablename);
- sql.setSqlType(SqlBuilder.INSERT);
- sql.addString("lid", data.getLid());
- sql.addString("pe", data.getPe().toUpperCase());
- sql.addInt("dur", data.getDur());
- sql.addString("ts", data.getTs().toUpperCase());
- sql.addString("extremum", data.getExtremum().toUpperCase());
- sql.addString("product_id", data.getProductID().toUpperCase());
-
- if (data.getValidTime() != null) {
- sql.addString("validTime",
- dateFormat.format(data.getValidTime()));
- sql.addInt("probability", -1);
- sql.addString("basisTime",
- dateFormat.format(data.getBasisTime()));
- if (data.getProductTime() == null) {
- sql.addString(
- "producttime",
- dateFormat.format(Calendar.getInstance(
- TimeZone.getTimeZone("GMT")).getTime()));
- } else {
- sql.addString("producttime",
- dateFormat.format(data.getProductTime()));
- }
- } else {
- sql.addString("obstime", dateFormat.format(data.getObsTime()));
- sql.addString("producttime",
- dateFormat.format(data.getObsTime()));
- }
-
- sql.addDouble("value", data.getValue());
- sql.addString("shef_qual_code", "M");
- sql.addInt("quality_code", TimeSeriesUtil.DEFAULT_QC_VALUE);
- sql.addInt("revision", 0);
- sql.addString("postingtime", dateFormat.format(now));
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sql.toString());
- }
-
- status = DirectDbQuery.executeStatement(sql.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
- }
-
- return status;
- }
-
- /**
- * Edits a list of Observations.
- *
- * @param editList
- * List of Observations to edit.
- * @return The number of rows modified
- * @throws VizException
- */
- public int edit(List editList) throws VizException {
- int status = -1;
- Date now = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
-
- for (int i = 0; i < editList.size(); i++) {
- ForecastData data = editList.get(i);
- String tablename = DbUtils.getTableName(data.getPe(), data.getTs());
-
- SqlBuilder sql = new SqlBuilder(tablename);
- sql.setSqlType(SqlBuilder.UPDATE);
- sql.addDouble("value", data.getValue());
- sql.addString("postingTime", HydroConstants.DATE_FORMAT.format(now));
- if (data.getProductTime() == null) {
- sql.addString("producttime",
- HydroConstants.DATE_FORMAT.format(Calendar.getInstance(
- TimeZone.getTimeZone("GMT")).getTime()));
- }
-
- StringBuilder where = new StringBuilder();
- where.append(" where lid = '" + data.getLid().toUpperCase() + "' ");
- where.append("and dur = " + data.getDur() + " ");
- where.append("and ts = '" + data.getTs().toUpperCase() + "' ");
- where.append("and extremum = '" + data.getExtremum().toUpperCase()
- + "' ");
- if (data.getValidTime() != null) {
- where.append("and validtime = '"
- + dateFormat.format(data.getValidTime()) + "'");
- where.append(" and basistime = '"
- + dateFormat.format(data.getBasisTime()) + "'");
- } else {
- where.append("and obstime = '"
- + dateFormat.format(data.getObsTime()) + "'");
- }
-
- sql.setWhereClause(where.toString());
-
- if (data.getValue() == HydroConstants.MISSING_VALUE) {
- DataRecord dr = new DataRecord();
- Date productTime=data.getProductTime();
- if (productTime==null) {
- productTime= now;
- }
-
- dr.setDur(data.getDur());
- dr.setExt(data.getExtremum().toUpperCase());
- dr.setLid(data.getLid());
- dr.setObsTime(data.getObsTime());
- dr.setPe(data.getPe().toUpperCase());
- dr.setPostingTime(now);
- dr.setQualityCode(TimeSeriesUtil.DEFAULT_QC_VALUE);
- dr.setRevision(data.getRevision());
- dr.setShefQualCode("M");
- dr.setTs(data.getTs().toUpperCase());
- dr.setValue(data.getPreviousValue());
- dr.setProductTime(productTime);
- dr.setProductId(data.getProductID());
- if (data.getValidTime() != null) {
- dr.setValidTime(data.getValidTime());
- dr.setBasisTime(dateFormat.format(data.getBasisTime()));
- } else {
- dr.setValidTime(data.getObsTime());
- }
-
- insertRejectedData(dr);
- }
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sql);
- }
-
- DirectDbQuery.executeStatement(sql.toString(), HydroConstants.IHFS,
- QueryLanguage.SQL);
- }
-
- return status;
- }
-
- /**
- * Get the product's productId and productTime.
- *
- * @param where
- * The where statement
- * @param table
- * The table to get the data from
- * @return List of String[] productId, productTime
- * @throws VizException
- */
- public String[] getProductIdTime(final String where, final String table)
- throws VizException {
-
- StringBuilder sql = new StringBuilder();
- sql.append("select product_id, productTime from " + table);
- sql.append(where);
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + sql);
- }
-
- List rs = DirectDbQuery.executeQuery(sql.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
-
- String[] sa = null;
- if ((rs != null) && (rs.size() > 0)) {
- Object[] item = rs.get(0);
- sa = new String[2];
- sa[0] = (String) item[0];
- sa[1] = dateFormat.format((Date) item[1]);
- }
-
- return sa;
- }
-
- /**
- * Get the list of forecast data.
- *
- * @param where
- * The where statement
- * @param table
- * The table to get the data from
- * @return List of String[] productId, productTime
- * @throws VizException
- */
- public ArrayList getForecast(final String where,
- final String table) throws VizException {
- ArrayList returnList = new ArrayList();
-
- StringBuilder query = new StringBuilder("select ");
- query.append("lid, pe, dur, ts, extremum, probability, validtime, ");
- query.append("basistime, value, shef_qual_code, quality_code, ");
- query.append("revision, product_id, producttime, postingtime ");
- query.append("from " + table + " " + where);
-
- AppsDefaults ad = AppsDefaults.getInstance();
- boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
- false);
-
- if (debug) {
- System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
- + ad.getToken(HydroConstants.PGPORT) + ":"
- + ad.getToken(HydroConstants.DB_NAME));
- System.out.println("Query: " + query.toString());
- }
-
- List results = DirectDbQuery.executeQuery(query.toString(),
- HydroConstants.IHFS, QueryLanguage.SQL);
-
- if ((results == null) || (results.size() == 0)) {
- return returnList;
- }
- returnList.ensureCapacity(results.size());
- int i = 0;
- for (Object[] item : results) {
- i = 0;
- Fcstheight fh = new Fcstheight();
- FcstheightId fhid = new FcstheightId();
- fhid.setLid((String) item[i++]);
- fhid.setPe((String) item[i++]);
- Integer in = (Integer) item[i++];
- fhid.setDur(in.shortValue());
- fhid.setTs((String) item[i++]);
- fhid.setExtremum((String) item[i++]);
- fhid.setProbability((Float) item[i++]);
- fhid.setValidtime((Date) item[i++]);
- fhid.setBasistime((Date) item[i++]);
- fh.setId(fhid);
- fh.setValue((Double) item[i++]);
- fh.setShefQualCode((String) item[i++]);
- fh.setQualityCode((Integer) item[i++]);
- in = (Integer) item[i++];
- fh.setRevision(in.shortValue());
- fh.setProductId((String) item[i++]);
- fh.setProducttime((Date) item[i++]);
- fh.setPostingtime((Date) item[i++]);
-
- returnList.add(fh);
- }
-
- return returnList;
- }
-
- /**
- * Insert/Update the forecast tables.
- *
- * @param dataObj
- * The persistent data object to insert/update
- * @return The number of objects inserted/updated
- * @throws VizException
- */
- public int putForecast(PersistableDataObject dataObj) throws VizException {
- int rv = 0;
-
- rv = DirectDbQuery.saveOrUpdate(dataObj, HydroConstants.IHFS);
-
- return rv;
- }
-
- /**
- * Get the Use Latest Forecast flag from riverstat table.
- *
- * @param lid
- * The location id
- * @return The use latestes forecast flag, or null if nothing in db
- */
- public String getUseLatestForecast(String lid) {
- String useLatest = null;
-
- String query = "select use_latest_fcst from riverstat where lid = '"
- + lid + "'";
-
- ArrayList rs = runQuery(query);
-
- if ((rs != null) && (rs.size() > 0)) {
- useLatest = (String) rs.get(0)[0];
- }
-
- return useLatest;
- }
-
- /**
- * Convert Timestamp object to java.util.Date object.
- *
- * @param timestamp
- * The Timestamp to convert
- * @return The Date object
- */
- public Date timestampToDate(Timestamp timestamp) {
- long milliseconds = timestamp.getTime();// + (timestamp.getNanos() /
- // 1000000);
- return new java.util.Date(milliseconds);
- }
-
- /**
- * Get the station display map.
- *
- * @return The map of station displays
- */
- public Map getStationDisplayMap() {
- return stnDisplayMap;
- }
+ } catch (VizException e) {
+ e.printStackTrace();
+ return null;
+ }
+
+ return null;
+ }
+
+ public int insertRejectedData(List deleteList)
+ throws VizException {
+ StringBuilder sb = new StringBuilder();
+
+ Date currentTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"))
+ .getTime();
+ for (ForecastData dr : deleteList) {
+
+ int probability = -1;
+ int revision = 0;
+ if (dr.getTs().toUpperCase().startsWith("F")
+ || dr.getTs().toUpperCase().startsWith("C")) {
+ probability = 0;
+ revision = 1;
+ }
+
+ Date productTime = dr.getProductTime();
+ if (productTime == null) {
+ productTime = (Date) getDataFromDB(dr, "producttime");
+ }
+
+ String productID = (String) getDataFromDB(dr, "product_id");
+ if (productID == null) {
+ productID = dr.getProductID();
+ }
+
+ Integer qualityCode = (Integer) getDataFromDB(dr, "quality_code");
+ if (qualityCode == null) {
+ qualityCode = new Integer(dr.getQualityCode());
+ }
+
+ sb.append("insert into rejecteddata(lid, pe, dur, ts, extremum, ");
+ sb.append("probability, validtime, basistime, postingtime, value, ");
+ sb.append("revision, shef_qual_code, product_id, producttime, quality_code, ");
+ sb.append("reject_type, userid) VALUES(");
+
+ sb.append("'" + dr.getLid() + "', ");
+ sb.append("'" + dr.getPe().toUpperCase() + "', ");
+ sb.append(dr.getDur() + ", ");
+ sb.append("'" + dr.getTs().toUpperCase() + "', ");
+ sb.append("'" + dr.getExtremum().toUpperCase() + "', ");
+ sb.append(probability + ", ");
+
+ /* set validtime for observed data */
+ if (dr.getValidTime() != null) {
+ sb.append("'"
+ + HydroConstants.DATE_FORMAT.format(dr.getValidTime())
+ + "', ");
+ } else {
+ sb.append("'"
+ + (HydroConstants.DATE_FORMAT.format(dr.getObsTime()))
+ + "', ");
+ }
+
+ if (dr.getBasisTime() != null) {
+ sb.append("'" + (dr.getBasisTime()) + "', ");
+ } else {
+ sb.append("'"
+ + (HydroConstants.DATE_FORMAT.format(dr.getObsTime()))
+ + "', ");
+ }
+
+ sb.append("'" + HydroConstants.DATE_FORMAT.format(currentTime)
+ + "', ");
+ sb.append(dr.getValue() + ", ");
+ sb.append(revision + ", ");
+ sb.append("'M', ");// shef_qual_code always M
+ sb.append("'" + productID + "', ");
+ sb.append("'" + HydroConstants.DATE_FORMAT.format(productTime)
+ + "', ");
+ sb.append(qualityCode + ", ");
+ sb.append("'M', ");
+ sb.append("'" + LocalizationManager.getInstance().getCurrentUser()
+ + "');");
+ }
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sb.toString());
+ }
+
+ return DirectDbQuery.executeStatement(sb.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+
+ }
+
+ /**
+ * Deletes a list of Observations.
+ *
+ * @param deleteList
+ * List of Observations to delete.
+ * @return The number of rows modified
+ * @throws VizException
+ */
+ public int delete(List deleteList) throws VizException {
+ int status = -1;
+
+ for (int i = 0; i < deleteList.size(); i++) {
+ ForecastData data = deleteList.get(i);
+ String tablename = DbUtils.getTableName(data.getPe(), data.getTs());
+
+ StringBuilder sql = new StringBuilder("delete from ");
+ sql.append(tablename + " where ");
+ sql.append("lid = '" + data.getLid() + "' ");
+ sql.append("and pe = '" + data.getPe().toUpperCase() + "' ");
+ sql.append("and dur = " + data.getDur() + " ");
+ sql.append("and ts = '" + data.getTs().toUpperCase() + "' ");
+ sql.append("and extremum = '" + data.getExtremum().toUpperCase()
+ + "' ");
+
+ if (data.getValidTime() != null) {
+ sql.append("and validtime = '"
+ + dbFormat.format(data.getValidTime()) + "'");
+ } else {
+ sql.append("and obstime = '"
+ + dbFormat.format(data.getObsTime()) + "'");
+ }
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sql);
+ }
+
+ status = DirectDbQuery.executeStatement(sql.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+ }
+
+ return status;
+ }
+
+ /**
+ * Inserts a list of Observations.
+ *
+ * @param insertList
+ * List of Observations to insert.
+ * @return The number of rows modified
+ * @throws VizException
+ */
+ public int insert(List insertList) throws VizException {
+ int status = -1;
+ Date now = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
+
+ for (int i = 0; i < insertList.size(); i++) {
+ ForecastData data = insertList.get(i);
+ String tablename = DbUtils.getTableName(data.getPe(), data.getTs());
+
+ SqlBuilder sql = new SqlBuilder(tablename);
+ sql.setSqlType(SqlBuilder.INSERT);
+ sql.addString("lid", data.getLid());
+ sql.addString("pe", data.getPe().toUpperCase());
+ sql.addInt("dur", data.getDur());
+ sql.addString("ts", data.getTs().toUpperCase());
+ sql.addString("extremum", data.getExtremum().toUpperCase());
+ sql.addString("product_id", data.getProductID().toUpperCase());
+
+ if (data.getValidTime() != null) {
+ sql.addString("validTime",
+ dateFormat.format(data.getValidTime()));
+ sql.addInt("probability", -1);
+ sql.addString("basisTime",
+ dateFormat.format(data.getBasisTime()));
+ if (data.getProductTime() == null) {
+ sql.addString(
+ "producttime",
+ dateFormat.format(Calendar.getInstance(
+ TimeZone.getTimeZone("GMT")).getTime()));
+ } else {
+ sql.addString("producttime",
+ dateFormat.format(data.getProductTime()));
+ }
+ } else {
+ sql.addString("obstime", dateFormat.format(data.getObsTime()));
+ sql.addString("producttime",
+ dateFormat.format(data.getObsTime()));
+ }
+
+ sql.addDouble("value", data.getValue());
+ sql.addString("shef_qual_code", "M");
+ sql.addInt("quality_code", TimeSeriesUtil.DEFAULT_QC_VALUE);
+ sql.addInt("revision", 0);
+ sql.addString("postingtime", dateFormat.format(now));
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sql.toString());
+ }
+
+ status = DirectDbQuery.executeStatement(sql.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+ }
+
+ return status;
+ }
+
+ /**
+ * Edits a list of Observations.
+ *
+ * @param editList
+ * List of Observations to edit.
+ * @return The number of rows modified
+ * @throws VizException
+ */
+ public int edit(List editList) throws VizException {
+ int status = -1;
+ Date now = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
+
+ for (int i = 0; i < editList.size(); i++) {
+ ForecastData data = editList.get(i);
+ String tablename = DbUtils.getTableName(data.getPe(), data.getTs());
+
+ SqlBuilder sql = new SqlBuilder(tablename);
+ sql.setSqlType(SqlBuilder.UPDATE);
+ sql.addDouble("value", data.getValue());
+ sql.addString("postingTime", HydroConstants.DATE_FORMAT.format(now));
+ if (data.getProductTime() == null) {
+ sql.addString(
+ "producttime",
+ HydroConstants.DATE_FORMAT.format(Calendar.getInstance(
+ TimeZone.getTimeZone("GMT")).getTime()));
+ }
+
+ StringBuilder where = new StringBuilder();
+ where.append(" where lid = '" + data.getLid().toUpperCase() + "' ");
+ where.append("and dur = " + data.getDur() + " ");
+ where.append("and ts = '" + data.getTs().toUpperCase() + "' ");
+ where.append("and extremum = '" + data.getExtremum().toUpperCase()
+ + "' ");
+ if (data.getValidTime() != null) {
+ where.append("and validtime = '"
+ + dateFormat.format(data.getValidTime()) + "'");
+ where.append(" and basistime = '"
+ + dateFormat.format(data.getBasisTime()) + "'");
+ } else {
+ where.append("and obstime = '"
+ + dateFormat.format(data.getObsTime()) + "'");
+ }
+
+ sql.setWhereClause(where.toString());
+
+ if (data.getValue() == HydroConstants.MISSING_VALUE) {
+ DataRecord dr = new DataRecord();
+ Date productTime = data.getProductTime();
+ if (productTime == null) {
+ productTime = now;
+ }
+
+ dr.setDur(data.getDur());
+ dr.setExt(data.getExtremum().toUpperCase());
+ dr.setLid(data.getLid());
+ dr.setObsTime(data.getObsTime());
+ dr.setPe(data.getPe().toUpperCase());
+ dr.setPostingTime(now);
+ dr.setQualityCode(TimeSeriesUtil.DEFAULT_QC_VALUE);
+ dr.setRevision(data.getRevision());
+ dr.setShefQualCode("M");
+ dr.setTs(data.getTs().toUpperCase());
+ dr.setValue(data.getPreviousValue());
+ dr.setProductTime(productTime);
+ dr.setProductId(data.getProductID());
+ if (data.getValidTime() != null) {
+ dr.setValidTime(data.getValidTime());
+ dr.setBasisTime(dateFormat.format(data.getBasisTime()));
+ } else {
+ dr.setValidTime(data.getObsTime());
+ }
+
+ insertRejectedData(dr);
+ }
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sql);
+ }
+
+ DirectDbQuery.executeStatement(sql.toString(), HydroConstants.IHFS,
+ QueryLanguage.SQL);
+ }
+
+ return status;
+ }
+
+ /**
+ * Get the product's productId and productTime.
+ *
+ * @param where
+ * The where statement
+ * @param table
+ * The table to get the data from
+ * @return List of String[] productId, productTime
+ * @throws VizException
+ */
+ public String[] getProductIdTime(final String where, final String table)
+ throws VizException {
+
+ StringBuilder sql = new StringBuilder();
+ sql.append("select product_id, productTime from " + table);
+ sql.append(where);
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + sql);
+ }
+
+ List rs = DirectDbQuery.executeQuery(sql.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+
+ String[] sa = null;
+ if ((rs != null) && (rs.size() > 0)) {
+ Object[] item = rs.get(0);
+ sa = new String[2];
+ sa[0] = (String) item[0];
+ sa[1] = dateFormat.format((Date) item[1]);
+ }
+
+ return sa;
+ }
+
+ /**
+ * Get the list of forecast data.
+ *
+ * @param where
+ * The where statement
+ * @param table
+ * The table to get the data from
+ * @return List of String[] productId, productTime
+ * @throws VizException
+ */
+ public ArrayList getForecast(final String where,
+ final String table) throws VizException {
+ ArrayList returnList = new ArrayList();
+
+ StringBuilder query = new StringBuilder("select ");
+ query.append("lid, pe, dur, ts, extremum, probability, validtime, ");
+ query.append("basistime, value, shef_qual_code, quality_code, ");
+ query.append("revision, product_id, producttime, postingtime ");
+ query.append("from " + table + " " + where);
+
+ AppsDefaults ad = AppsDefaults.getInstance();
+ boolean debug = ad.getBoolean(HydroConstants.DEBUG_HYDRO_DB_TOKEN,
+ false);
+
+ if (debug) {
+ System.out.println(ad.getToken(HydroConstants.PGHOST) + ":"
+ + ad.getToken(HydroConstants.PGPORT) + ":"
+ + ad.getToken(HydroConstants.DB_NAME));
+ System.out.println("Query: " + query.toString());
+ }
+
+ List results = DirectDbQuery.executeQuery(query.toString(),
+ HydroConstants.IHFS, QueryLanguage.SQL);
+
+ if ((results == null) || (results.size() == 0)) {
+ return returnList;
+ }
+ returnList.ensureCapacity(results.size());
+ int i = 0;
+ for (Object[] item : results) {
+ i = 0;
+ Fcstheight fh = new Fcstheight();
+ FcstheightId fhid = new FcstheightId();
+ fhid.setLid((String) item[i++]);
+ fhid.setPe((String) item[i++]);
+ Integer in = (Integer) item[i++];
+ fhid.setDur(in.shortValue());
+ fhid.setTs((String) item[i++]);
+ fhid.setExtremum((String) item[i++]);
+ fhid.setProbability((Float) item[i++]);
+ fhid.setValidtime((Date) item[i++]);
+ fhid.setBasistime((Date) item[i++]);
+ fh.setId(fhid);
+ fh.setValue((Double) item[i++]);
+ fh.setShefQualCode((String) item[i++]);
+ fh.setQualityCode((Integer) item[i++]);
+ in = (Integer) item[i++];
+ fh.setRevision(in.shortValue());
+ fh.setProductId((String) item[i++]);
+ fh.setProducttime((Date) item[i++]);
+ fh.setPostingtime((Date) item[i++]);
+
+ returnList.add(fh);
+ }
+
+ return returnList;
+ }
+
+ /**
+ * Insert/Update the forecast tables.
+ *
+ * @param dataObj
+ * The persistent data object to insert/update
+ * @return The number of objects inserted/updated
+ * @throws VizException
+ */
+ public int putForecast(PersistableDataObject dataObj) throws VizException {
+ int rv = 0;
+
+ rv = DirectDbQuery.saveOrUpdate(dataObj, HydroConstants.IHFS);
+
+ return rv;
+ }
+
+ /**
+ * Get the Use Latest Forecast flag from riverstat table.
+ *
+ * @param lid
+ * The location id
+ * @return The use latestes forecast flag, or null if nothing in db
+ */
+ public String getUseLatestForecast(String lid) {
+ String useLatest = null;
+
+ String query = "select use_latest_fcst from riverstat where lid = '"
+ + lid + "'";
+
+ ArrayList rs = runQuery(query);
+
+ if ((rs != null) && (rs.size() > 0)) {
+ useLatest = (String) rs.get(0)[0];
+ }
+
+ return useLatest;
+ }
+
+ /**
+ * Convert Timestamp object to java.util.Date object.
+ *
+ * @param timestamp
+ * The Timestamp to convert
+ * @return The Date object
+ */
+ public Date timestampToDate(Timestamp timestamp) {
+ long milliseconds = timestamp.getTime();// + (timestamp.getNanos() /
+ // 1000000);
+ return new java.util.Date(milliseconds);
+ }
+
+ /**
+ * Get the station display map.
+ *
+ * @return The map of station displays
+ */
+ public Map getStationDisplayMap() {
+ return stnDisplayMap;
+ }
}