Project

General

Profile

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

    
3
import com.google.gson.Gson;
4
import eu.dnetlib.data.claims.entity.*;
5
import org.apache.logging.log4j.LogManager;
6
import org.apache.logging.log4j.Logger;
7
import org.postgresql.util.PGobject;
8

    
9
import java.sql.SQLException;
10
import java.text.SimpleDateFormat;
11
import java.util.ArrayList;
12
import java.util.Date;
13
import java.util.List;
14

    
15

    
16
public class QueryGenerator {
17
    boolean updateOnInsert;
18
    String migrationTable ="claims"; //a table or a view containing old schema claims - But only user claims, not those where agent='inference'
19
    private static final Logger logger = LogManager.getLogger(QueryGenerator.class);
20

    
21
    public boolean isUpdateOnInsert() {
22
        return updateOnInsert;
23
    }
24

    
25
    public void setUpdateOnInsert(boolean updateOnInsert) {
26
        this.updateOnInsert = updateOnInsert;
27
    }
28

    
29
    /**
30
  ** Insert Queries **
31
  **/
32
    public String generateInsertQueryForClaimsOrphanIds(String id){
33
        return "INSERT INTO claims_orphan_ids values (" + id + ");";
34
    }
35
    private String generateInsertResultQuery(String openaire_id, String result_type, String title, String collected_from , String external_url, String doi, String orcidworkid, String access_rights , String embargo_end_date, String best_license, String record_path, String record_format, ArrayList<Object> params) {
36
        if(title!=null&&title.contains("'")){
37
            title=title.replace("'","''");
38
        }
39
        String fields="openaire_id";
40
        if(result_type!=null){
41
            fields+=", result_type";
42
        }
43
        if(title!=null){
44
            fields+=", title";
45
        }
46
        if(collected_from!=null){
47
            fields+=", collected_from";
48
        }
49
        if(external_url!=null){
50
            fields+=", external_url";
51
        }
52
        if(doi!=null){
53
            fields+=", doi";
54
        }
55
        if(orcidworkid!=null){
56
            fields+=", orcidworkid";
57
        }
58
        if(access_rights!=null){
59
            fields+=", access_rights";
60
        }
61
        if(embargo_end_date!=null){
62
            fields+=", embargo_end_date";
63
        }
64
        if(best_license!=null){
65
            fields+=", best_license";
66
        }
67
        if(record_path!=null){
68
            fields+=", record_path";
69
        }
70
        if(record_format!=null){
71
            fields+=", record_format";
72
        }
73
        String values="?";
74
        params.add(openaire_id);
75
        if(result_type!=null){
76
            values+=",?";
77
            params.add(result_type);
78
        }
79
        if(title!=null){
80
            values+=",?";
81
            params.add(title);
82
        }
83
        if(collected_from!=null){
84
            values+=",?";
85
            params.add(collected_from);
86
        }
87
        if(external_url!=null){
88
            values+=",?";
89
            params.add(external_url);
90
        }
91
        if(doi!=null){
92
            values+=",?";
93
            params.add(doi);
94
        }
95
        if(orcidworkid!=null){
96
            values+=",?";
97
            params.add(orcidworkid);
98
        }
99
        if(access_rights!=null){
100
            values+=",?";
101
            params.add(access_rights);
102
        }
103
        if(embargo_end_date!=null){
104
            values+=",?::date";
105
            params.add(embargo_end_date);
106
        }
107
        if(best_license!=null){
108
            values+=",?";
109
            params.add(best_license);
110
        }
111
        if(record_path!=null){
112
            values+=",?";
113
            params.add(record_path);
114
        }
115
        if(record_format!=null){
116
            values+=",?";
117
            params.add(record_format);
118
        }
119
        params.add(openaire_id);
120
        return "INSERT INTO result("+fields+")\n" +
121
                "    Select "+values+
122
                "    where not exists (select openaire_id from result where openaire_id=?)\n" +
123
                "    RETURNING openaire_id";
124
        //TODO update on insert when exists
125
    }
126
    public String generateInsertProjectQuery(String openaire_id, String name, String acronym, String funder_id, String funder_name, String funder_acronym, List<String> contactEmails, ArrayList<Object> params) {
127
        if(name!=null) {
128
            name = name.replace("'", "''");
129
        }
130
        String fields="openaire_id";
131
        if(name!=null){
132
            fields+=",name";
133
        }
134
        if(acronym!=null){
135
            fields+=",acronym";
136
        }
137
        if(funder_id!=null){
138
            fields+=",funder_id";
139
        }
140
        if(funder_name!=null){
141
            fields+=",funder_name";
142
        }
143
        if(funder_acronym!=null){
144
            fields+=",funder_acronym";
145
        }
146
        if(contactEmails != null && contactEmails.size() > 0){
147
            fields+=",contact_person";
148
        }
149
        String values="?";
150
        params.add(openaire_id);
151
        if(name!=null){
152
            values+=",?";
153
            params.add(name);
154
        }
155
        if(acronym!=null){
156
            values+=",?";
157
            params.add(acronym);
158
        }
159
        if(funder_id!=null){
160
            values+=",?";
161
            params.add(funder_id);
162
        }
163
        if(funder_name!=null){
164
            values+=",?";
165
            params.add(funder_name);
166
        }
167
        if(funder_acronym!=null){
168
            values+=",?";
169
            params.add(funder_acronym);
170
        }
171
        if(contactEmails != null && contactEmails.size() > 0){
172
            values+=",string_to_array(?, ',')";
173
            //String email_json = "{";
174
            String email_json = "";
175
            for(int i = 0; i< contactEmails.size(); i++){
176
                email_json+=contactEmails.get(i)+((i < contactEmails.size() -1 )?",":"");
177
                //params.add(contactEmails.get(i));
178
            }
179
            //email_json+="";
180
            params.add(email_json);
181
        }
182
        params.add(openaire_id);
183
        return "INSERT INTO project("+fields+")\n" +
184
                "    Select "+values +
185
                "    where not exists (select openaire_id from project where openaire_id=?)\n" +
186
                "    RETURNING openaire_id";
187
        //TODO update on insert when exists
188
    }
189
    private String generateInsertContextQuery(String openaire_id, String name, ArrayList<Object> params) {
190
        String fields="openaire_id";
191
        if(name!=null){
192
            fields+=",name";
193
        }
194
        String values="?";
195
        params.add(openaire_id);
196
        if(name!=null){
197
            values+=",?";
198
            params.add(name);
199
        }
200
        params.add(openaire_id);
201
        return "INSERT INTO context("+fields+")\n" +
202
                "    Select "+values+
203
                "    where not exists (select openaire_id from context where openaire_id=?)\n" +
204
                "    RETURNING openaire_id";
205
        //TODO update on insert when exists
206
    }
207
    private String generateInsertClaimQuery(Date date, String claimedBy, String source_type, String target_type , String source_id , String target_id, String claimedInDashboard, String semantics, ArrayList<Object> params) {
208

    
209
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
210
        String dateStr=null;
211
        dateStr=(format.format(date));
212
        String fields="claim_date,claimedBy,source_type,target_type, source_id, target_id";
213
        if(semantics!=null){
214
            fields+=",semantics";
215
        }
216
        if(claimedInDashboard!=null){
217
            fields+=",claimed_in_dashboard";
218
        }
219
        String values="?::timestamp,?,?,?,?,?";
220
        params.add(dateStr);
221
        params.add(claimedBy);
222
        params.add(source_type);
223
        params.add(target_type);
224
        params.add(source_id);
225
        params.add(target_id);
226
        if(semantics!=null){
227
            values+=",?";
228
            params.add(semantics);
229
        }
230
        if(claimedInDashboard!=null){
231
            values+=",?";
232
            params.add(claimedInDashboard);
233
        }
234
        return "     INSERT INTO claim( "+fields+")\n" +
235
                "    VALUES ( "+values+")\n" +
236
                "    RETURNING id, source_id, target_id\n";
237
    }
238

    
239
    private  String generateInsertFullClaimQuery(String targetQuery, String sourceQuery, Claim claim, ArrayList<Object> params) {
240
        if (claim ==null || targetQuery ==null || sourceQuery == null){
241
            return null;
242
        }
243
        String sourceTableName= getSourceTableName(claim.getSourceType());
244
        String targetTableName= getTargetTableName(claim.getTargetType());
245
        if (sourceTableName ==null || targetTableName ==null ){
246
            return null;
247
        }
248
        return " WITH target AS (\n" +
249
                targetQuery+
250
                "    ),\n source AS (\n" +
251
                sourceQuery+
252
                "   ),\n myclaim AS (\n" +
253
                generateInsertClaimQuery(claim.getDate(), claim.getUserMail(), claim.getSourceType(), claim.getTargetType(), claim.getSource().getOpenaireId(), claim.getTarget().getOpenaireId(), claim.getClaimedInDashboard(), this.createSemanticsType(claim.getSourceType(),claim.getTargetType()), params) +
254
                "   ),\n ins4 AS (\n" +
255
                "    INSERT INTO "+sourceTableName+" (claim_id, openaire_id)\n" +
256
                "    SELECT id, source_id\n" +
257
                "    FROM   myclaim) \n"+
258
                "    INSERT INTO "+targetTableName+"(claim_id, openaire_id)\n" +
259
                "    SELECT id, target_id\n" +
260
                "    FROM   myclaim "+
261
                " RETURNING claim_id;";
262
    }
263
    public  String generateInsertFullClaimQuery( Claim claim, ArrayList<Object> params) {
264
        String targetQuery =null;
265
        String sourceQuery=null;
266
        targetQuery=generateInsertEntityQuery(claim.getTarget(),claim.getTargetType(), params);
267
        sourceQuery=generateInsertEntityQuery(claim.getSource(),claim.getSourceType(), params);
268
        return generateInsertFullClaimQuery(targetQuery,sourceQuery,claim, params);
269

    
270
    }
271
    private String generateInsertEntityQuery(OpenaireEntity openaireEntity, String type, ArrayList<Object> params){
272
        String query=null;
273
        if(type==null){
274
            return null;
275
        }
276
        if(type.equals(ClaimUtils.DATASET)||type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)){
277
            Result result=(Result)openaireEntity;
278
            query=generateInsertResultQuery(result.getOpenaireId(),result.getResultType(),result.getTitle(),result.getCollectedFrom(),result.getExternalUrl(),result.getDoi(), result.getOrcidworkid(), result.getAccessRights(),result.getEmbargoEndDate(),result.getBestLicense(),result.getRecordPath(), result.getRecordFormat(), params);
279
        }else if(type.equals(ClaimUtils.PROJECT)){
280
            Project project=(Project)openaireEntity;
281
            query=generateInsertProjectQuery(project.getOpenaireId(),project.getName(),project.getAcronym(),project.getFunderId(),project.getFunderName(),project.getFunderShortName(),project.getContactEmails(), params);
282
        }else if(type.equals(ClaimUtils.CONTEXT)){
283
            Context context= (Context)openaireEntity;
284
            query=generateInsertContextQuery(context.getOpenaireId(),context.getTitle(), params);
285
        }
286

    
287
        return query;
288
    }
