Project

General

Profile

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

    
3
import eu.dnetlib.data.claims.entity.*;
4

    
5
import java.text.SimpleDateFormat;
6
import java.util.ArrayList;
7
import java.util.Date;
8
import java.util.List;
9
import org.apache.log4j.Logger;
10

    
11

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

    
17
    public boolean isUpdateOnInsert() {
18
        return updateOnInsert;
19
    }
20

    
21
    public void setUpdateOnInsert(boolean updateOnInsert) {
22
        this.updateOnInsert = updateOnInsert;
23
    }
24

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

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

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

    
266
    }
267
    private String generateInsertEntityQuery(OpenaireEntity openaireEntity, String type, ArrayList<Object> params){
268
        String query=null;
269
        if(type==null){
270
            return null;
271
        }
272
        if(type.equals(ClaimUtils.DATASET)||type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)){
273
            Result result=(Result)openaireEntity;
274
            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);
275
        }else if(type.equals(ClaimUtils.PROJECT)){
276
            Project project=(Project)openaireEntity;
277
            query=generateInsertProjectQuery(project.getOpenaireId(),project.getName(),project.getAcronym(),project.getFunderId(),project.getFunderName(),project.getFunderShortName(),project.getContactEmails(), params);
278
        }else if(type.equals(ClaimUtils.CONTEXT)){
279
            Context context= (Context)openaireEntity;
280
            query=generateInsertContextQuery(context.getOpenaireId(),context.getTitle(), params);
281
        }
282

    
283
        return query;
284
    }
285

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

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

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

    
367
        return semantics;
368
    }
369
   /* public  String generateInsertClaimResultQuery(Result targetResult, Result sourceResult, Claim claim) {
370

    
371
        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()),
372
                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);
373
    }
374
    public  String generateInsertClaimProjectQuery(String   targetQuery, String projectQuery, Claim claim) {
375

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

    
392
        return
393
                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()),
394
                        generateInsertProjectQuery(project.getOpenaireId(), project.getName(), project.getAcronym(), project.getFunderId(), project.getFunderName(), project.getFunderShortName()), claim);
395
    }
396
    public  String generateInsertClaimContextQuery(Result targetResult, Context context, Claim claim) {
397

    
398
        return generateInsertClaimContextQuery
399
                (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())
400
                        ,generateInsertContextQuery(context.getOpenaireId(), context.getTitle()),claim);
401
    }
402
    public  String generateInsertClaimContextQuery(String targetQuery,String sourceQuery, Claim claim) {
403

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

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

    
435
    }
436

    
437
    /**
438
     ** Create Tables Queries **
439
     **/
440

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

    
514
                ;
515

    
516
    }
517

    
518
    /**
519
     ** Select Queries *Old* Database **
520
     **/
521

    
522

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

    
527
    public String generateSelectConceptDMFClaimsQuery(Integer limit) {
528
        return " Select * from "+this.migrationTable+"  where ( type='dmf2actions' or type='updates2actions' ) and xml LIKE '%<oaf:concept%' "+(limit>0?" limit "+limit:"");
529
    }
530
    /**
531
     *
532
     * @param limit : for limit > 0 the query adds limit clause, for limit < 0 query skips limit clause
533
     * @return
534
     */
535
    public String generateSelectRelationEnrichedWithDMFClaimsQuery(Integer limit) {
536
        return " select rel.*, dmf.dmf from (Select * from "+this.migrationTable+"  where type='rels2actions' order by id) as rel left outer join \n" +
537
                        "(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 "+
538
                " order by rel.id "
539
                +(limit>0?" limit "+limit:"");
540

    
541
    }
542

    
543
    /**
544
     *
545
     * @param limit : for limit > 0 the query adds limit clause, for limit < 0 query skips limit clause
546
     * @return
547
     */
548
    public String generateSelectConceptClaimsEnrichedWithDMFClaimsQuery(Integer limit) {
549
        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" +
550
                "(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"
551
                +" order by rel.id "
552
                +(limit>0?" limit "+limit:"");
553

    
554
    }
