From 25693209b50d595674abac0d8edfacadef82637a Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Fri, 22 Jan 2016 17:53:40 +0100 Subject: [PATCH] Refactored aggregate data retrieval Former-commit-id: 2b109840dac3ceb7270eb5b176a8074e30d9c9df --- src/se/hal/page/PCOverviewHttpPage.java | 117 ++--------------- .../hal/util/AggregateDataListSqlResult.java | 122 ++++++++++++++++++ 2 files changed, 130 insertions(+), 109 deletions(-) create mode 100755 src/se/hal/util/AggregateDataListSqlResult.java diff --git a/src/se/hal/page/PCOverviewHttpPage.java b/src/se/hal/page/PCOverviewHttpPage.java index ea225c4e..f093f91a 100755 --- a/src/se/hal/page/PCOverviewHttpPage.java +++ b/src/se/hal/page/PCOverviewHttpPage.java @@ -2,18 +2,16 @@ package se.hal.page; import se.hal.HalContext; import se.hal.intf.HalHttpPage; +import se.hal.util.AggregateDataListSqlResult; +import se.hal.util.AggregateDataListSqlResult.*; import se.hal.util.TimeUtility; import se.hal.struct.Sensor; import se.hal.struct.User; import zutil.db.DBConnection; -import zutil.db.SQLResultHandler; import zutil.io.file.FileUtil; import zutil.parser.Templator; import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,76 +35,18 @@ public class PCOverviewHttpPage extends HalHttpPage { List users = User.getUsers(db); - ArrayList minDataList = new ArrayList(); - ArrayList hourDataList = new ArrayList(); - ArrayList dayDataList = new ArrayList(); + ArrayList minDataList = new ArrayList<>(); + ArrayList hourDataList = new ArrayList<>(); + ArrayList dayDataList = new ArrayList<>(); for(User user : users){ List userSensors = Sensor.getSensors(db, user); for(Sensor sensor : userSensors){ - PreparedStatement stmt = db.getPreparedStatement( - "SELECT user.username as username," - + " sensor_data_aggr.timestamp_start as timestamp_start," - + " sensor_data_aggr.timestamp_end as timestamp_end," - + " sensor_data_aggr.data as data," - + " sensor_data_aggr.confidence as confidence," - + TimeUtility.FIVE_MINUTES_IN_MS + " as period_length" - + " FROM sensor_data_aggr, user, sensor" - + " WHERE sensor.id = sensor_data_aggr.sensor_id" - + " AND sensor.id = ?" - + " AND user.id = sensor.user_id" - + " AND user.id = ?" - + " AND timestamp_end-timestamp_start == ?" - + " AND timestamp_start > ?" - + " ORDER BY timestamp_start ASC"); - stmt.setLong(1, sensor.getId()); - stmt.setLong(2, user.getId()); - stmt.setLong(3, TimeUtility.FIVE_MINUTES_IN_MS-1); - stmt.setLong(4, (System.currentTimeMillis() - TimeUtility.DAY_IN_MS) ); - ArrayList userPowerData = DBConnection.exec(stmt , new SQLPowerDataBuilder()); - minDataList.addAll(userPowerData); + minDataList.addAll(AggregateDataListSqlResult.getFiveMinuteAggregateData(db, sensor)); - stmt = db.getPreparedStatement( - "SELECT user.username as username," - + " sensor_data_aggr.timestamp_start as timestamp_start," - + " sensor_data_aggr.timestamp_end as timestamp_end," - + " sensor_data_aggr.data as data," - + " sensor_data_aggr.confidence as confidence," - + TimeUtility.HOUR_IN_MS + " as period_length" - + " FROM sensor_data_aggr, user, sensor" - + " WHERE sensor.id = sensor_data_aggr.sensor_id" - + " AND sensor.id = ?" - + " AND user.id = sensor.user_id" - + " AND user.id = ?" - + " AND timestamp_end-timestamp_start == ?" - + " AND timestamp_start > ?" - + " ORDER BY timestamp_start ASC"); - stmt.setLong(1, sensor.getId()); - stmt.setLong(2, user.getId()); - stmt.setLong(3, TimeUtility.HOUR_IN_MS-1); - stmt.setLong(4, (System.currentTimeMillis() - TimeUtility.WEEK_IN_MS) ); - userPowerData = DBConnection.exec(stmt, new SQLPowerDataBuilder()); - hourDataList.addAll(userPowerData); + hourDataList.addAll(AggregateDataListSqlResult.getHourAggregateData(db, sensor)); - stmt = db.getPreparedStatement( - "SELECT user.username as username," - + " sensor_data_aggr.timestamp_start as timestamp_start," - + " sensor_data_aggr.timestamp_end as timestamp_end," - + " sensor_data_aggr.data as data," - + " sensor_data_aggr.confidence as confidence," - + TimeUtility.DAY_IN_MS + " as period_length" - + " FROM sensor_data_aggr, user, sensor" - + " WHERE sensor.id = sensor_data_aggr.sensor_id" - + " AND sensor.id = ?" - + " AND user.id = sensor.user_id" - + " AND user.id = ?" - + " AND timestamp_end-timestamp_start == ?" - + " ORDER BY timestamp_start ASC"); - stmt.setLong(1, sensor.getId()); - stmt.setLong(2, user.getId()); - stmt.setLong(3, TimeUtility.DAY_IN_MS-1); - userPowerData = DBConnection.exec(stmt, new SQLPowerDataBuilder()); - dayDataList.addAll(userPowerData); + dayDataList.addAll(AggregateDataListSqlResult.getDayAggregateData(db, sensor)); } } @@ -120,45 +60,4 @@ public class PCOverviewHttpPage extends HalHttpPage { return tmpl; } - - public static class PowerData{ - public long timestamp; - public String data; - public String username; - public PowerData(long time, String data, String uname) { - this.timestamp = time; - this.data = data; - this.username = uname; - } - } - - private static class SQLPowerDataBuilder implements SQLResultHandler> { - @Override - public ArrayList handleQueryResult(Statement stmt, ResultSet result) throws SQLException { - ArrayList list = new ArrayList<>(); - long previousTimestampEnd = -1; - while(result.next()){ - - long timestampStart = result.getLong("timestamp_start"); - long timestampEnd = result.getLong("timestamp_end"); - long periodLength = result.getLong("period_length"); - int data = result.getInt("data"); - String username = result.getString("username"); - float confidence = result.getFloat("confidence"); - - //add null data point to list if one or more periods of data is missing before this - if(previousTimestampEnd != -1 && timestampStart-previousTimestampEnd > periodLength){ - list.add(new PowerData(previousTimestampEnd+1, "null", username)); - } - - //add this data point to list - list.add(new PowerData(timestampStart, ""+ (data/1000.0), username)); - - //update previous end timestamp - previousTimestampEnd = timestampEnd; - } - return list; - } - } - } diff --git a/src/se/hal/util/AggregateDataListSqlResult.java b/src/se/hal/util/AggregateDataListSqlResult.java new file mode 100755 index 00000000..3053fcdb --- /dev/null +++ b/src/se/hal/util/AggregateDataListSqlResult.java @@ -0,0 +1,122 @@ +package se.hal.util; + +import se.hal.struct.Sensor; +import zutil.db.DBConnection; +import zutil.db.SQLResultHandler; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +public class AggregateDataListSqlResult implements SQLResultHandler> { + + public static class AggregateData { + public long timestamp; + public String data; + public String username; + public AggregateData(long time, String data, String uname) { + this.timestamp = time; + this.data = data; + this.username = uname; + } + } + + + public static List getFiveMinuteAggregateData(DBConnection db, Sensor sensor) throws SQLException { + PreparedStatement stmt = db.getPreparedStatement( + "SELECT user.username as username," + + " sensor_data_aggr.timestamp_start as timestamp_start," + + " sensor_data_aggr.timestamp_end as timestamp_end," + + " sensor_data_aggr.data as data," + + " sensor_data_aggr.confidence as confidence," + + TimeUtility.FIVE_MINUTES_IN_MS + " as period_length" + + " FROM sensor_data_aggr, user, sensor" + + " WHERE sensor.id = sensor_data_aggr.sensor_id" + + " AND sensor.id = ?" + + " AND user.id = sensor.user_id" + + " AND user.id = ?" + + " AND timestamp_end-timestamp_start == ?" + + " AND timestamp_start > ?" + + " ORDER BY timestamp_start ASC"); + stmt.setLong(1, sensor.getId()); + stmt.setLong(2, sensor.getUser().getId()); + stmt.setLong(3, TimeUtility.FIVE_MINUTES_IN_MS-1); + stmt.setLong(4, (System.currentTimeMillis() - TimeUtility.DAY_IN_MS) ); + return DBConnection.exec(stmt , new AggregateDataListSqlResult()); + } + + public static List getHourAggregateData(DBConnection db, Sensor sensor) throws SQLException { + PreparedStatement stmt = db.getPreparedStatement( + "SELECT user.username as username," + + " sensor_data_aggr.timestamp_start as timestamp_start," + + " sensor_data_aggr.timestamp_end as timestamp_end," + + " sensor_data_aggr.data as data," + + " sensor_data_aggr.confidence as confidence," + + TimeUtility.HOUR_IN_MS + " as period_length" + + " FROM sensor_data_aggr, user, sensor" + + " WHERE sensor.id = sensor_data_aggr.sensor_id" + + " AND sensor.id = ?" + + " AND user.id = sensor.user_id" + + " AND user.id = ?" + + " AND timestamp_end-timestamp_start == ?" + + " AND timestamp_start > ?" + + " ORDER BY timestamp_start ASC"); + stmt.setLong(1, sensor.getId()); + stmt.setLong(2, sensor.getUser().getId()); + stmt.setLong(3, TimeUtility.HOUR_IN_MS - 1); + stmt.setLong(4, (System.currentTimeMillis() - TimeUtility.WEEK_IN_MS)); + return DBConnection.exec(stmt, new AggregateDataListSqlResult()); + } + + public static List getDayAggregateData(DBConnection db, Sensor sensor) throws SQLException { + PreparedStatement stmt = db.getPreparedStatement( + "SELECT user.username as username," + + " sensor_data_aggr.timestamp_start as timestamp_start," + + " sensor_data_aggr.timestamp_end as timestamp_end," + + " sensor_data_aggr.data as data," + + " sensor_data_aggr.confidence as confidence," + + TimeUtility.DAY_IN_MS + " as period_length" + + " FROM sensor_data_aggr, user, sensor" + + " WHERE sensor.id = sensor_data_aggr.sensor_id" + + " AND sensor.id = ?" + + " AND user.id = sensor.user_id" + + " AND user.id = ?" + + " AND timestamp_end-timestamp_start == ?" + + " ORDER BY timestamp_start ASC"); + stmt.setLong(1, sensor.getId()); + stmt.setLong(2, sensor.getUser().getId()); + stmt.setLong(3, TimeUtility.DAY_IN_MS-1); + return DBConnection.exec(stmt, new AggregateDataListSqlResult()); + } + + + @Override + public ArrayList handleQueryResult(Statement stmt, ResultSet result) throws SQLException { + ArrayList list = new ArrayList<>(); + long previousTimestampEnd = -1; + while(result.next()){ + + long timestampStart = result.getLong("timestamp_start"); + long timestampEnd = result.getLong("timestamp_end"); + long periodLength = result.getLong("period_length"); + int data = result.getInt("data"); + String username = result.getString("username"); + float confidence = result.getFloat("confidence"); + + //add null data point to list if one or more periods of data is missing before this + if(previousTimestampEnd != -1 && timestampStart-previousTimestampEnd > periodLength){ + list.add(new AggregateData(previousTimestampEnd+1, "null", username)); + } + + //add this data point to list + list.add(new AggregateData(timestampStart, ""+ (data/1000.0), username)); + + //update previous end timestamp + previousTimestampEnd = timestampEnd; + } + return list; + } +} \ No newline at end of file