289

    
290
    private String getSourceTableName(String type){
291
        String tablename="has_source_";
292
        if(type==null){
293
            return null;
294
        }else{
295
            tablename+=getTypeForTable(type);
296
        }
297
        return tablename;
298
    }
299
    private String getTargetTableName(String type){
300
        String tablename="has_target_";
301
        if(type==null){
302
            return null;
303
        }else{
304
            tablename+=getTypeForTable(type);
305
        }
306
        return tablename;
307
    }
308
    public  String generateInsertClaimResultQuery(String targetQuery, String sourceQuery, Claim claim, ArrayList<Object> params) {
309

    
310
        return " WITH ins1 AS (\n" +
311
                targetQuery+
312
                "    ),\n ins2 AS (\n" +
313
                sourceQuery+
314
                "   ),\n ins3 AS (\n" +
315
               generateInsertClaimQuery(claim.getDate(), claim.getUserMail(), claim.getSourceType(), claim.getTargetType(), claim.getSource().getOpenaireId(), claim.getTarget().getOpenaireId(), claim.getClaimedInDashboard(), this.createSemanticsType(claim.getSourceType(),claim.getTargetType()), params) +
316
                "   ),\n ins4 AS (\n" +
317
                "    INSERT INTO has_source_result (claim_id, openaire_id)\n" +
318
                "    SELECT id, source_id\n" +
319
                "    FROM   ins3) \n"+
320
                "    INSERT INTO has_target_result(claim_id, openaire_id)\n" +
321
                "    SELECT id, target_id\n" +
322
                "    FROM   ins3;";
323
    }
324

    
325
    /**
326
     *
327
     * @param sourceType
328
     * @param targetType
329
     * @return "resultResult_"+targetType+sourceType+"_isRelatedTo"
330
     */
331
    private String createSemanticsType(String sourceType,String targetType){
332
        String semantics=null;
333
//        if((targetType.equals(ClaimUtils.PUBLICATION))&&(sourceType.equals(ClaimUtils.DATASET))){
334
//            semantics="resultResult_relationship_isRelatedTo";
335
//        }
336
//        else if(targetType.equals(ClaimUtils.DATASET)&&sourceType.equals(ClaimUtils.PUBLICATION)){
337
//            semantics="resultResult_relationship_isRelatedTo";
338
//        }
339
//        if((targetType.equals(ClaimUtils.PUBLICATION))&&(sourceType.equals(ClaimUtils.SOFTWARE))){
340
//            semantics="resultResult_relationship_isRelatedTo";
341
//        }
342
//        else if(targetType.equals(ClaimUtils.SOFTWARE)&&sourceType.equals(ClaimUtils.PUBLICATION)){
343
//            semantics="resultResult_relationship_isRelatedTo";
344
//        }
345
//        if((targetType.equals(ClaimUtils.DATASET))&&(sourceType.equals(ClaimUtils.SOFTWARE))){
346
//            semantics="resultResult_relationship_isRelatedTo";
347
//        }
348
//        else if(targetType.equals(ClaimUtils.SOFTWARE)&&sourceType.equals(ClaimUtils.DATASET)){
349
//            semantics="resultResult_relationship_isRelatedTo";
350
//        }
351
//        else  if((targetType.equals(ClaimUtils.PUBLICATION))&&(sourceType.equals(ClaimUtils.PUBLICATION))){
352
//            semantics="resultResult_relationship_isRelatedTo";
353
//        }
354
//        else if(targetType.equals(ClaimUtils.DATASET)&&sourceType.equals(ClaimUtils.DATASET)){
355
//            semantics="resultResult_relationship_isRelatedTo";
356
//        }
357
//        else if(targetType.equals(ClaimUtils.SOFTWARE)&&sourceType.equals(ClaimUtils.SOFTWARE)){
358
//            semantics="resultResult_supplement_isSupplementTo";
359
//        }
360
        //add above more specific semantics for pub,data and software
361
        if((targetType.equals(ClaimUtils.PUBLICATION)||targetType.equals(ClaimUtils.DATASET)||targetType.equals(ClaimUtils.SOFTWARE)||targetType.equals(ClaimUtils.OTHER))&&(sourceType.equals(ClaimUtils.PUBLICATION)||sourceType.equals(ClaimUtils.DATASET)||sourceType.equals(ClaimUtils.SOFTWARE)||sourceType.equals(ClaimUtils.OTHER))){
362
            semantics="resultResult_relationship_isRelatedTo";
363
        }
364
        else if((targetType.equals(ClaimUtils.PUBLICATION)||targetType.equals(ClaimUtils.DATASET)||targetType.equals(ClaimUtils.SOFTWARE)||targetType.equals(ClaimUtils.OTHER))&&(sourceType.equals(ClaimUtils.PROJECT))){
365
            semantics= "resultProject_outcome_produces";  //"resultProject_outcome_isProducedBy";
366
        }
367
        else if((targetType.equals(ClaimUtils.PUBLICATION)||targetType.equals(ClaimUtils.DATASET)||targetType.equals(ClaimUtils.SOFTWARE)||targetType.equals(ClaimUtils.OTHER))&&(sourceType.equals(ClaimUtils.CONTEXT))){
368
            semantics= "isRelevantTo";
369
        }
370

    
371
        return semantics;
372
    }