555
    
556
    public String generateSelectConceptClaimByIDEnrichedWithDMFClaimsQuery(Integer limit, String claimID) {
557
        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" +
558
                "(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"
559
                +(limit>0?" limit "+limit:"");
560
    }
561
    public String generateSelectRelationClaimByIDEnrichedWithDMFClaimsQuery(Integer limit, String claimID) {
562
        return " select rel.*, dmf.dmf from (Select * from "+this.migrationTable+"   where id='"+claimID+"' and type='rels2actions' ) as rel left outer join \n" +
563
                "(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"
564
                +(limit>0?" limit "+limit:"");
565
    }
566

    
567

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

    
571
    }
572
    public  String generateSelectRelationClaimByIdQuery(String id) {
573
        return " Select * from "+this.migrationTable+"  where type='rels2actions' and id='"+id+"'";
574

    
575
    }
576

    
577

    
578
    /**
579
     ** Select - Fetch Queries *New* Database **
580
     **/
581

    
582

    
583
    private  String addPagingClause(Integer limit, Integer offset) {
584
        if(limit==null && offset==null){
585
            return "";
586
        }
587
        else if((limit==null || offset==null || offset <0 || limit<=0)){
588
            limit=10;
589
            offset=0;
590
        }
591
        return  " limit " + limit + " offset " + offset;
592

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

    
602
        }else if(orderBy.equals("source")){
603
            return  " order by source_title "+((desc)?"desc":"asc");
604

    
605
        }else if(orderBy.equals("target")){
606
            return  " order by target_title "+((desc)?"desc":"asc");
607

    
608
        }else{
609
            return  " order by claim.claim_date  desc";
610
        }
611
 
612
    }
613

    
614
    private  String addFilterByType( List<String> types, ArrayList<Object> params) {
615
        logger.debug(types);
616
        if(types == null || types.isEmpty() || (types.size() == 1 && types.get(0).isEmpty())){
617
            return null;
618
        }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) ){
619
            //it's all types - no need to filter
620
            return null;
621
        }
622
        else{
623
            String filter = "";
624
            for(String type: types){
625
                filter+=((filter.length()>0)?" or  ":"")+" claim.source_type = ? or claim.target_type = ?";
626
                params.add(type);
627
                params.add(type);
628
            }
629
            return filter;
630
        }
631
    }
632

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

    
675
    }
676
    public  String generateCountByResult(String resultId ,String  keyword, List<String> types, ArrayList<Object> params) {
677
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
678
            params.add(resultId);
679
            params.add(resultId);
680
            return " select count(*) from claim where "+" (  claim.source_id= ?  or  claim.target_id = ? )";
681
        }
682
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByResult(resultId, null,null,keyword,null,false,types, params)+")as claim )";
683

    
684
    }
685

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

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

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

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

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

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

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

    
766
    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) {
767
        String clause=  " claim.claim_date >= ?::timestamp and claim.claim_date <= ?::timestamp and source.openaire_id =? ";
768
        ArrayList<Object> clauseParams = new ArrayList<>();
769
        clauseParams.add(dateFrom);
770
        clauseParams.add(dateTo);
771
        clauseParams.add(openaireId);
772
        return generateSelectCountClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause, clauseParams,keyword,types, params);
773
    }
774

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

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

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

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

    
825

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

    
840
        return query;
841

    
842
    }
843

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

    
860
    private  String getClaimFields() {
861
        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 ";
862
    }
863
    private  String getResultFields(String tableAlias) {
864
        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 ";
865
    }
866
    private  String getProjectFields(String tableAlias) {
867
        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 ";
868
    }
869
    private  String getContextFields(String tableAlias) {
870
        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 ";
871
    }
872

    
873
    private  String getFieldsPerType(String type, String tableAlias){
874
        String fields= null;
875

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

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

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

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

    
951
                " ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause,whereParams,keyword, params)+" ) \nunion "+
