Statistics
| Revision:

root / hci / trunk / eneraptor-web-app / grails-app / controllers / com / eneraptor / hci / StatisticsController.groovy @ 43

History | View | Annotate | Download (5.82 KB)

1

    
2
package com.eneraptor.hci
3

    
4
import groovy.sql.Sql
5

    
6
class StatisticsController {
7

    
8
        def dataSource
9
        
10
    def main = { }
11
        
12
        def graphs = {
13
        
14
                List savedGraphs = new ArrayList()
15
                
16
                savedGraphs = EneGraph.list()
17
                        
18
                [savedGraphs: savedGraphs]
19
                        
20
        }
21
        
22
        def reports = { }
23
        
24
        def newGraph = {
25
                
26
                List graphTypes = ["min","max","avg","sum"]
27
                List graphTypesFriendly = ["Minimum value","Maximum value","Average value","Cumulative"]
28
                
29
                List devices = new ArrayList()
30
                List devicesFriendly = new ArrayList()
31
                
32
                DeviceInfo.list().each {
33
                        devices << it.deviceId
34
                        devicesFriendly << it.friendlyName
35
                }
36
                
37
                [graphTypes:graphTypes,graphTypesFriendly:graphTypesFriendly, devices:devices, devicesFriendly:devicesFriendly]
38
                
39
        }
40
        
41
        def newGraphDo = {
42
                
43
                String errors = ""
44
                Date chosenTimeFrameStart = null
45
                Date chosenTimeFrameEnd = null
46
                
47
                if(params['timeFrameType'] == "day") {
48
                        chosenTimeFrameStart = params['dayMainTimeFrameStart']
49
                        chosenTimeFrameEnd = params['dayMainTimeFrameEnd']
50
                } else if(params['timeFrameType'] == "month") {
51
                        chosenTimeFrameStart = params['monthMainTimeFrameStart']
52
                        chosenTimeFrameEnd = params['monthMainTimeFrameEnd']
53
                } else if(params['timeFrameType'] == "year") {
54
                        chosenTimeFrameStart = params['yearMainTimeFrameStart']
55
                        chosenTimeFrameEnd = params['yearMainTimeFrameEnd']
56
                } else if(params['timeFrameType'] == "custom") {
57
                        chosenTimeFrameStart = params['customMainTimeFrameStart']
58
                        chosenTimeFrameEnd = params['customMainTimeFrameEnd']
59
                } else {
60
                        errors += "<p>Time frame type invalid!</p>"
61
                }
62
                
63
                def newEneGraph = new EneGraph(
64
                        name: params['graphName'],
65
                        type: params['graphType'],
66
                        timeFrameType: params['timeFrameType'],
67
                        timeFrameStart: chosenTimeFrameStart,
68
                        timeFrameEnd: chosenTimeFrameEnd,
69
                        innerSections: params['customMainTimeFrameInnerSections'],
70
                        advHoursTimeFrameStart: params['advHoursStart'],
71
                        advHoursTimeFrameEnd: params['advHoursEnd'],
72
                        advDayTimeFrameStart: params['advDayStart'],
73
                        advDayTimeFrameEnd: params['advDayEnd'],
74
                        advMonthTimeFrameStart: params['advMonthStart'],
75
                        advMonthTimeFrameEnd: params['advMonthEnd'],
76
                        deviceId: params['deviceId']
77
                )
78
                
79
                if(!newEneGraph.validate()) {
80
                        errors += "<p>Graph could not be created - there were some input errors. Please check if all input values are valid.</p>"
81
                        flash['errors'] = errors
82
                        redirect(action:'newGraph')
83
                } else {
84
                        if(newEneGraph.save()){
85
                                flash['confirms'] = "<p>Graph created succesfully!</p>"
86
                                redirect(action:'newGraph')
87
                        } else {
88
                                flash['errors'] = "<p>There was an error while saving graph.</p>"
89
                                redirect(action:'newGraph')
90
                        }
91
                }
92
                
93
                return true
94
                
95
        }
96
        
97
        def showGraph = {
98
                
99
                def graphToShow = EneGraph.get(params['graphId'])
100
                String query
101
                
102
                List data = new ArrayList()
103
                def results
104
                def db_sql = new Sql(dataSource)
105
                
106
                if(graphToShow.timeFrameType == "day") {
107
                        db_sql.eachRow "select date_trunc('day',ld.date_recieved) dt, " + graphToShow['type'] + "(to_number(ld.reported_data,'9999999999D99999')) vl from logged_data as ld where (device_id = '" + graphToShow['deviceId'] + "' and date_trunc('day',ld.date_recieved) >= '" + graphToShow.timeFrameStart + "' and date_trunc('day',ld.date_recieved) <= '" + graphToShow.timeFrameEnd + "') group by date_trunc('day',ld.date_recieved) order by date_trunc('day',ld.date_recieved) asc", {
108
                                data << [it.dt.getTime(), it.vl]
109
                        }
110
                } else if (graphToShow.timeFrameType == "month") {
111
                        db_sql.eachRow "select date_trunc('month',ld.date_recieved) dt, " + graphToShow['type'] + "(to_number(ld.reported_data,'9999999999D99999')) vl from logged_data as ld where (device_id = '" + graphToShow['deviceId'] + "' and date_trunc('month',ld.date_recieved) >= '" + graphToShow.timeFrameStart + "' and date_trunc('month',ld.date_recieved) <= '" + graphToShow.timeFrameEnd + "') group by date_trunc('month',ld.date_recieved) order by date_trunc('month',ld.date_recieved) asc", {
112
                                data << [it.dt.getTime(), it.vl]
113
                        }
114
                } else if (graphToShow.timeFrameType == "year") {
115
                        db_sql.eachRow "select date_trunc('year',ld.date_recieved) dt, " + graphToShow['type'] + "(to_number(ld.reported_data,'9999999999D99999')) vl from logged_data as ld where (device_id = '" + graphToShow['deviceId'] + "' and date_trunc('year',ld.date_recieved) >= '" + graphToShow.timeFrameStart + "' and date_trunc('year',ld.date_recieved) <= '" + graphToShow.timeFrameEnd + "') group by date_trunc('year',ld.date_recieved) order by date_trunc('year',ld.date_recieved) asc", {
116
                                data << [it.dt.getTime(), it.vl]
117
                        }
118
                } else if (graphToShow.timeFrameType == "custom") {
119
                        def innerTimeFrame = (long)((graphToShow.timeFrameEnd.getTime() - graphToShow.timeFrameStart.getTime()) / graphToShow.innerSections)
120
                        query = ""
121
                        for(int i = 0; i < graphToShow.innerSections;i++) {
122
                                def currDateMillis = graphToShow.timeFrameStart.getTime() + (i*innerTimeFrame) + innerTimeFrame/2
123
                                def currDate = new Date((long)currDateMillis)
124
                                def currDateStartMillis = graphToShow.timeFrameStart.getTime() + (i*innerTimeFrame)
125
                                def currDateStart = new Date((long)currDateStartMillis)
126
                                def currDateStopMillis = graphToShow.timeFrameStart.getTime() + ((i+1)*innerTimeFrame)
127
                                def currDateStop = new Date((long)currDateStopMillis)
128
                                query += "(select timestamp without time zone '" + currDate.toTimestamp() + "' dt, " + graphToShow['type'] + "(to_number(ld.reported_data,'9999999999D99999')) vl from logged_data as ld where (device_id = '" + graphToShow['deviceId'] + "' and ld.date_recieved >= '" + currDateStart.toTimestamp() + "' and ld.date_recieved <= '" + currDateStop.toTimestamp() + "')) "
129
                                if (i < (graphToShow.innerSections-1) ) query += "union "
130
                        }
131
                        query += "order by dt asc"
132
                        db_sql.eachRow(query) {
133
                                data << [it.dt.getTime(), it.vl]
134
                        }
135
                }
136
                
137
                [data:data]
138
                
139
        }
140
        
141
}