373
   /* public  String generateInsertClaimResultQuery(Result targetResult, Result sourceResult, Claim claim) {
374

    
375
        return generateInsertClaimResultQuery(generateInsertResultQuery(targetResult.getOpenaireId(), targetResult.getResultType(), targetResult.getTitle(), targetResult.getCollectedFrom(), targetResult.getExternalUrl(), targetResult.getDOI(),targetResult.getOrcidworkid(), targetResult.getAccessRights(), targetResult.getEmbargoEndDate(), targetResult.getBestLicense(), targetResult.getRecordPath(), targetResult.getRecordFormat()),
376
                generateInsertResultQuery(sourceResult.getOpenaireId(), sourceResult.getResultType(), sourceResult.getTitle(), sourceResult.getCollectedFrom(), sourceResult.getExternalUrl(), sourceResult.getDOI(), sourceResult.getOrcidworkid(), sourceResult.getAccessRights(), targetResult.getEmbargoEndDate(), sourceResult.getBestLicense(), sourceResult.getRecordPath(),sourceResult.getRecordFormat()),claim);
377
    }
378
    public  String generateInsertClaimProjectQuery(String   targetQuery, String projectQuery, Claim claim) {
379

    
380
        return " WITH ins1 AS (\n" +
381
                targetQuery+
382
                "    ),\n ins2 AS (\n" +
383
                projectQuery+
384
                "    ),\n ins3 AS (\n" +
385
                generateInsertClaimQuery(claim.getDate(), claim.getUserMail(), claim.getSourceType(), claim.getTargetType(), claim.getSource().getOpenaireId(), claim.getTarget().getOpenaireId(),"resultProject_outcome_isProducedBy") +
386
                "    ),\n ins4 AS (\n" +
387
                "    INSERT INTO has_source_project (claim_id, openaire_id)\n" +
388
                "    SELECT id, source_id\n" +
389
                "    FROM   ins3) \n"+
390
                "    INSERT INTO has_target_result(claim_id, openaire_id)\n" +
391
                "    SELECT id, target_id\n" +
392
                "    FROM   ins3;";
393
    }
394
    public  String generateInsertClaimProjectQuery(Result targetResult, Project project, Claim claim) {
395

    
396
        return
397
                generateInsertClaimProjectQuery(generateInsertResultQuery(targetResult.getOpenaireId(), targetResult.getResultType(), targetResult.getTitle(), targetResult.getCollectedFrom(), targetResult.getExternalUrl(), targetResult.getDOI(), targetResult.getOrcidworkid(), targetResult.getAccessRights(), targetResult.getEmbargoEndDate(), targetResult.getBestLicense(), targetResult.getRecordPath(),targetResult.getRecordFormat()),
398
                        generateInsertProjectQuery(project.getOpenaireId(), project.getName(), project.getAcronym(), project.getFunderId(), project.getFunderName(), project.getFunderShortName()), claim);
399
    }
400
    public  String generateInsertClaimContextQuery(Result targetResult, Context context, Claim claim) {
401

    
402
        return generateInsertClaimContextQuery
403
                (generateInsertResultQuery(targetResult.getOpenaireId(), targetResult.getResultType(), targetResult.getTitle(), targetResult.getCollectedFrom(), targetResult.getExternalUrl(), targetResult.getDOI(), targetResult.getOrcidworkid(), targetResult.getAccessRights(), targetResult.getEmbargoEndDate(), targetResult.getBestLicense(), targetResult.getRecordPath(),targetResult.getRecordFormat())
404
                        ,generateInsertContextQuery(context.getOpenaireId(), context.getTitle()),claim);
405
    }
406
    public  String generateInsertClaimContextQuery(String targetQuery,String sourceQuery, Claim claim) {
407

    
408
        return " WITH ins1 AS (\n" +targetQuery+
409
                "    ),\n ins2 AS (\n" +
410
                sourceQuery+
411
                "   ),\n ins3 AS (\n" +
412
                generateInsertClaimQuery(claim.getDate(), claim.getUserMail(), claim.getSourceType(), claim.getTargetType(), claim.getSource().getOpenaireId(), claim.getTarget().getOpenaireId(),"") +
413
                "    ), ins4 AS (\n" +
414
                "    INSERT INTO has_source_context(claim_id, openaire_id)\n" +
415
                "    SELECT id, source_id\n" +
416
                "    FROM   ins3) \n"+
417
                "    INSERT INTO has_target_result(claim_id, openaire_id)\n" +
418
                "    SELECT id, target_id\n" +
419
                "    FROM   ins3;";
420
    }
421
*/
422
    /**
423
     ** Delete Tables Queries **
424
     **/
425

    
426
    public String generateDeleteClaimTablesQuery() {
427
        return "drop table  if exists has_source_context;\n" +
428
                "drop table if exists has_source_project;\n" +
429
                "drop table if exists has_source_result;\n" +
430
                "drop table if exists has_target_project;\n" +
431
                "drop table if exists has_target_result;\n" +
432
                "drop table if exists claim;\n" +
433
                "drop table if exists project;\n" +
434
                "drop table if exists result;\n" +
435
                "drop table if exists context;\n" +
436
                "drop table if exists claims_orphan_ids;\n" +
437
                "\n ";
438

    
439
    }
440

    
441
    /**
442
     ** Create Tables Queries **
443
     **/
444

    
445
    public String generateCreateClaimTablesQuery() {
446
        return "CREATE TABLE project (\n" +
447
                "        openaire_id varchar(60) primary key NOT NULL,\n" +
448
                "        name text NOT NULL,\n" +
449
                "        acronym text,\n" +
450
                "        funder_id varchar(60) NOT NULL,\n" +
451
                "        funder_name text NOT NULL,\n" +
452
                "        funder_acronym text NOT NULL,\n" +
453
                "        notify boolean DEFAULT TRUE,\n" +
454
                "        contact_person text[],\n" +
455
                "        token varchar(60)\n" +
456
                ");\n" +
457
                "\n" +
458
                "CREATE TABLE result (\n" +
459
                " id  serial  NOT NULL,\n" +
460
                " openaire_id varchar(60) primary key NOT NULL,\n" +
461
                "\t\tresult_type varchar(30) NOT NULL,\n" +
462
                "\t\tdoi text,\n" +
463
                "\t\torcidworkid text,\n" +
464
                "\t\ttitle text,\n" +
465
                "\t\taccess_rights varchar(30),\n" +
466
                "\t\tembargo_end_date date,\n" +
467
                "\t\tbest_license varchar(30),\t\t\n" +
468
                "\t\texternal_url text,\n" +
469
                "\t\tcollected_from varchar(60) ,\n" +
470
                "\t\trecord_path text , \n" +
471
                "\t\trecord_format varchar(10)\n" +
472
                ");\n" +
473
                "\n" +
474
                "CREATE TABLE context (\n" +
475
                "        openaire_id varchar(60) primary key,\n" +
476
                "        name text\n" +
477
                ");\n" +
478
                "CREATE TABLE claim (\n" +
479
                "        id serial primary key NOT NULL,\n" +
480
                "        claim_date timestamp without time zone NOT NULL,\n" +
481
                "        claimedBy text NOT NULL,\n" +
482
                "        claimed_in_dashboard varchar(50),\n" +
483
                "        source_type varchar(30) NOT NULL,\n" +
484
                "        target_type varchar(30) NOT NULL,\n" +
485
                "        source_id varchar(60) NOT NULL,\n" +
486
                "        target_id varchar(60) references result(openaire_id) NOT NULL,\n" +
487
                "        curation_date  timestamp without time zone,\n" +
488
                "        curated_by text,\n" +
489
                "        approved boolean DEFAULT TRUE,\n" +
490
                "        claim_status varchar(30),\n" +
491
                "        semantics varchar(60) NOT NULL\n" +
492
                ");\n" +
493
                "\n" +
494
                "CREATE TABLE has_source_context(\n" +
495
                "\tclaim_id int references claim(id) NOT NULL,\n" +
496
                "\topenaire_id varchar(60) references context(openaire_id) NOT NULL\n" +
497
                ");\n" +
498
                "CREATE TABLE has_source_project(\n" +
499
                "\tclaim_id int references claim(id) NOT NULL,\n" +
500
                "\topenaire_id varchar(60) references project(openaire_id) NOT NULL\n" +
501
                ");\n" +
502
                "CREATE TABLE has_source_result(\n" +
503
                "\tclaim_id int references claim(id) NOT NULL,\n" +
504
                "\topenaire_id varchar(60) references result(openaire_id) NOT NULL\n" +
505
                ");\n"+
506
                "CREATE TABLE has_target_project(\n" +
507
                "\tclaim_id int references claim(id) NOT NULL,\n" +
508
                "\topenaire_id varchar(60) references project(openaire_id) NOT NULL\n" +
509
                ");\n" +
510
                "CREATE TABLE has_target_result(\n" +
511
                "\tclaim_id int references claim(id) NOT NULL,\n" +
512
                "\topenaire_id varchar(60) references result(openaire_id) NOT NULL\n" +
513
                ");\n"+
514
                "CREATE TABLE claims_orphan_ids (\n" +
515
                "    id integer "+
516
                ");\n"
517

    
518
                ;
519

    
520
    }
521

    
522
    /**
523
     ** Select Queries *Old* Database **
524
     **/
525

    
526

    
527
    public String generateSelectDMFByIdQuery(String id) {
528
        return " Select * from "+this.migrationTable+"  where type='dmf2actions' and xml NOT ILIKE '%<oaf:concept%' and  resultid='"+id+"'  order by date desc limit 1";
529
    }
530

    
531
    public String generateSelectConceptDMFClaimsQuery(Integer limit) {
532
        return " Select * from "+this.migrationTable+"  where ( type='dmf2actions' or type='updates2actions' ) and xml LIKE '%<oaf:concept%' "+(limit>0?" limit "+limit:"");
533
    }
534
    /**
535
     *
536
     * @param limit : for limit > 0 the query adds limit clause, for limit < 0 query skips limit clause
537
     * @return
538
     */
539
    public String generateSelectRelationEnrichedWithDMFClaimsQuery(Integer limit) {
540
        return " select rel.*, dmf.dmf from (Select * from "+this.migrationTable+"  where type='rels2actions' order by id) as rel left outer join \n" +
541
                        "(Select DISTINCT ON (resultid) resultid,date, xml as dmf from "+this.migrationTable+"  where type='dmf2actions' and xml NOT ILIKE '%<oaf:concept%'   order by resultid,date desc , xml) as dmf on rel.resultid=dmf.resultid "+
542
                " order by rel.id "
543
                +(limit>0?" limit "+limit:"");
544

    
545
    }
