From: <sc...@hy...> - 2008-03-12 04:37:31
|
Author: scottmf Date: 2008-03-11 21:37:27 -0700 (Tue, 11 Mar 2008) New Revision: 8186 URL: http://svn.hyperic.org/?view=rev&root=Hyperic+HQ&revision=8186 Modified: trunk/src/org/hyperic/hq/measurement/server/session/AvailabilityDataDAO.java trunk/src/org/hyperic/hq/measurement/server/session/AvailabilityManagerEJBImpl.java Log: fixed issues with groups for RLE and moved most DAO queries from composite objects Modified: trunk/src/org/hyperic/hq/measurement/server/session/AvailabilityDataDAO.java =================================================================== --- trunk/src/org/hyperic/hq/measurement/server/session/AvailabilityDataDAO.java 2008-03-12 04:18:43 UTC (rev 8185) +++ trunk/src/org/hyperic/hq/measurement/server/session/AvailabilityDataDAO.java 2008-03-12 04:37:27 UTC (rev 8186) @@ -160,18 +160,12 @@ } /** - * XXX: Why does this return a composite object? Why not just the RLE - * in question? - * - * - * @return List of Object[3]. Object[0] -> (Integer)startime. - * Object[1] -> (Integer)endtime. Object[2] -> (Double)availVal. + * @return List of AvailabilityDataRLE objs */ List getHistoricalAvails(int mid, long start, long end, boolean descending) { String sql = new StringBuffer() - .append("SELECT rle.availabilityDataId.startime,") - .append(" rle.endtime, rle.availVal") + .append("SELECT rle") .append(" FROM AvailabilityDataRLE rle") .append(" JOIN rle.availabilityDataId.measurement m") .append(" WHERE m.id = :mid") @@ -179,7 +173,8 @@ .append(" OR rle.endtime > :startime)") .append(" AND (rle.availabilityDataId.startime < :endtime") .append(" OR rle.endtime < :endtime)") - .append(" ORDER BY rle.availabilityDataId.startime") + .append(" ORDER BY rle.availabilityDataId.measurement,") + .append(" rle.availabilityDataId.startime") .append(((descending) ? " DESC" : " ASC")).toString(); return getSession() .createQuery(sql) @@ -190,14 +185,12 @@ } /** - * @return List of Object[3]. Object[0] -> (Integer)startime. - * Object[1] -> (Integer)endtime. Object[2] -> (Double)availVal. + * @return List of AvailabilityDataRLE objs */ List getHistoricalAvails(Integer[] mids, long start, long end, boolean descending) { String sql = new StringBuffer() - .append("SELECT rle.availabilityDataId.startime,") - .append(" rle.endtime, avg(rle.availVal)") + .append("SELECT rle") .append(" FROM AvailabilityDataRLE rle") .append(" JOIN rle.availabilityDataId.measurement m") .append(" WHERE m.id in (:mids)") @@ -205,9 +198,8 @@ .append(" OR rle.endtime > :startime)") .append(" AND (rle.availabilityDataId.startime < :endtime") .append(" OR rle.endtime < :endtime)") - .append(" GROUP BY rle.availabilityDataId.startime,") - .append(" rle.endtime") - .append(" ORDER BY rle.availabilityDataId.startime") + .append(" ORDER BY rle.availabilityDataId.measurement,") + .append(" rle.availabilityDataId.startime") .append(((descending) ? " DESC" : " ASC")).toString(); return getSession() .createQuery(sql) Modified: trunk/src/org/hyperic/hq/measurement/server/session/AvailabilityManagerEJBImpl.java =================================================================== --- trunk/src/org/hyperic/hq/measurement/server/session/AvailabilityManagerEJBImpl.java 2008-03-12 04:18:43 UTC (rev 8185) +++ trunk/src/org/hyperic/hq/measurement/server/session/AvailabilityManagerEJBImpl.java 2008-03-12 04:37:27 UTC (rev 8186) @@ -160,35 +160,34 @@ return Arrays.asList(rtn); } - private PageList getPageList(List availInfo, long begin, - long end) { + private PageList getPageList(List availInfo, long begin, long end) { PageList rtn = new PageList(); long interval = (end-begin)/DEFAULT_INTERVAL; for (Iterator it=availInfo.iterator(); it.hasNext(); ) { - // XXX: Fix me. - Object[] objs = (Object[])it.next(); - long availStartime = ((Long)objs[0]).longValue(); - long availEndtime = ((Long)objs[1]).longValue(); + AvailabilityDataRLE rle = (AvailabilityDataRLE)it.next(); + long availStartime = rle.getStartime(); + long availEndtime = rle.getEndtime(); if (availEndtime < begin) { continue; } LinkedList queue = new LinkedList(); - queue.add(objs); + queue.add(rle); + int i=0; for (long curr=begin; curr<end; curr+=interval) { long next = curr+interval; long endtime = - ((Long)((Object[])queue.getFirst())[1]).longValue(); + ((AvailabilityDataRLE)queue.getFirst()).getEndtime(); while (next > endtime) { - Object[] tmp = (Object[])it.next(); + AvailabilityDataRLE tmp = (AvailabilityDataRLE)it.next(); queue.addFirst(tmp); - endtime = ((Long)tmp[1]).longValue(); + endtime = tmp.getEndtime(); } endtime = availEndtime; while (curr > endtime) { queue.removeLast(); - objs = (Object[])queue.getLast(); - availStartime = ((Long)objs[0]).longValue(); - availEndtime = ((Long)objs[1]).longValue(); + rle = (AvailabilityDataRLE)queue.getLast(); + availStartime = rle.getStartime(); + availEndtime = rle.getEndtime(); endtime = availEndtime; } HighLowMetricValue val; @@ -196,8 +195,14 @@ val = getMetricValue(queue, curr); } else { val = new HighLowMetricValue(AVAIL_UNKNOWN, curr); + val.incrementCount(); } - rtn.add(val); + if (rtn.size() <= i) { + rtn.add(val); + } else { + updateMetricValue(val, (HighLowMetricValue)rtn.get(i)); + } + i++; } } if (rtn.size() == 0) { @@ -206,20 +211,47 @@ return rtn; } + private HighLowMetricValue updateMetricValue(HighLowMetricValue newVal, + HighLowMetricValue oldVal) { + if (newVal.getHighValue() == AVAIL_UNKNOWN || + newVal.getHighValue() > oldVal.getHighValue()) { + oldVal.setHighValue(newVal.getHighValue()); + } + if (newVal.getLowValue() == AVAIL_UNKNOWN || + newVal.getLowValue() < oldVal.getLowValue()) { + oldVal.setLowValue(newVal.getLowValue()); + } + int count = oldVal.getCount(); + if (oldVal.getValue() == AVAIL_UNKNOWN) { + double value = newVal.getValue(); + oldVal.setValue(value); + oldVal.setCount(1); + } else if (newVal.getValue() == AVAIL_UNKNOWN) { + return oldVal; + } else { + double value = + ((newVal.getValue()+(oldVal.getValue()*count)))/(count+1); + oldVal.setValue(value); + oldVal.incrementCount(); + } + return oldVal; + } + private HighLowMetricValue getMetricValue(List avails, long timestamp) { if (avails.size() == 1) { - Object[] objs = (Object[])avails.get(0); - return new HighLowMetricValue( - ((Double)objs[2]).doubleValue(), timestamp); + AvailabilityDataRLE rle = (AvailabilityDataRLE)avails.get(0); + return new HighLowMetricValue(rle.getAvailVal(), timestamp); } double value = 0; for (Iterator i=avails.iterator(); i.hasNext(); ) { - Object[] objs = (Object[])i.next(); - double availVal = ((Double)objs[2]).doubleValue(); + AvailabilityDataRLE rle = (AvailabilityDataRLE)i.next(); + double availVal = rle.getAvailVal(); value += availVal; } value = value/avails.size(); - return new HighLowMetricValue(value, timestamp); + HighLowMetricValue val = new HighLowMetricValue(value, timestamp); + val.incrementCount(); + return val; } /** @@ -536,11 +568,28 @@ Measurement meas = avail.getMeasurement(); long newStart = state.getTimestamp() + meas.getInterval(); long endtime = newStart; - dao.updateStartime(avail, newStart); + updateStartime(avail, newStart); dao.create(avail.getMeasurement(), state.getTimestamp(), endtime, state.getValue()); return true; } + + /* + * !!!need to move all calls to this + */ + private void updateStartime(AvailabilityDataRLE avail, long start) { + AvailabilityDataDAO dao = getAvailabilityDataDAO(); + // this should not be the case here, but want to make sure and + // avoid HibernateUniqueKeyExceptions :( + AvailabilityDataRLE tmp; + DataPoint tmpState = new DataPoint( + avail.getMeasurement().getId().intValue(), + avail.getAvailVal(), start); + if (null != (tmp = dao.findAvail(tmpState))) { + dao.remove(tmp); + } + dao.updateStartime(avail, start); + } private boolean updateState(DataPoint state) throws BadAvailStateException { |