Project

General

Profile

1
package eu.dnetlib.goldoa.service.dao;
2

    
3
import eu.dnetlib.goldoa.domain.*;
4
import org.apache.commons.codec.digest.DigestUtils;
5
import org.apache.commons.lang3.ArrayUtils;
6
import org.springframework.beans.factory.annotation.Autowired;
7
import org.springframework.jdbc.core.JdbcTemplate;
8
import org.springframework.jdbc.core.RowMapper;
9

    
10
import javax.sql.DataSource;
11
import java.sql.ResultSet;
12
import java.sql.SQLException;
13
import java.sql.Types;
14
import java.util.*;
15

    
16
/**
17
 * Created by antleb on 3/30/15.
18
 */
19
public class RequestDAO {
20

    
21
    @Autowired
22
    private DataSource dataSource;
23

    
24
    private final String GET_FOR_PROJECT = "select id, \"user\", date, researcher, project, publication, journal, publisher, budget, invoice, projectparticipation, fundingrequested, status from request where project=?";
25

    
26
    private final String GET_BY_ID = "select id, \"user\", date, researcher, project, publication, journal, publisher, budget, invoice, projectparticipation, fundingrequested, status from request where id=?";
27

    
28
    private final String UPDATE_REQUEST = "update request set \"user\"=?, date=?, researcher=?, project=?, publication=?, journal=?, publisher=?, budget=?, invoice = ?, projectparticipation=?, fundingrequested=?, status=? where id = ?";
29

    
30
    private final String INSERT_REQUEST = "insert into request (\"user\", date, researcher, project, publication, journal, publisher, budget, invoice, projectparticipation, fundingrequested, status, id) values (?, ?, ?, ?, ? ,? ,? ,? ,?, ?, ?, ?, ?)";
31

    
32
    private final String APPROVE_REQUEST = "update request set status = (status & ~" + Request.RequestStatus.REJECTED.getCode() + ") | " + Request.RequestStatus.APPROVED.getCode() + " where id=?";
33

    
34
    private final String REJECT_REQUEST = "update request set status = (status & ~" + Request.RequestStatus.APPROVED.getCode() + ") | " + Request.RequestStatus.REJECTED.getCode() + " where id=?";
35

    
36
    private final String INVOICE_UPLOADED = "update request set status = status | " + Request.RequestStatus.INVOICE_UPLOADED.getCode() + " where id=?";
37

    
38

    
39
    public void saveRequest(final Request request) {
40
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
41
        Object[] args = new Object[]{request.getUser(), request.getDate(), request.getResearcher(), request.getProject(),
42
                request.getPublication(), request.getJournal(), request.getPublisher(), request.getBudget(), request.getInvoice(),
43
                request.getProjectParticipation(), request.getFundingRequested(), request.getStatus(), request.getId()};
44
        int[] types = new int[]{Types.VARCHAR, Types.TIMESTAMP, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.REAL, Types.REAL, Types.INTEGER, Types.VARCHAR};
45

    
46
        if (jdbcTemplate.update(UPDATE_REQUEST, args, types) == 0) {
47
            jdbcTemplate.update(INSERT_REQUEST, args, types);
48
        }
49
    }
50

    
51
    public Request getRequest(String requestId) {
52
        return new JdbcTemplate(dataSource).queryForObject(GET_BY_ID, new String[]{requestId}, new int[]{
53
                Types.VARCHAR}, requestRowMapper);
54
    }
55

    
56
    private RowMapper<Request> requestRowMapper = new RowMapper<Request>() {
57
        @Override
58
        public Request mapRow(ResultSet rs, int rowNum) throws SQLException {
59
            return new Request(
60
                    rs.getString("id"), rs.getString("user"), rs.getTimestamp("date"), rs.getString("researcher"),
61
                    rs.getString("project"), rs.getString("publication"), rs.getString("journal"), rs.getString("publisher"),
62
                    rs.getString("budget"), rs.getString("invoice"), rs.getFloat("projectparticipation"), rs.getFloat("fundingrequested"), rs.getInt("status"));
63
        }
64
    };
65

    
66
    public List<Request> getForUser(String personId, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus statusFilter, int from, int to) {
67
        List<Object> args = new ArrayList<Object>();
68
        List<Integer> types = new ArrayList<Integer>();
69

    
70
        String query = getQuery(personId, requestSortBy, order, requestFilter, term, statusFilter, args, types);
71

    
72
//        return null;
73
        return new JdbcTemplate(dataSource).query(query, args.toArray(), ArrayUtils.toPrimitive(types.toArray(new Integer[0])), requestRowMapper);
74
    }
75

    
76
    public static void main(String[] args) {
77
        System.out.println(new RequestDAO().getForUser("dfsdf", new Date(), new Date(), RequestSort.PUBLICATION, RequestSortOrder.ASCENDING, null, "breast", Request.RequestStatus.APPROVED, 0, 12));
78
    }
79

    
80
    public List<Request> getForProject(String projectId) {
81
        return new JdbcTemplate(dataSource).query(GET_FOR_PROJECT, new String[]{projectId}, new int[]{
82
                Types.VARCHAR}, requestRowMapper);
83
    }
84

    
85
    public List<Request> getRequests(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus statusFilter, int from, int to) {
86
        List<Object> args = new ArrayList<Object>();
87
        List<Integer> types = new ArrayList<Integer>();
88

    
89
        String query = getQuery(null, requestSortBy, order, requestFilter, term, statusFilter, args, types);
90

    
91
        return new JdbcTemplate(dataSource).query(query, args.toArray(), ArrayUtils.toPrimitive(types.toArray(new Integer[0])), requestRowMapper);
92
    }
93

    
94
    public void approveRequest(String requestId, String comment) {
95
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
96

    
97
        jdbcTemplate.update(APPROVE_REQUEST, new String[]{requestId}, new int[]{Types.VARCHAR});
98

    
99
        if (comment != null) {
100
            if (jdbcTemplate.update("update comment set comment=?, date=? where id = (select comment from request_comment where request=? )", new Object[] {comment, new Date(), requestId}, new int[] {Types.VARCHAR, Types.TIMESTAMP, Types.VARCHAR}) == 0) {
101
                String commentId = "portal::" + DigestUtils.md5Hex(comment + new Date());
102

    
103
                jdbcTemplate.update("with comm as ( insert into comment (id, comment, date) values (?, ?, ?) returning id) insert into request_comment (request, comment) select ?, comm.id",
104
                        new Object[] {commentId, comment, new Date(), requestId}, new int[] {Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP, Types.VARCHAR});
105
            }
106
        }
107
    }
108

    
109
    public void rejectRequest(String requestId, String comment) {
110
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
111

    
112
        jdbcTemplate.update(REJECT_REQUEST, new String[]{requestId}, new int[]{Types.VARCHAR});
113

    
114
        if (comment != null) {
115
            if (jdbcTemplate.update("update comment set comment=?, date=? where id = (select comment from request_comment where request=? )", new Object[] {comment, new Date(), requestId}, new int[] {Types.VARCHAR, Types.TIMESTAMP, Types.VARCHAR}) == 0) {
116
                String commentId = "portal::" + DigestUtils.md5Hex(comment + new Date());
117

    
118
                jdbcTemplate.update("with comm as ( insert into comment (id, comment, date) values (?, ?, ?) returning id) insert into request_comment (request, comment) select ?, comm.id",
119
                        new Object[] {commentId, comment, new Date(), requestId}, new int[] {Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP, Types.VARCHAR});
120
            }
121
        }
122
    }
123

    
124
    public void invoiceUploaded(String requestId) {
125
        new JdbcTemplate(dataSource).update(INVOICE_UPLOADED, new String[] {requestId}, new int[] {Types.VARCHAR});
126
    }
127

    
128
    public int getRequestId() {
129
        return new JdbcTemplate(dataSource).queryForObject("select nextval('request_id_seq') as id", new RowMapper<Integer>() {
130
            @Override
131
            public Integer mapRow(ResultSet rs, int rowNum) throws SQLException {
132
                return rs.getInt("id");
133
            }
134
        });
135
    }
136

    
137
    private String getQuery(String personId, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus statusFilter, List<Object> args, List<Integer> types) {
138
        Map<String, String> joins = new HashMap<String, String>();
139
        List<String> whereClauses = new ArrayList<String>();
140
        List<Object> whereArgs = new ArrayList<Object>();
141
        List<Integer> whereTypes = new ArrayList<Integer>();
142

    
143
        String orderBy = null;
144

    
145
        if (term != null) {
146
            if (requestFilter != null) {
147
                switch (requestFilter) {
148
                    case USER:
149
                        joins.put("user", " join person u on u.id=r.user and (lower(u.firstname) like lower(?) or lower(u.initials) like lower(?) or lower(u.lastname) like lower(?)) ");
150
                        args.add("%" + term + "%");
151
                        args.add("%" + term + "%");
152
                        args.add("%" + term + "%");
153
                        types.add(Types.VARCHAR);
154
                        types.add(Types.VARCHAR);
155
                        types.add(Types.VARCHAR);
156
                        break;
157
                    case RESEARCHER:
158
                        joins.put("researcher", " join person res on res.id=r.researcher and (lower(res.firstname) like lower(?) or lower(res.initials) like lower(?) or lower(res.lastname) like lower(?)) ");
159
                        args.add("%" + term + "%");
160
                        args.add("%" + term + "%");
161
                        args.add("%" + term + "%");
162
                        types.add(Types.VARCHAR);
163
                        types.add(Types.VARCHAR);
164
                        types.add(Types.VARCHAR);
165
                        break;
166
                    case PROJECT:
167
                        joins.put("project", " join project proj on proj.id=r.project and (lower(proj.acronym) like lower(?) or lower(proj.title) like lower(?) or lower(proj.grant) like lower(?)) ");
168
                        args.add("%" + term + "%");
169
                        args.add("%" + term + "%");
170
                        args.add("%" + term + "%");
171
                        types.add(Types.VARCHAR);
172
                        types.add(Types.VARCHAR);
173
                        types.add(Types.VARCHAR);
174
                        break;
175
                    case PUBLICATION:
176
                        joins.put("publication", " join publication pub on pub.id=r.publication and (lower(pub.title) like lower(?)) ");
177
                        args.add("%" + term + "%");
178
                        types.add(Types.VARCHAR);
179
                        break;
180
                    case JOURNAL:
181
                        joins.put("journal", " join journal j on j.id=r.journal and (lower(j.title) like lower(?)) ");
182
                        args.add("%" + term + "%");
183
                        types.add(Types.VARCHAR);
184
                        break;
185
                    case PUBLISHER:
186
                        joins.put("publisher", " join publisher publ on publ.id=r.publisher and (lower(publ.name) like lower(?)) ");
187
                        args.add("%" + term + "%");
188
                        types.add(Types.VARCHAR);
189
                        break;
190
                }
191
            } else {
192
                joins.put("user", " left join person u on u.id=r.user ");
193
                whereClauses.add("(lower(u.firstname) like lower(?) or lower(u.initials) like lower(?) or lower(u.lastname) like lower(?))");
194
                whereArgs.add("%" + term + "%");
195
                whereArgs.add("%" + term + "%");
196
                whereArgs.add("%" + term + "%");
197
                whereTypes.add(Types.VARCHAR);
198
                whereTypes.add(Types.VARCHAR);
199
                whereTypes.add(Types.VARCHAR);
200
                joins.put("researcher", " left join person res on res.id=r.researcher ");
201
                whereClauses.add("(lower(res.firstname) like lower(?) or lower(res.initials) like lower(?) or lower(res.lastname) like lower(?))");
202
                whereArgs.add("%" + term + "%");
203
                whereArgs.add("%" + term + "%");
204
                whereArgs.add("%" + term + "%");
205
                whereTypes.add(Types.VARCHAR);
206
                whereTypes.add(Types.VARCHAR);
207
                whereTypes.add(Types.VARCHAR);
208
                joins.put("project", " left join project proj on proj.id=r.project ");
209
                whereClauses.add("(lower(proj.acronym) like lower(?) or lower(proj.title) like lower(?) or lower(proj.grant) like lower(?))");
210
                whereArgs.add("%" + term + "%");
211
                whereArgs.add("%" + term + "%");
212
                whereArgs.add("%" + term + "%");
213
                whereTypes.add(Types.VARCHAR);
214
                whereTypes.add(Types.VARCHAR);
215
                whereTypes.add(Types.VARCHAR);
216
                joins.put("publication", " left join publication pub on pub.id=r.publication ");
217
                whereClauses.add("(lower(pub.title) like lower(?))");
218
                whereArgs.add("%" + term + "%");
219
                whereTypes.add(Types.VARCHAR);
220
                joins.put("journal", " left join journal j on j.id=r.journal ");
221
                whereClauses.add("(lower(j.title) like lower(?))");
222
                whereArgs.add("%" + term + "%");
223
                whereTypes.add(Types.VARCHAR);
224
                joins.put("publisher", " left join publisher publ on publ.id=r.publisher ");
225
                whereClauses.add("(lower(publ.name) like lower(?))");
226
                whereArgs.add("%" + term + "%");
227
                whereTypes.add(Types.VARCHAR);
228
            }
229

    
230
        }
231

    
232
        if (requestSortBy != null) {
233
            switch (requestSortBy) {
234
                case DATE:
235
                    orderBy = "r.date";
236
                    break;
237
                case USER:
238
                    if (joins.get("user") == null)
239
                        joins.put("user", " left join person u on u.id=r.user ");
240

    
241
                    orderBy = " u.firstname, u.initials, u.lastname ";
242
                    break;
243
                case PUBLICATION:
244
                    if (joins.get("publication") == null)
245
                        joins.put("publication", " left join publication pub on r.publication=pub.id ");
246

    
247
                    orderBy = " pub.title ";
248
                    break;
249
                case STATUS:
250
                default:
251
                    orderBy = " r.status ";
252
                    break;
253
            }
254
        }
255

    
256
        StringBuilder sb = new StringBuilder("select r.id, r.\"user\", r.date, r.researcher, r.project, r.publication, r.journal, r.publisher, r.budget, r.invoice, r.projectparticipation, r.fundingrequested, r.status from request r ");
257

    
258
        for (String join:joins.values())
259
            sb.append(" ").append(join).append(" ");
260

    
261

    
262
        sb.append(" where ");
263

    
264
        if (personId != null) {
265
            sb.append("r.\"user\"=? ");
266

    
267
            args.add(personId);
268
            types.add(Types.VARCHAR);
269
        }
270
        else
271
            sb.append(" r.status > 0 ");
272

    
273
        if (whereClauses.size() > 0) {
274
            sb.append(" and (");
275

    
276
            for (String clause:whereClauses) {
277
                sb.append(clause);
278
                sb.append(" or ");
279
            }
280

    
281
            sb.delete(sb.lastIndexOf("or"), sb.length());
282
            sb.append(") ");
283

    
284
            args.addAll(whereArgs);
285
            types.addAll(whereTypes);
286
        }
287

    
288
        if (orderBy != null) {
289
            sb.append("order by ").append(orderBy);
290

    
291
            if (order == RequestSortOrder.ASCENDING)
292
                sb.append(" asc");
293
            else
294
                sb.append(" desc");
295
        }
296

    
297
        return sb.toString();
298
    }
299
}
(8-8/8)