546

    
547
    /**
548
     *
549
     * @param limit : for limit > 0 the query adds limit clause, for limit < 0 query skips limit clause
550
     * @return
551
     */
552
    public String generateSelectConceptClaimsEnrichedWithDMFClaimsQuery(Integer limit) {
553
        return " select rel.*, dmf.dmf from (Select * from "+this.migrationTable+"  where  ( type='dmf2actions' or type='updates2actions' ) and xml LIKE '%<oaf:concept%' order by id) as rel left outer join \n" +
554
                "(Select DISTINCT ON (resultid) resultid,date, xml as dmf from "+this.migrationTable+"  where type='dmf2actions' and xml NOT ILIKE '%<oaf:concept%'   order by resultid,date desc , xml) as dmf on rel.resultid=dmf.resultid"
555
                +" order by rel.id "
556
                +(limit>0?" limit "+limit:"");
557

    
558
    }
559
    
560
    public String generateSelectConceptClaimByIDEnrichedWithDMFClaimsQuery(Integer limit, String claimID) {
561
        return " select rel.*, dmf.dmf from (Select * from "+this.migrationTable+"  where id='"+claimID+"' and  ( type='dmf2actions' or type='updates2actions' ) and xml LIKE '%<oaf:concept%') as rel left outer join \n" +
562
                "(Select DISTINCT ON (resultid) resultid,date, xml as dmf from "+this.migrationTable+"  where type='dmf2actions' and xml NOT ILIKE '%<oaf:concept%'   order by resultid,date desc , xml)  as dmf on rel.resultid=dmf.resultid"
563
                +(limit>0?" limit "+limit:"");
564
    }
565
    public String generateSelectRelationClaimByIDEnrichedWithDMFClaimsQuery(Integer limit, String claimID) {
566
        return " select rel.*, dmf.dmf from (Select * from "+this.migrationTable+"   where id='"+claimID+"' and type='rels2actions' ) as rel left outer join \n" +
567
                "(Select DISTINCT ON (resultid) resultid,date, xml as dmf from "+this.migrationTable+"  where type='dmf2actions' and xml NOT ILIKE '%<oaf:concept%'   order by resultid,date desc , xml) as dmf on rel.resultid=dmf.resultid"
568
                +(limit>0?" limit "+limit:"");
569
    }
570

    
571

    
572
    public  String generateSelectConceptClaimByIdQuery(String id) {
573
        return " Select * from "+this.migrationTable+"  where ( type='dmf2actions' or type='updates2actions' ) and xml LIKE '%<oaf:concept%' and id='"+id+"'";
574

    
575
    }
576
    public  String generateSelectRelationClaimByIdQuery(String id) {
577
        return " Select * from "+this.migrationTable+"  where type='rels2actions' and id='"+id+"'";
578

    
579
    }
580

    
581

    
582
    /**
583
     ** Select - Fetch Queries *New* Database **
584
     **/
585

    
586

    
587
    private  String addPagingClause(Integer limit, Integer offset) {
588
        if(limit==null && offset==null){
589
            return "";
590
        }
591
        else if((limit==null || offset==null || offset <0 || limit<=0)){
592
            limit=10;
593
            offset=0;
594
        }
595
        return  " limit " + limit + " offset " + offset;
596

    
597
    }
598
    private  String addOrderByClause( String orderBy, boolean desc) {
599
        if(orderBy==null){
600
            return null;
601
        }else if(orderBy.equals("date")){
602
            return  " order by claim.claim_date "+((desc)?"desc":"asc");
603
        }else if(orderBy.equals("user")){
604
            return  " order by claim.claimedBy "+((desc)?"desc":"asc");
605

    
606
        }else if(orderBy.equals("source")){
607
            return  " order by source_title "+((desc)?"desc":"asc");
608

    
609
        }else if(orderBy.equals("target")){
610
            return  " order by target_title "+((desc)?"desc":"asc");
611

    
612
        }else{
613
            return  " order by claim.claim_date  desc";
614
        }
615
 
616
    }
617

    
618
    private  String addFilterByType( List<String> types, ArrayList<Object> params) {
619
        logger.debug(types);
620
        if(types == null || types.isEmpty() || (types.size() == 1 && types.get(0).isEmpty())){
621
            return null;
622
        }else if (types.contains(ClaimUtils.PUBLICATION) && types.contains(ClaimUtils.DATASET) && types.contains(ClaimUtils.SOFTWARE) && types.contains(ClaimUtils.PROJECT) && types.contains(ClaimUtils.CONTEXT)  && types.contains(ClaimUtils.OTHER) ){
623
            //it's all types - no need to filter
624
            return null;
625
        }
626
        else{
627
            String filter = "";
628
            for(String type: types){
629
                filter+=((filter.length()>0)?" or  ":"")+" claim.source_type = ? or claim.target_type = ?";
630
                params.add(type);
631
                params.add(type);
632
            }
633
            return filter;
634
        }
635
    }
636

    
637
    public  String generateCountByUser(String user ,String  keyword,List<String> types, ArrayList<Object> params) {
638
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
639
            params.add(user);
640
            return " select count(*) from claim where "+ " claim.claimedBy=?";
641
        }
642
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByUser(user, null,null,keyword,null,false,types, params)+")as claim )";
643
    }
644
    public  String generateCountByDate(String dateFrom, String dateTo ,String  keyword,List<String> types, ArrayList<Object> params) {
645
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
646
            params.add(dateFrom);
647
            params.add(dateTo);
648
            return " select count(*) from claim where "+ " claim.claim_date >= ?::timestamp and claim.claim_date <= ?::timestamp ";
649
        }
650
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByDate(dateFrom,dateTo, null,null,keyword,null,false, types, params)+")as claim )";
651
    }
652
    public  String generateCountByProject(String projectId ,String  keyword, List<String> types, ArrayList<Object> params) {
653
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
654
            params.add(projectId);
655
            return " select count(*) from claim where "+"claim.source_id =?";
656
        }
657
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByProject(projectId, null,null,keyword,null,false, types, params)+")as claim )";
658
    }
659
    /*
660
    public  String generateCountByProjectToken(String projectToken,String email ,String  keyword, List<String> types ) {
661
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByProjectToken(projectToken, email,null,null,keyword,null,false, types)+")as claim )";
662
    }
663
    */
664
    public  String generateCountByFunder(String funderId ,String  keyword, List<String> types, ArrayList<Object> params) {
665
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
666
            params.add(funderId);
667
            return " select count(*) from claim,project as source where claim.source_id = source.openaire_id and source.funder_id =?";
668
        }
669
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByFunder(funderId, null,null,keyword,null,false, types, params)+")as claim )";
670
    }
671
    public  String generateCountByContext(String contextId ,String  keyword, List<String> types, ArrayList<Object> params) {
672
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByContext(contextId, null,null,keyword,null,false, types, params)+")as claim )";
673
    }
674
    public  String generateCountByResult(String resultId ,String  keyword, List<String> types, ArrayList<Object> params) {
675
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
676
            params.add(resultId);
677
            params.add(resultId);
678
            return " select count(*) from claim where "+" (  claim.source_id= ?  or  claim.target_id = ? )";
679
        }
680
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByResult(resultId, null,null,keyword,null,false,types, params)+")as claim )";
681

    
682
    }
683

    
684
    public  String generateCountAllClaims(String keyword,List<String> types, ArrayList<Object> params) {
685
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
686
            String filterByType = addFilterByType(types, params);
687
            //if(filterByType!= null){
688
            //    params.add(filterByType);
689
            //}
690
            return "select count(*) from claim "+((filterByType==null)?"":" where " + filterByType);
691
        }
692
        return " select count(*) from claim where claim.id in ( select claim.id from ("+generateFetchClaims(null,null,keyword,null,false,types, params)+" ) as claim )";
693

    
694
    }
695
    public  String generateFetchAllProjectsQuery() {
696
        return " select "+getProjectFields("source")+" from project as source";
697

    
698
    }
699
    public  String generateFetchAllContextsQuery() {
700
        return " select "+getContextFields("source")+" from context as source";
701
    }
702
    public  String generateFetchClaimsByUser(String user, Integer limit, Integer offset,String keyword,String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
703
        // "claim.claim_date", true
704
        String clause=  " claim.claimedBy=?";
705
        ArrayList<Object> clauseParams = new ArrayList<>();
706
        clauseParams.add(user);
707
        return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause,clauseParams, keyword, types, params);
708

    
709
    }
710
    /**
711
     *
712
     * @param limit how many results to return
713
     * @param offset starting from
714
     * @param keyword containing keyword
715
     * @return
716
     */
717

    
718
    public  String generateFetchClaims(Integer limit, Integer offset,String keyword,String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
719
        return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,null,null, keyword, types, params)+"";
720
    }
721
    /**
722
     *
723
     * @param limit how many results to return
724
     * @param offset starting from
725
     * @return
726
     */
727
     public  String generateFetchClaims(Integer limit, Integer offset, String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
728
         String keyword = null;
729
        return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,null,null,keyword,types, params)+"";
730

    
731
    }