952
//                " ( " +generateSelectclaimQuery(ClaimUtils.DATASET,ClaimUtils.DATASET,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
953
//                " ( " +generateSelectclaimQuery(ClaimUtils.SOFTWARE,ClaimUtils.SOFTWARE,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
954
//                " ( " +generateSelectclaimQuery(ClaimUtils.OTHER,ClaimUtils.OTHER,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
955
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
956
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause, whereParams, keyword, params)+" )" +
957

    
958
                ") as claim   ";
959
        String filterByType = addFilterByType(types, params);
960
         query += ((filterByType==null)?"":" where "+filterByType+" ")+
961
                ((orderByClause==null)?"":" "+orderByClause+" ")+
962
                pagingClause;
963

    
964
         return query;
965
    }
966
    private  String generateSelectCountClaimQueryAsUnionOfAllRelations(Integer limit,Integer offset,String orderBy, boolean desc,String specificWhereClause,ArrayList<Object> whereParams, String keyword,List<String> types, ArrayList<Object> params) {
967
        //TODO eliminate unions  based on the to
968
        // ClaimUtils.PUBLICATION or ClaimUtils.DATASET  it
969
        String orderByClause= addOrderByClause(orderBy,desc);
970
        String pagingClause= addPagingClause(limit,offset);
971
        String query = "select count(id) from ("+
972

    
973
                " ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause,whereParams,keyword, params)+" ) \nunion "+
974
                " ( " +generateSelectclaimQuery(ClaimUtils.DATASET,ClaimUtils.DATASET,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
975
                " ( " +generateSelectclaimQuery(ClaimUtils.SOFTWARE,ClaimUtils.SOFTWARE,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
976
                " ( " +generateSelectclaimQuery(ClaimUtils.OTHER,ClaimUtils.OTHER,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
977
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
978
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause, whereParams, keyword, params)+" )" +
979

    
980
                ") as claim   ";
981
        String filterByType = addFilterByType(types, params);
982
        query += ((filterByType==null)?"":" where "+filterByType+" ")+
983
                ((orderByClause==null)?"":" "+orderByClause+" ")+
984
                pagingClause;
985

    
986
        return query;
987
    }
988

    
989
    private  String getTypeForTable(String type){
990
        if(type == null){
991
            return null;
992
        }
993
        if(type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET) ||type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)){
994
            return "result";
995
        }else{
996
            return type;
997
        }
998
    }
999
    /**
1000
     ** Update - Queries *New* Database **
1001
     **/
1002

    
1003
    private  void updateResult(){
1004

    
1005
    }
1006
    private  void updateProject(){
1007

    
1008
    }
1009
    /**
1010
     ** Delete - Queries *New* Database **
1011
     **/
1012

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

    
1053
    public String  generateCountClaimsForResultQuery(String resultId){
1054
        return " Select count(*) from claim where source_id = '"+ resultId +"' or target_id = '"+resultId+"' ";
1055
    }
1056
    public String  generateSelectResultSource(String resultId){
1057
        return " Select collected_from from result where openaire_id = '"+ resultId +"' ";
1058
    }
1059

    
1060
    /**
1061
     * Select form a has_source_* or has_target_* table
1062
     * ...
1063
     * @param resultid
1064
     * @param claimId
1065
     * @param tableName
1066
     * @return
1067
     */
1068
    private String  generateSelectOthersFromRelationTableQuery(String resultid, String claimId , String tableName, ArrayList<Object> params){
1069
        params.add(resultid);
1070
        params.add(claimId);
1071
        String query =
1072
                " SELECT 1 FROM "+ tableName+"  WHERE openaire_id = ? and claim_id != ?::int " ;
1073
        return query;
1074
    }
