/**
   * Execute a query for the specified pems aggregate data.
   *
   * @return String query string, may be passed to psRSNext or pemsFromQueryRS
   */
  protected String runQueryAggregates(
      Interval interval, List<Long> vdsIds, PeMSAggregate.AggregationLevel level)
      throws DatabaseException {

    String query = "read_pems_aggregates";
    String yuckyuck = org.apache.commons.lang.StringUtils.join(vdsIds, ", ");

    dbr.psCreate(
        query,
        "SELECT * "
            + "FROM VIA."
            + level.table
            + " "
            + "WHERE "
            + "MEASURE_DT BETWEEN ? AND ? "
            + "AND "
            + "VDS_ID IN ("
            + yuckyuck
            + ") "
            + "ORDER BY MEASURE_DT");

    dbr.psClearParams(query);
    dbr.psSetTimestampMilliseconds(query, 1, interval.getStartMillis());
    dbr.psSetTimestampMilliseconds(query, 2, interval.getEndMillis());

    // this doesn't seem to work, hence the yuck hack above:
    // dbr.psSetArrayLong(query, 3, vdsIds.toArray(new Long[vdsIds.size()]));

    dbr.psQuery(query);

    return query;
  }
  /**
   * Execute a query for the specified pems data.
   *
   * @return String query string, may be passed to psRSNext or pemsFromQueryRS
   */
  protected String runQuerySet(Interval interval, List<Long> vdsIds) throws DatabaseException {
    String query = "read_pems_set";
    String yuckyuck = org.apache.commons.lang.StringUtils.join(vdsIds, ", ");

    dbr.psCreate(
        query,
        "SELECT "
            + "VDS_ID, "
            + "MEASURE_DT, "
            + "FLOW, "
            + "DENSITY, "
            + "DENSITY_ERR, "
            + "SPEED, "
            + "SPEED_ERROR, "
            + "FF_SPEED, "
            + "FUNC_LOOP_FACT, "
            + "G_FACTOR_LANE_0, "
            + "G_FACTOR_LANE_1, "
            + "G_FACTOR_LANE_2, "
            + "G_FACTOR_LANE_3, "
            + "G_FACTOR_LANE_4, "
            + "G_FACTOR_LANE_5, "
            + "G_FACTOR_LANE_6, "
            + "G_FACTOR_LANE_7, "
            + "G_FACTOR_LANE_8, "
            + "G_FACTOR_LANE_9 "
            + "FROM VIA.PEMS_30SEC_FILT "
            + "WHERE "
            + "MEASURE_DT BETWEEN ? AND ? "
            + "AND "
            + "VDS_ID IN ("
            + yuckyuck
            + ") "
            + "ORDER BY MEASURE_DT");

    dbr.psClearParams(query);
    dbr.psSetTimestampMilliseconds(query, 1, interval.getStartMillis());
    dbr.psSetTimestampMilliseconds(query, 2, interval.getEndMillis());

    // this doesn't seem to work, hence the yuck hack above:
    // dbr.psSetArrayLong(query, 3, vdsIds.toArray(new Long[vdsIds.size()]));

    dbr.psQuery(query);

    return query;
  }