732
     public  String generateFetchClaimsByDate(String dateFrom, String dateTo, Integer limit, Integer offset,String keyword, String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
733
         String clause=  " claim.claim_date >= ?::timestamp and claim.claim_date <= ?::timestamp ";
734
         ArrayList<Object> clauseParams = new ArrayList<>();
735
         clauseParams.add(dateFrom);
736
         clauseParams.add(dateTo);
737
          return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause, clauseParams,keyword,types, params);
738
    }
739
//used in CopyFromBetaToProduction
740
    public  String generateFetchClaimsByDateForDashboards(String dateFrom, String dateTo, Integer limit, Integer offset,String keyword, String orderBy, boolean desc,List<String> types, ArrayList<Object> params, ArrayList<String> dashboards) {
741
        String clause=  " claim.claim_date >= ?::timestamp and claim.claim_date <= ?::timestamp ";
742
        ArrayList<Object> clauseParams = new ArrayList<>();
743
        clauseParams.add(dateFrom);
744
        clauseParams.add(dateTo);
745
        if(dashboards.size()>0){
746
            clause = clause.concat(" and (");
747
        }
748
        for(int i =0; i < dashboards.size(); i++){
749
            if(i > 0){
750
                clause = clause.concat(" or ");
751
            }
752
            clause = clause.concat(" claim.claimed_in_dashboard = ? or source_id like ?");
753
            clauseParams.add("beta_connect_"+dashboards.get(i));
754
            clauseParams.add(dashboards.get(i)+"%");
755
        }
756
        if(dashboards.size()>0){
757
            clause = clause.concat(")");
758
        }
759

    
760
//        logger.debug("\n\nClause:"+clause+"\n\n");
761
        return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause, clauseParams,keyword,types, params);
762
    }
763

    
764
    public String generateFetchNumberOfClaimsByDateAndOpenaireId(String dateFrom, String dateTo, String openaireId, Integer limit, Integer offset,String keyword, String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
765
        String clause=  " claim.claim_date >= ?::timestamp and claim.claim_date <= ?::timestamp and source.openaire_id =? ";
766
        ArrayList<Object> clauseParams = new ArrayList<>();
767
        clauseParams.add(dateFrom);
768
        clauseParams.add(dateTo);
769
        clauseParams.add(openaireId);
770
        return generateSelectCountClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause, clauseParams,keyword,types, params);
771
    }
772

    
773
    public  String generateFetchClaimsByProject(String projectId, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
774
        String clause = "source.openaire_id =?";
775
        ArrayList<Object> clauseParams = new ArrayList<>();
776
        clauseParams.add(projectId);
777
        String filterByType = addFilterByType(types, clauseParams);
778
        clause+= ((filterByType==null)?"":" and ("+filterByType+") ");
779
        String query = " select * from ("+" select * from ( " + generateSelectclaimQuery(ClaimUtils.PROJECT, ClaimUtils.PUBLICATION, limit, offset, orderBy, desc, clause, clauseParams, keyword, params) + " ) as claim  "+
780
                ") as claim ";
781

    
782
                return query;
783
    }
784
/*
785
    public  String generateFetchClaimsByProjectToken(String token, String email, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types) {
786
        String clause = "source.token = '" + token + "' and '" + email + "' = ANY(source.contact_person)";
787
        String filterByType = addFilterByType(types);
788
        return " select * from ("+" select * from ( " + generateSelectclaimQuery(ClaimUtils.PROJECT, ClaimUtils.PUBLICATION, limit, offset, orderBy, desc, clause, keyword) + " ) as claim  "+
789
                ") as claim "+
790
                ((filterByType==null)?"":" where "+filterByType+" ");
791
    }
792
*/
793
    public String generateSelectProjectIdByTokenAndEmailQuery(String token, String email, ArrayList<Object> params) {
794
        params.add(token);
795
        params.add(email);
796
        return "SELECT openaire_id FROM project WHERE token=? AND ?= ANY(contact_person);";
797
    }
798

    
799
    public String generateSelectProjectIdByTokenQuery(String token, ArrayList<Object> params) {
800
        params.add(token);
801
        return "SELECT openaire_id FROM project WHERE token=?;";
802
    }
803

    
804
    public  String generateFetchClaimsByContext(String contextId,  Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
805
        String clause=  "(claim.source_id like ? or claim.claimed_in_dashboard like ? )";
806
        ArrayList<Object> clauseParams = new ArrayList<>();
807
        clauseParams.add(contextId+'%');
808
        clauseParams.add("%_connect_" + contextId);
809
        String filterByType = addFilterByType(types, clauseParams);
810
        clause+= ((filterByType==null)?"":" and ("+filterByType+") ");
811
        String query = " select * from ("+" ( " +generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause,clauseParams, keyword, types, params)+")"+
812
                 ") as claim ";
813
        return query;
814
    }
815
    public  String generateFetchClaimsByFunder(String funderId, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
816
        String whereClause = "source_id =source.openaire_id ";
817
        ArrayList<Object> whereParams = new ArrayList<>();
818
        String filterByType = addFilterByType(types, whereParams);
819
        whereClause+= ((filterByType==null)?"":" and ("+filterByType+") ");
820
        String query = " select * from ("+" ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,whereClause,whereParams, keyword, params)+" )"+
821
                ") as claim ";
822

    
823

    
824
        return query;
825
    }
826
    public  String generateFetchClaimsByResult(String resultId,  Integer limit, Integer offset, String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
827
         String queryWhereClause=" ( source.openaire_id = ?  or target.openaire_id = ? )";
828
        ArrayList<Object> whereParams = new ArrayList<>();
829
         whereParams.add(resultId);
830
         whereParams.add(resultId);
831
        String filterByType = addFilterByType(types, whereParams);
832
        queryWhereClause+= ((filterByType==null)?"":" and ("+filterByType+") ");
833
        String query =  " select * from ("+" ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) \nunion "+
834
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) \nunion "+
835
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) "+
836
                ") as claim ";
837

    
838
        return query;
839

    
840
    }
841

    
842
    public  String generateFetchClaimsByClaimId(String claimId, String sourceType, String targetType, ArrayList<Object> params) {
843
        String keyword = null;
844
        String clause=  " claim.id = ?::int ";
845
        ArrayList<Object> clauseParams = new ArrayList<>();
846
        clauseParams.add(claimId);
847
        String orderbyLimitClause= null;
848
        if(sourceType.equals(ClaimUtils.PUBLICATION)||sourceType.equals(ClaimUtils.DATASET)||sourceType.equals(ClaimUtils.SOFTWARE)||sourceType.equals(ClaimUtils.OTHER)){
849
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
850
        }else if(sourceType.equals(ClaimUtils.PROJECT)){
851
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
852
        }else if(sourceType.equals(ClaimUtils.CONTEXT)){
853
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
854
        }
855
        return null;
856
    }
857

    
858
    private  String getClaimFields() {
859
        return " claim.id, claim.claim_date, claim.claimedBy, claim.source_type, claim.target_type, claim.semantics, claim.curation_date, claim.curated_by, claim.approved, claim.claimed_in_dashboard ";
860
    }
861
    private  String getResultFields(String tableAlias) {
862
        return " "+tableAlias+".openaire_id, "+tableAlias+".title  "+tableAlias+"_title, "+tableAlias+".result_type, "+tableAlias+".doi, "+tableAlias+".orcidworkid, "+tableAlias+".access_rights, "+tableAlias+".embargo_end_date, "+tableAlias+".best_license, "+tableAlias+".external_url,  "+tableAlias+".collected_from,  "+tableAlias+".record_path,  "+tableAlias+".record_format ";
863
    }
864
    private  String getProjectFields(String tableAlias) {
865
        return " "+tableAlias+".openaire_id, "+tableAlias+".name  as "+tableAlias+"_title, "+tableAlias+".acronym, "+tableAlias+".funder_id, "+tableAlias+".funder_name, "+tableAlias+".funder_acronym, null as field7, array_to_string("+tableAlias+".contact_person,','), null as field9, null as field10, null as field11, null as field12 ";
866
    }
867
    private  String getContextFields(String tableAlias) {
868
        return " "+tableAlias+".openaire_id, "+tableAlias+".name   "+tableAlias+"_title, "+" null as field4, null as field5, null as field6, null as field7, null as field8, null as field9, null as field10, null as field11, null as field12, null as field13 ";
869
    }
870

    
871
    private  String getFieldsPerType(String type, String tableAlias){
872
        String fields= null;
873

    
874
        if (type != null) {
875
            if (type.equals(ClaimUtils.PUBLICATION) || type.equals(ClaimUtils.DATASET) || type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)) {
876
                fields = getResultFields(tableAlias);
877

    
878
            } else if (type.equals(ClaimUtils.PROJECT)) {
879
                fields = getProjectFields(tableAlias);
880

    
881
            } else if (type.equals(ClaimUtils.CONTEXT)) {
882
                fields = getContextFields(tableAlias);
883
            }
884
        }
885

    
886
        return fields;
887
    }