1075
    public String  generateDeleteFullClaimQuery(String id, String user, String sourceType, String sourceId, String targetType, String targetId, ArrayList<Object> params){
1076
        //TODO generate delete query
1077
        params.add(id);
1078
        params.add(id);
1079
        params.add(id);
1080
        String query =
1081
                "BEGIN;\n" +
1082
                //delete has_source_*
1083
                "DELETE FROM "+ getSourceTableName(sourceType)+" WHERE   claim_id = ?::int ;\n" +
1084

    
1085
                //delete has_target_*
1086
                "DELETE FROM "+ getTargetTableName(targetType)+" WHERE  claim_id = ?::int ;\n" +
1087

    
1088
                //delete claim
1089
                "DELETE FROM claim where id = ?::int ;\n" +
1090

    
1091
                        //delete source
1092
                generateDeleteEntityQuery(sourceId,id,sourceType, params)+
1093

    
1094
                        //delete target
1095
                generateDeleteEntityQuery(targetId,id,targetType, params)+
1096
                "COMMIT";
1097
        return query;
1098
    }
1099
    public String  generateSelectClaimQuery(String id, String user, ArrayList<Object> params){
1100

    
1101
        params.add(id);
1102
        params.add(user);
1103
        String query =" ";
1104
        return " Select id, source_type, source_id, target_type, target_id from claim where id = ?::int and claimedBy = ? ";
1105
    }
1106

    
1107
    public String  generateSelectClaimQuery(String id, ArrayList<Object> params){
1108

    
1109
        params.add(id);
1110
        String query =" ";
1111
        return " Select id, source_type, source_id, target_type, target_id,claimedBy  from claim where id = ?::int";
1112
    }
1113
    /**
1114
     * used to fetch the information from DB
1115
     * @param ids
1116
     * @param users
1117
     * @return
1118
     */
1119
    public String  generateSelectClaimQuery(List<String> ids, List<String> users, ArrayList<Object> params){
1120

    
1121
        String query =" Select id, source_type, source_id, target_type, target_id from claim where ";
1122
        if(ids.size()>0 && users.size() > 0 && ids.size() == users.size()) {
1123
            for (int i = 0; i < ids.size(); i++) {
1124
                query+="  ( id = ? and claimedBy = ? ) or";
1125
                params.add(ids.get(i));
1126
                params.add(users.get(i));
1127
            }
1128
            query = query.substring(0, query.length()-2);
1129
            return query;
1130
        }
1131
        return null;
1132
    }
1133

    
1134
    public  String generateSelectFirstContextByCommunityIdQuery(String communityId, ArrayList<Object> params) {
1135
        params.add(communityId+"%");
1136
        return " Select " + getContextFields("context") + " from context where openaire_id like ? LIMIT 1;";
1137
    }
1138

    
1139
    public  String generateSelectProjectByIdQuery(String projectId, ArrayList<Object> params) {
1140
        params.add(projectId);
1141
        return " Select " + getProjectFields("project") + " from project where openaire_id = ?";
1142
    }
1143

    
1144
    public  String generateSelectContactEmailsByProjectIdQuery(String projectId, ArrayList<Object> params) {
1145
        params.add(projectId);
1146
        //return " SELECT contact_person FROM project WHERE openaire_id = ? ;";
1147
        return "SELECT DISTINCT unnest(contact_person) as contact_person FROM project WHERE openaire_id = ?;";
1148
    }
1149

    
1150
    public String generateSelectProjectIdsAndNamesByProjectManagerMail(String userMail, ArrayList<Object> params) {
1151
        params.add(userMail);
1152
        return "SELECT openaire_id, name FROM project WHERE ? = ANY (contact_person);";
1153
    }
1154

    
1155
    public String generateUpdateTokenByProjectId(String projectdId, String newToken, ArrayList<Object> params) {
1156
        params.add(newToken);
1157
        params.add(projectdId);
1158
        return "UPDATE project SET token = ? WHERE openaire_id = ?";
1159
    }
