Project

General

Profile

1
package eu.dnetlib.data.claims.handler;
2

    
3
import com.google.gson.*;
4
import eu.dnetlib.data.claims.entity.Metrics;
5
import eu.dnetlib.data.claims.sql.SQLStoreException;
6
import eu.dnetlib.data.claims.sql.SqlDAO;
7
import eu.dnetlib.data.claims.utils.QueryGenerator;
8
import org.apache.log4j.Logger;
9
import org.postgresql.util.PGobject;
10
import org.springframework.scheduling.annotation.EnableScheduling;
11
import org.springframework.scheduling.annotation.Scheduled;
12
import org.springframework.stereotype.Service;
13

    
14
import java.sql.ResultSet;
15
import java.sql.SQLException;
16
import java.util.*;
17

    
18
@EnableScheduling
19
@Service
20
public class MetricsHandler {
21
    SqlDAO sqlDAO = null;
22
    QueryGenerator queryGenerator = null;
23

    
24
    private static final Logger logger = Logger.getLogger(MetricsHandler.class);
25

    
26
    public int countEUProjects() throws SQLStoreException, SQLException {
27
        logger.info("Counting EU projects...");
28
        ArrayList<Object> params = new ArrayList<>();
29
        String query = queryGenerator.generateSelectNumOfEUProjectsQuery();
30
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
31
        int res = fetchCountByResultSet(rs);
32

    
33
        return res;
34
    }
35

    
36
    public int countCountriesFromClaimedBy() throws SQLStoreException, SQLException {
37
        logger.info("Counting countries for people who claimed...");
38
        ArrayList<Object> params = new ArrayList<>();
39
        String query = queryGenerator.generateSelectNumOfCountriesQuery();
40
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
41
        int res = fetchCountByResultSet(rs);
42

    
43
        return res;
44
    }
45

    
46
    public int countUniqueResearchResults() throws SQLStoreException, SQLException {
47
        logger.info("Counting unique research results claimed...");
48
        ArrayList<Object> params = new ArrayList<>();
49
        String query = queryGenerator.generateSelectNumOfUniqueResearchResultsQuery();
50
        ResultSet rs = sqlDAO.executePreparedQuery(query, params);
51
        int res = fetchCountByResultSet(rs);
52

    
53
        return res;
54
    }
55

    
56
    // every day at midnight
57
    @Scheduled(cron = "0 0 0 * * ?")
58
    // every 5 mins for testing
59
//    @Scheduled(cron = "0 0/5 * * * *")
60
    public void calculateMetrics() throws SQLStoreException, Exception {
61
        logger.info("Calculating metrics...");
62
        String id = null;
63
        String query = queryGenerator.generateSelectAndBuildMetricsQuery();
64
        ResultSet rs1 = sqlDAO.executePreparedQuery(query);
65
        Metrics calculatedMetrics = fetchMetricsByResultSet(rs1, false);
66

    
67
        ArrayList<Object> params = new ArrayList<>();
68
        query = queryGenerator.generateUpdateMetricsQuery(calculatedMetrics, params);
69
        sqlDAO.executeUpdateQuery(query, params);
70
    }
71

    
72
    public Metrics getMetrics() throws SQLStoreException, SQLException {
73
        logger.info("Fetching metrics...");
74
        String query = queryGenerator.generateSelectMetricsQuery();
75
        ResultSet rs = sqlDAO.executePreparedQuery(query);
76
        Metrics res = fetchMetricsByResultSet(rs, true);
77
        return res;
78
    }
79

    
80
    private Metrics fetchMetricsByResultSet(ResultSet rs, boolean fromMetricsTable) throws SQLException {
81
        logger.debug("fetchMetricsByResultSet (from table="+fromMetricsTable+")");
82
        Metrics metrics = null;
83
        boolean hasNext = false;
84
        List<JsonObject> metrics_per_dashboard = new ArrayList<>();
85

    
86
        if(fromMetricsTable) {
87
            if(rs.next()) {
88
                metrics = new Metrics();
89
                PGobject pg = (PGobject) rs.getObject("metrics_per_dashboard");
90
                String jsonText = pg.getValue();
91

    
92
                Gson gson = new Gson();
93
                JsonArray myList2 = gson.fromJson(jsonText, JsonArray.class);
94

    
95
                List<JsonObject> listObj = new ArrayList<>();
96

    
97
                for(JsonElement jsonElement : myList2) {
98
                    listObj.add(jsonElement.getAsJsonObject());
99
                }
100

    
101
                metrics.setMetrics_per_dashboard(listObj);
102
                metrics.setDate(rs.getTimestamp("date"));
103
            }
104
        } else {
105
            while (rs.next()) {
106
                String[] dashboard_elements = ((String) rs.getString("claimed_in_dashboard")).split("_", 2);
107

    
108
                JsonObject dashboardMetrics = new JsonObject();
109
                dashboardMetrics.add("environment", new JsonPrimitive(dashboard_elements[0]));
110
                dashboardMetrics.add("dashboard", new JsonPrimitive(dashboard_elements[1]));
111
                dashboardMetrics.add("claims", new JsonPrimitive(rs.getInt("total_claims")));
112
                dashboardMetrics.add("users", new JsonPrimitive(rs.getInt("total_users")));
113
                dashboardMetrics.add("projects", new JsonPrimitive(rs.getInt("projects")));
114
                dashboardMetrics.add("eu_projects", new JsonPrimitive(rs.getInt("eu_projects")));
115
                dashboardMetrics.add("countries", new JsonPrimitive(rs.getInt("countries")));
116
                dashboardMetrics.add("research_results", new JsonPrimitive(rs.getInt("research_results")));
117

    
118
                metrics_per_dashboard.add(dashboardMetrics);
119

    
120
                hasNext = true;
121
            }
122

    
123
            if (hasNext) {
124
                metrics = new Metrics();
125
                metrics.setMetrics_per_dashboard(metrics_per_dashboard);
126
                metrics.setDate(new Date());
127
                metrics.setId("current");
128
            }
129
        }
130

    
131
        return metrics;
132
    }
133

    
134
    private int fetchCountByResultSet(ResultSet rs) throws SQLException {
135
        int count = 0;
136
        if(rs.next()) {
137
            count = rs.getInt("count");
138
        }
139
        return count;
140
    }
141

    
142
    public SqlDAO getSqlDAO() {
143
        return sqlDAO;
144
    }
145

    
146
    public void setSqlDAO(SqlDAO sqlDAO) {
147
        this.sqlDAO = sqlDAO;
148
    }
149

    
150
    public QueryGenerator getQueryGenerator() {
151
        return queryGenerator;
152
    }
153

    
154
    public void setQueryGenerator(QueryGenerator queryGenerator) {
155
        this.queryGenerator = queryGenerator;
156
    }
157
}
(10-10/13)