888
    private  String generateSelectclaimQuery(String sourceType, String targetType, Integer limit,Integer offset,String orderBy, boolean desc,String whereClause, ArrayList<Object> whereParams, String keyword, ArrayList<Object> params) {
889
        if(sourceType == null || targetType == null){
890
            return null;
891
        }
892

    
893
        String orderByClause= addOrderByClause(orderBy,desc);
894
        String pagingClause= addPagingClause(limit,offset);
895
        String query = " select "+getClaimFields()+" ,"+getFieldsPerType(sourceType, "source")+" , "+getFieldsPerType(targetType,"target")+
896
                " \nfrom claim, "+getTypeForTable(sourceType)+" as source, has_source_"+getTypeForTable(sourceType)+", has_target_"+getTypeForTable(targetType)+", "+getTypeForTable(targetType)+" as target \n" +
897
                "where claim.id =  has_source_"+getTypeForTable(sourceType)+".claim_id   and   has_source_"+getTypeForTable(sourceType)+".openaire_id = source.openaire_id " +
898
                "and claim.id =  has_target_"+getTypeForTable(targetType)+".claim_id   and   has_target_"+getTypeForTable(targetType)+".openaire_id  = target.openaire_id "+
899
                ((keyword==null)?"":(" and ("+getKeywordClauseForType(sourceType, "source", keyword, params)+" or "+getKeywordClauseForType(targetType, "target", keyword, params)+" ")+" or "+getKeywordClauseForClaim( keyword, params)+" )")+
900
                ((whereClause==null)?"":" and "+whereClause+" ")+
901
                ((orderByClause==null)?"":" "+orderByClause+" ")+
902
                pagingClause;
903
        if(whereParams != null && !whereParams.isEmpty()) {
904
            params.addAll(whereParams);
905
        }
906
        return query;
907
    }
908
    private String getKeywordClauseForType(String type,String tableAlias,String keyword, ArrayList<Object> params){
909
        if (type == null ||keyword == null){
910
            return "";
911
        }
912
        keyword=keyword.toLowerCase();
913
        if (type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET)||type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)){
914
            params.add("%" + keyword + "%");
915
            params.add("%" + keyword + "%");
916
            return "  (lower("+tableAlias+".title) like ? or lower("+tableAlias+".doi) like ?"+")";
917
        }else if (type.equals(ClaimUtils.PROJECT)){
918
            params.add("%" + keyword + "%");
919
            params.add("%" + keyword + "%");
920
            params.add("%" + keyword + "%");
921
            params.add("%" + keyword + "%");
922
            return "  (lower("+tableAlias+".name) like ? or lower("+tableAlias+".acronym) like ? or lower("+tableAlias+".funder_name) like ? or lower("+tableAlias+".funder_acronym) like ? "+")";
923
        }else if (type.equals(ClaimUtils.CONTEXT)){
924
            params.add("%" + keyword + "%");
925
            return "  (lower("+tableAlias+".name) like ? )";
926
        }
927
        return "";
928
    }
929
    private String getKeywordClauseForClaim(String keyword, ArrayList<Object> params){
930
        if (keyword == null){
931
            return "";
932
        }else {
933
            params.add("%" + keyword.toLowerCase() + "%");
934
            return " (lower(claim.claimedby) like ?)";
935
        }
936
     }
937
    private  String generateSelectClaimQueryAsUnionOfAllRelations(Integer limit,Integer offset,String orderBy, boolean desc,String specificWhereClause,ArrayList<Object> whereParams, String keyword,List<String> types, ArrayList<Object> params) {
938
        //TODO eliminate unions  based on the to
939
        // ClaimUtils.PUBLICATION or ClaimUtils.DATASET  it
940
        String orderByClause= addOrderByClause(orderBy,desc);
941
        String pagingClause= addPagingClause(limit,offset);
942
        String query = "select * from ("+
943

    
944
                " ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause,whereParams,keyword, params)+" ) \nunion "+
945
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
946
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause, whereParams, keyword, params)+" )" +
947

    
948
                ") as claim   ";
949
        String filterByType = addFilterByType(types, params);
950
         query += ((filterByType==null)?"":" where "+filterByType+" ")+
951
                ((orderByClause==null)?"":" "+orderByClause+" ")+
952
                pagingClause;
953

    
954
         return query;
955
    }
956
    private  String generateSelectCountClaimQueryAsUnionOfAllRelations(Integer limit,Integer offset,String orderBy, boolean desc,String specificWhereClause,ArrayList<Object> whereParams, String keyword,List<String> types, ArrayList<Object> params) {
957
        //TODO eliminate unions  based on the to
958
        // ClaimUtils.PUBLICATION or ClaimUtils.DATASET  it
959
        String orderByClause= addOrderByClause(orderBy,desc);
960
        String pagingClause= addPagingClause(limit,offset);
961
        String query = "select count(id) from ("+
962

    
963
                " ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause,whereParams,keyword, params)+" ) \nunion "+
964
                " ( " +generateSelectclaimQuery(ClaimUtils.DATASET,ClaimUtils.DATASET,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
965
                " ( " +generateSelectclaimQuery(ClaimUtils.SOFTWARE,ClaimUtils.SOFTWARE,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
966
                " ( " +generateSelectclaimQuery(ClaimUtils.OTHER,ClaimUtils.OTHER,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
967
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
968
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause, whereParams, keyword, params)+" )" +
969

    
970
                ") as claim   ";
971
        String filterByType = addFilterByType(types, params);
972
        query += ((filterByType==null)?"":" where "+filterByType+" ")+
973
                ((orderByClause==null)?"":" "+orderByClause+" ")+
974
                pagingClause;
975

    
976
        return query;
977
    }
978

    
979
    private  String getTypeForTable(String type){
980
        if(type == null){
981
            return null;
982
        }
983
        if(type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET) ||type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)){
984
            return "result";
985
        }else{
986
            return type;
987
        }
988
    }
989
    /**
990
     ** Update - Queries *New* Database **
991
     **/
992

    
993
    private  void updateResult(){
994

    
995
    }
996
    private  void updateProject(){
997

    
998
    }
999
    /**
1000
     ** Delete - Queries *New* Database **
1001
     **/
1002

    
1003
    private String generateDeleteEntityQuery(String resultid, String claimId, String type, ArrayList<Object> params){
1004
        if(type == null||resultid == null||claimId ==  null ){
1005
            return null;
1006
        }
1007
        String query = null;
1008
        if(type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET) ||type.equals(ClaimUtils.SOFTWARE) ||type.equals(ClaimUtils.OTHER)){
1009
            query = generateDeleteResultQuery(resultid,claimId, params);
1010
        }else if(type.equals(ClaimUtils.PROJECT)){
1011
            query = generateDeleteProjectQuery(resultid,claimId, params);
1012
        }else if (type.equals(ClaimUtils.CONTEXT)){
1013
            query = generateDeleteContextQuery(resultid,claimId, params);
1014
        }
1015
        return query;
1016
    }
1017
/*
1018
    Before delete check a Result, Project, Context
1019
    check if there is another claim in  has_source_* or has_target_* relation
1020
    for the entity
1021
 */
1022
    private String generateDeleteResultQuery(String resultid, String claimId, ArrayList<Object> params){
1023
        params.add(resultid);
1024
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.PUBLICATION)+" WHERE  openaire_id = ? and NOT EXISTS \n" +
1025
                "   (   " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.PUBLICATION), params) + " union " +
1026
                generateSelectOthersFromRelationTableQuery(resultid,claimId,getTargetTableName(ClaimUtils.PUBLICATION), params)+"  ) ;\n" ;
1027
        return query;
1028
    }
1029
    private String generateDeleteProjectQuery(String resultid, String claimId, ArrayList<Object> params){
1030
        params.add(resultid);
1031
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.PROJECT)+" WHERE openaire_id = ? and NOT EXISTS \n" +
1032
                "  (    " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.PROJECT), params) + " union " +
1033
                generateSelectOthersFromRelationTableQuery(resultid,claimId,getTargetTableName(ClaimUtils.PROJECT), params)+"  ) ;\n" ;
1034
        return query;
1035
    }
1036
    private String generateDeleteContextQuery(String resultid, String claimId, ArrayList<Object> params){
1037
        params.add(resultid);
1038
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.CONTEXT)+" WHERE openaire_id = ? and NOT EXISTS \n" +
1039
                " (  " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.CONTEXT), params) +"  ) ;\n" ;
1040
        return query;
1041
    }
1042

    
1043
    public String  generateCountClaimsForResultQuery(String resultId){
1044
        return " Select count(*) from claim where source_id = '"+ resultId +"' or target_id = '"+resultId+"' ";
1045
    }
1046
    public String  generateSelectResultSource(String resultId){
1047
        return " Select collected_from from result where openaire_id = '"+ resultId +"' ";
1048
    }
1049

    
1050
    /**
1051
     * Select form a has_source_* or has_target_* table
1052
     * ...
1053
     * @param resultid
1054
     * @param claimId
1055
     * @param tableName
1056
     * @return
1057
     */