1160
    public String generateUpdateContactEmailsByProjectIdByProjectId(String projectdId, List<String> contactEmails, ArrayList<Object> params) {
1161
        String emails = "";
1162
        if(contactEmails != null && contactEmails.size() > 0){
1163
            //emails+="'{";
1164
            for(int i = 0; i< contactEmails.size(); i++){
1165

    
1166
                emails+=contactEmails.get(i)+((i < contactEmails.size() -1 )?",":"");
1167
                //params.add(contactEmails.get(i));
1168
            }
1169
            //emails+="}'";
1170
        }
1171

    
1172
        params.add(emails);
1173
        params.add(projectdId);
1174
        return "UPDATE project SET contact_person = string_to_array(?, ',') WHERE openaire_id = ?;";
1175
    }
1176

    
1177
    public String generateUpdateClaimCuration(String curatedBy, String claimId, boolean approved, ArrayList<Object> params) {
1178
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1179
        Date date = new Date();
1180
        String dateStr=null;
1181
        dateStr=(format.format(date));
1182

    
1183
        params.add(dateStr);
1184
        params.add(curatedBy);
1185
        params.add(approved);
1186
        params.add(claimId);
1187
        String query = "UPDATE claim "
1188
                + "SET curation_date = ?::timestamp, curated_by = ?, approved = ? "
1189
                + "WHERE id = ?::int";// RETURNING curation_date, curated_by, approved";
1190

    
1191
        logger.debug("Query to execute: "+query);
1192

    
1193
        return query;
1194
    }
1195

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

    
1198
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1199
        String dateStr=null;
1200
        dateStr=(format.format(date));
1201
        String fields="last_interaction_date, user_email, frequency, notify, openaire_id";
1202

    
1203
        String values="?::timestamp,?,?,?,?";
1204
        params.add(dateStr);
1205
        params.add(userMail);
1206
        params.add(frequency);
1207
        params.add(notify);
1208
        params.add(openaire_id);
1209

    
1210
        return "     INSERT INTO notification( "+fields+")\n" +
1211
                "    VALUES ( "+values+")\n" +
1212
                "    RETURNING openaire_id, user_email\n";
1213
    }
1214

    
1215
    public String generateUpdateNotificationPreferences(String openaire_id, String userMail, int frequency, boolean notify, ArrayList<Object> params) {
1216
        params.add(frequency);
1217
        params.add(notify);
1218
        params.add(userMail);
1219
        params.add(openaire_id);
1220
        String query = "UPDATE notification "
1221
                + "SET frequency = ?, notify = ? "
1222
                + "WHERE user_email = ? AND openaire_id = ?";// RETURNING curation_date, curated_by, approved";
1223

    
1224
        logger.debug("Query to execute: "+query);
1225

    
1226
        return query;
1227
    }
1228

    
1229
    public String generateUpdateNotificationLastInteractionDate(String openaire_id, String userMail, Date date, ArrayList<Object> params) {
1230
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1231
        String dateStr=null;
1232
        dateStr=(format.format(date));
1233

    
1234
        params.add(dateStr);
1235
        params.add(userMail);
1236
        params.add(openaire_id);
1237
        String query = "UPDATE notification "
1238
                + "SET last_interaction_date = ?::timestamp "
1239
                + "WHERE user_email = ? AND openaire_id = ?";// RETURNING curation_date, curated_by, approved";
1240

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

    
1243
        return query;
1244
    }
1245

    
1246
    public String generateSelectNotificationQuery(String openaire_id, String userMail, ArrayList<Object> params) {
1247
        params.add(userMail);
1248
        params.add(openaire_id);
1249
        String query = "SELECT * FROM notification WHERE user_email = ? AND openaire_id = ?";
1250

    
1251
        logger.debug("Query to execute: "+query);
1252

    
1253
        return query;
1254
    }
1255

    
1256
    public String generateSelectTrueNotificationsQuery() {
1257
        String query = "SELECT * FROM notification WHERE notify=true";
1258

    
1259
        logger.debug("Query to execute: "+query);
1260

    
1261
        return query;
1262
    }
1263

    
1264
    public String getMigrationTable() {
1265
        return migrationTable;
1266
    }
1267

    
1268
    public void setMigrationTable(String migrationTable) {
1269
        this.migrationTable = migrationTable;
1270
    }
1271
}
(8-8/9)