1058
    private String  generateSelectOthersFromRelationTableQuery(String resultid, String claimId , String tableName, ArrayList<Object> params){
1059
        params.add(resultid);
1060
        params.add(claimId);
1061
        String query =
1062
                " SELECT 1 FROM "+ tableName+"  WHERE openaire_id = ? and claim_id != ?::int " ;
1063
        return query;
1064
    }
1065
    public String  generateDeleteFullClaimQuery(String id, String user, String sourceType, String sourceId, String targetType, String targetId, ArrayList<Object> params){
1066
        //TODO generate delete query
1067
        params.add(id);
1068
        params.add(id);
1069
        params.add(id);
1070
        String query =
1071
                "BEGIN;\n" +
1072
                //delete has_source_*
1073
                "DELETE FROM "+ getSourceTableName(sourceType)+" WHERE   claim_id = ?::int ;\n" +
1074

    
1075
                //delete has_target_*
1076
                "DELETE FROM "+ getTargetTableName(targetType)+" WHERE  claim_id = ?::int ;\n" +
1077

    
1078
                //delete claim
1079
                "DELETE FROM claim where id = ?::int ;\n" +
1080

    
1081
                        //delete source
1082
                generateDeleteEntityQuery(sourceId,id,sourceType, params)+
1083

    
1084
                        //delete target
1085
                generateDeleteEntityQuery(targetId,id,targetType, params)+
1086
                "COMMIT";
1087
        return query;
1088
    }
1089
    public String  generateSelectClaimQuery(String id, String user, ArrayList<Object> params){
1090

    
1091
        params.add(id);
1092
        params.add(user);
1093
        String query =" ";
1094
        return " Select id, source_type, source_id, target_type, target_id from claim where id = ?::int and claimedBy = ? ";
1095
    }
1096

    
1097
    public String  generateSelectClaimQuery(String id, ArrayList<Object> params){
1098

    
1099
        params.add(id);
1100
        String query =" ";
1101
        return " Select id, source_type, source_id, target_type, target_id,claimedBy  from claim where id = ?::int";
1102
    }
1103
    /**
1104
     * used to fetch the information from DB
1105
     * @param ids
1106
     * @param users
1107
     * @return
1108
     */
1109
    public String  generateSelectClaimQuery(List<String> ids, List<String> users, ArrayList<Object> params){
1110

    
1111
        String query =" Select id, source_type, source_id, target_type, target_id from claim where ";
1112
        if(ids.size()>0 && users.size() > 0 && ids.size() == users.size()) {
1113
            for (int i = 0; i < ids.size(); i++) {
1114
                query+="  ( id = ? and claimedBy = ? ) or";
1115
                params.add(ids.get(i));
1116
                params.add(users.get(i));
1117
            }
1118
            query = query.substring(0, query.length()-2);
1119
            return query;
1120
        }
1121
        return null;
1122
    }
1123

    
1124
    public  String generateSelectFirstContextByCommunityIdQuery(String communityId, ArrayList<Object> params) {
1125
        params.add(communityId+"%");
1126
        return " Select " + getContextFields("context") + " from context where openaire_id like ? LIMIT 1;";
1127
    }
1128

    
1129
    public  String generateSelectProjectByIdQuery(String projectId, ArrayList<Object> params) {
1130
        params.add(projectId);
1131
        return " Select " + getProjectFields("project") + " from project where openaire_id = ?";
1132
    }
1133

    
1134
    public  String generateSelectContactEmailsByProjectIdQuery(String projectId, ArrayList<Object> params) {
1135
        params.add(projectId);
1136
        //return " SELECT contact_person FROM project WHERE openaire_id = ? ;";
1137
        return "SELECT DISTINCT unnest(contact_person) as contact_person FROM project WHERE openaire_id = ?;";
1138
    }
1139

    
1140
    public String generateSelectProjectIdsAndNamesByProjectManagerMail(String userMail, ArrayList<Object> params) {
1141
        params.add(userMail);
1142
        return "SELECT openaire_id, name FROM project WHERE ? = ANY (contact_person);";
1143
    }
1144

    
1145
    public String generateUpdateTokenByProjectId(String projectdId, String newToken, ArrayList<Object> params) {
1146
        params.add(newToken);
1147
        params.add(projectdId);
1148
        return "UPDATE project SET token = ? WHERE openaire_id = ?";
1149
    }
1150
    public String generateUpdateContactEmailsByProjectIdByProjectId(String projectdId, List<String> contactEmails, ArrayList<Object> params) {
1151
        String emails = "";
1152
        if(contactEmails != null && contactEmails.size() > 0){
1153
            //emails+="'{";
1154
            for(int i = 0; i< contactEmails.size(); i++){
1155

    
1156
                emails+=contactEmails.get(i)+((i < contactEmails.size() -1 )?",":"");
1157
                //params.add(contactEmails.get(i));
1158
            }
1159
            //emails+="}'";
1160
        }
1161

    
1162
        params.add(emails);
1163
        params.add(projectdId);
1164
        return "UPDATE project SET contact_person = string_to_array(?, ',') WHERE openaire_id = ?;";
1165
    }
1166

    
1167
    public String generateUpdateClaimCuration(String curatedBy, String claimId, boolean approved, ArrayList<Object> params) {
1168
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1169
        Date date = new Date();
1170
        String dateStr=null;
1171
        dateStr=(format.format(date));
1172

    
1173
        params.add(dateStr);
1174
        params.add(curatedBy);
1175
        params.add(approved);
1176
        params.add(claimId);
1177
        String query = "UPDATE claim "
1178
                + "SET curation_date = ?::timestamp, curated_by = ?, approved = ? "
1179
                + "WHERE id = ?::int";// RETURNING curation_date, curated_by, approved";
1180

    
1181
        logger.debug("Query to execute: "+query);
1182

    
1183
        return query;
1184
    }
1185

    
1186
    public String generateInsertNotificationQuery(Date date, String openaire_id, String userMail, int frequency, boolean notify , ArrayList<Object> params) {
1187

    
1188
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1189
        String dateStr=null;
1190
        dateStr=(format.format(date));
1191
        String fields="last_interaction_date, user_email, frequency, notify, openaire_id";
1192

    
1193
        String values="?::timestamp,?,?,?,?";
1194
        params.add(dateStr);
1195
        params.add(userMail);
1196
        params.add(frequency);
1197
        params.add(notify);
1198
        params.add(openaire_id);
1199

    
1200
        return "     INSERT INTO notification( "+fields+")\n" +
1201
                "    VALUES ( "+values+")\n" +
1202
                "    RETURNING openaire_id, user_email\n";
1203
    }
1204

    
1205
    public String generateUpdateNotificationPreferences(String openaire_id, String userMail, int frequency, boolean notify, ArrayList<Object> params) {
1206
        params.add(frequency);
1207
        params.add(notify);
1208
        params.add(userMail);
1209
        params.add(openaire_id);
1210
        String query = "UPDATE notification "
1211
                + "SET frequency = ?, notify = ? "
1212
                + "WHERE user_email = ? AND openaire_id = ?";// RETURNING curation_date, curated_by, approved";
1213

    
1214
        logger.debug("Query to execute: "+query);
1215

    
1216
        return query;
1217
    }
1218

    
1219
    public String generateUpdateNotificationLastInteractionDate(String openaire_id, String userMail, Date date, ArrayList<Object> params) {
1220
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1221
        String dateStr=null;
1222
        dateStr=(format.format(date));
1223

    
1224
        params.add(dateStr);
1225
        params.add(userMail);
1226
        params.add(openaire_id);
1227
        String query = "UPDATE notification "
1228
                + "SET last_interaction_date = ?::timestamp "
1229
                + "WHERE user_email = ? AND openaire_id = ?";// RETURNING curation_date, curated_by, approved";
1230

    
1231
        logger.debug("Query to execute: "+query);
1232

    
1233
        return query;
1234
    }
1235

    
1236
    public String generateSelectNotificationQuery(String openaire_id, String userMail, ArrayList<Object> params) {
1237
        params.add(userMail);
1238
        params.add(openaire_id);
1239
        String query = "SELECT * FROM notification WHERE user_email = ? AND openaire_id = ?";
1240

    
1241
        logger.debug("Query to execute: "+query);
1242

    
1243
        return query;
1244
    }
1245

    
1246
    public String generateSelectTrueNotificationsQuery() {
1247
        String query = "SELECT * FROM notification WHERE notify=true";
1248

    
1249
        logger.debug("Query to execute: "+query);
1250

    
1251
        return query;
1252
    }
1253

    
1254
    public String generateSelectNumOfTotalClaims() {
1255
        String query = "select count(*) as total_claims, claimed_in_dashboard from claim as claims GROUP BY claimed_in_dashboard;";
1256

    
1257
        logger.debug("Query to execute: "+query);
1258
        return query;
1259
    }
1260

    
1261
    public String generateSelectNumOfTotalUsers() {
1262
        String query =  "select count(*) as total_users, claimed_in_dashboard from (select  claimedby, claimed_in_dashboard " +
1263
                        "   FROM claim as claims GROUP by claimedby, claimed_in_dashboard) as users GROUP BY claimed_in_dashboard;";
1264

    
1265
        logger.debug("Query to execute: "+query);
1266
        return query;
1267
    }
1268

    
1269
    public String generateSelectNumOfEUProjectsQuery() {
1270
        String query =  "select  count(*) as eu_projects, claimed_in_dashboard from " +
1271
                        "   (select source_id, count(source_id), claimed_in_dashboard " +
1272
                        "       FROM claim where source_type = 'project'  and source_id in " +
1273
                        "           (select openaire_id from project where funder_acronym = 'EC') GROUP BY source_id, claimed_in_dashboard) as projects GROUP BY claimed_in_dashboard;";
1274

    
1275
        logger.debug("Query to execute: "+query);
1276

    
1277
        return query;
1278
    }
1279

    
1280
    public String generateSelectNumOfProjectsQuery() {
1281
        String query =  "select  count(*) as projects, claimed_in_dashboard from " +
1282
                        "   (select source_id, count(source_id), claimed_in_dashboard " +
1283
                        "       FROM claim where source_type = 'project' GROUP BY source_id, claimed_in_dashboard) as projects GROUP BY claimed_in_dashboard;";
1284
        logger.debug("Query to execute: "+query);
1285

    
1286
        return query;
1287
    }
1288

    
1289
    public String generateSelectNumOfCountriesQuery() {
1290
        String query =  "select  count(*) as countries, claimed_in_dashboard from " +
1291
                        "   (select  regexp_replace(claimedby, '^.*\\.', '') as country, claimed_in_dashboard " +
1292
                        "       FROM claim GROUP BY  country, claimed_in_dashboard ) as users GROUP BY claimed_in_dashboard;";
1293

    
1294
        logger.debug("Query to execute: "+query);
1295

    
1296
        return query;
1297
    }
1298

    
1299
    public String generateSelectNumOfUniqueResearchResultsQuery() {
1300
        String query =  "select count(*) as research_results, claimed_in_dashboard from " +
1301
                        "   (select * from " +
1302
                        "       (" +
1303
                        "           (select target_id as r_id, target_type as type, claimed_in_dashboard FROM claim GROUP BY r_id, type, claimed_in_dashboard) " +
1304
                        "           union " +
1305
                        "           (select source_id as r_id, source_type as type, claimed_in_dashboard FROM claim " +
1306
                        "               where source_type!='project' and source_type!='context' GROUP BY r_id, type, claimed_in_dashboard) " +
1307
                        "       ) as results GROUP BY r_id, type, claimed_in_dashboard) " +
1308
                        "   as total_results GROUP BY claimed_in_dashboard;";
1309
        logger.debug("Query to execute: "+query);
1310

    
1311
        return query;
1312
    }
1313

    
1314
    public String generateSelectAndBuildMetricsQuery() {
1315
        // query without dashboard and environment
1316
//        String query = "SELECT total_claims, total_users, projects, eu_projects, countries, research_results FROM\n" +
1317
//                "(select  count(*) as countries from (select  regexp_replace(claimedby, '^.*\\.', '') as country FROM claim GROUP BY  country ) as users) as table1,\n" +
1318
//                "(select  count(*) as eu_projects from (select source_id, count(source_id) FROM claim where source_type = 'project'  and source_id in (select openaire_id from project where funder_acronym = 'EC') GROUP BY source_id) as projects) as table2,\n" +
1319
//                "(select count(*) as research_results from\n" +
1320
//                "(select * from\n" +
1321
//                "(\n" +
1322
//                "(select target_id as r_id, target_type as type FROM claim    GROUP BY r_id, type)\n" +
1323
//                "union\n" +
1324
//                "(select source_id as r_id, source_type as type FROM claim where source_type!='project' and source_type!='context'    GROUP BY r_id, type)\n" +
1325
//                ") as results GROUP BY r_id, type) as total_results) as table3, \n"+
1326
//
1327
//                "(select count(*) as total_claims from claim as claims) as table4, "+
1328
//                "(select count(*) as total_users from (select  claimedby FROM claim as claims GROUP by claimedby) as users) as table5, "+
1329
//                "(select  count(*) as projects from (select source_id, count(source_id) FROM claim as claims where source_type = 'project' GROUP BY source_id) as projects) as table6;";
1330

    
1331

    
1332
        String query = "select projects, total_claims, total_users, countries, eu_projects, research_results, \n" +
1333
                "COALESCE(t1.claimed_in_dashboard, t2.claimed_in_dashboard, t3.claimed_in_dashboard, t4.claimed_in_dashboard, t5.claimed_in_dashboard, t6.claimed_in_dashboard) as claimed_in_dashboard \n" +
1334
                "from (\n" +
1335
                "(select  count(*) as projects, claimed_in_dashboard from (select source_id, count(source_id), claimed_in_dashboard FROM claim where source_type = 'project' GROUP BY source_id, claimed_in_dashboard) as projects GROUP BY claimed_in_dashboard) as t1\n" +
1336
                " FULL JOIN \n" +
1337
                "(select count(*) as total_claims, claimed_in_dashboard from claim as claims GROUP BY claimed_in_dashboard) as t2\n" +
1338
                " ON \n" +
1339
                "(t1.claimed_in_dashboard = t2.claimed_in_dashboard) \n" +
1340
                "FULL JOIN \n" +
1341
                "(select  count(*) as countries, claimed_in_dashboard from (select  regexp_replace(claimedby, '^.*\\.', '') as country, claimed_in_dashboard FROM claim GROUP BY  country, claimed_in_dashboard ) as users GROUP BY claimed_in_dashboard) as t3 \n" +
1342
                "ON (COALESCE(t1.claimed_in_dashboard, t2.claimed_in_dashboard) = t3.claimed_in_dashboard)\n" +
1343
                "FULL JOIN \n" +
1344
                "(select count(*) as total_users, claimed_in_dashboard from (select  claimedby, claimed_in_dashboard FROM claim as claims GROUP by claimedby, claimed_in_dashboard) as users group by claimed_in_dashboard) as t4 \n" +
1345
                "ON (COALESCE(t1.claimed_in_dashboard, t2.claimed_in_dashboard, t3.claimed_in_dashboard) = t4.claimed_in_dashboard)\n" +
1346
                "FULL JOIN \n" +
1347
                "(select  count(*) as eu_projects, claimed_in_dashboard from (select source_id, count(source_id), claimed_in_dashboard FROM claim where source_type = 'project'  and source_id in (select openaire_id from project where funder_acronym = 'EC') GROUP BY source_id, claimed_in_dashboard) as projects group by claimed_in_dashboard) as t5 \n" +
1348
                "ON (COALESCE(t1.claimed_in_dashboard, t2.claimed_in_dashboard, t3.claimed_in_dashboard, t4.claimed_in_dashboard) = t5.claimed_in_dashboard) \n" +
1349
                "FULL JOIN \n" +
1350
                "(select count(*) as research_results, claimed_in_dashboard from (select * from ((select target_id as r_id, target_type as type, claimed_in_dashboard FROM claim GROUP BY r_id, type, claimed_in_dashboard) union (select source_id as r_id, source_type as type, claimed_in_dashboard FROM claim where source_type!='project' and source_type!='context' GROUP BY r_id, type, claimed_in_dashboard)) as results GROUP BY r_id, type, claimed_in_dashboard) as total_results group by claimed_in_dashboard) as t6 \n" +
1351
                "ON (COALESCE(t1.claimed_in_dashboard, t2.claimed_in_dashboard, t3.claimed_in_dashboard, t4.claimed_in_dashboard, t5.claimed_in_dashboard) = t6.claimed_in_dashboard) \n" +
1352
                ");";
1353

    
1354
        logger.debug("Query to execute: "+query);
1355

    
1356
        return query;
1357
    }
1358

    
1359
    public String generateSelectMetricsQuery() {
1360
        String query = "SELECT * FROM metrics WHERE id='current';";
1361

    
1362
        logger.debug("Query to execute: "+query);
1363

    
1364
        return query;
1365
    }
1366

    
1367
    public String generateUpdateMetricsQuery(Metrics metrics, ArrayList<Object> params) throws SQLException {
1368
        Gson g = new Gson();
1369
        String str = g.toJson(metrics.getMetrics_per_dashboard());
1370
        PGobject jsonObject = new PGobject();
1371
        jsonObject.setType("json");
1372
        jsonObject.setValue(str);
1373
        params.add(jsonObject);
1374

    
1375
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
1376
        String dateStr=null;
1377
        dateStr=(format.format(metrics.getDate()));
1378
        params.add(dateStr);
1379

    
1380
        params.add(metrics.getId());
1381

    
1382
        String query = "UPDATE metrics "
1383
                + "SET metrics_per_dashboard = ?::json, date = ?::timestamp "
1384
                + "WHERE id = ?;";
1385
        return query;
1386
    }
1387

    
1388
    public String getMigrationTable() {
1389
        return migrationTable;
1390
    }
1391

    
1392
    public void setMigrationTable(String migrationTable) {
1393
        this.migrationTable = migrationTable;
1394
    }
1395
}
(9-9/10)