Project

General

Profile

1
package eu.dnetlib.data.claimsDemo;
2

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

    
5
import java.lang.reflect.Array;
6
import java.sql.Connection;
7
import java.text.SimpleDateFormat;
8
import java.util.ArrayList;
9
import java.util.Date;
10
import java.util.List;
11
import org.apache.log4j.Logger;
12

    
13

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

    
19
    public boolean isUpdateOnInsert() {
20
        return updateOnInsert;
21
    }
22

    
23
    public void setUpdateOnInsert(boolean updateOnInsert) {
24
        this.updateOnInsert = updateOnInsert;
25
    }
26

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

    
207
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
208
        String dateStr=null;
209
        dateStr=(format.format(date));
210
        String fields="claim_date,claimedBy,source_type,target_type, source_id, target_id";
211
        if(semantics!=null){
212
            fields+=",semantics";
213
        }
214
        String values="?::timestamp,?,?,?,?,?";
215
        params.add(dateStr);
216
        params.add(claimedBy);
217
        params.add(source_type);
218
        params.add(target_type);
219
        params.add(source_id);
220
        params.add(target_id);
221
        if(semantics!=null){
222
            values+=",?";
223
            params.add(semantics);
224
        }
225

    
226
        return "     INSERT INTO claim( "+fields+")\n" +
227
                "    VALUES ( "+values+")\n" +
228
                "    RETURNING id, source_id, target_id\n";
229
    }
230

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

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

    
279
        return query;
280
    }
281

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

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

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

    
363
        return semantics;
364
    }
365
   /* public  String generateInsertClaimResultQuery(Result targetResult, Result sourceResult, Claim claim) {
366

    
367
        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()),
368
                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);
369
    }
370
    public  String generateInsertClaimProjectQuery(String   targetQuery, String projectQuery, Claim claim) {
371

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

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

    
394
        return generateInsertClaimContextQuery
395
                (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())
396
                        ,generateInsertContextQuery(context.getOpenaireId(), context.getTitle()),claim);
397
    }
398
    public  String generateInsertClaimContextQuery(String targetQuery,String sourceQuery, Claim claim) {
399

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

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

    
431
    }
432

    
433
    /**
434
     ** Create Tables Queries **
435
     **/
436

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

    
509
                ;
510

    
511
    }
512

    
513
    /**
514
     ** Select Queries *Old* Database **
515
     **/
516

    
517

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

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

    
536
    }
537

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

    
549
    }
550
    
551
    public String generateSelectConceptClaimByIDEnrichedWithDMFClaimsQuery(Integer limit, String claimID) {
552
        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" +
553
                "(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"
554
                +(limit>0?" limit "+limit:"");
555
    }
556
    public String generateSelectRelationClaimByIDEnrichedWithDMFClaimsQuery(Integer limit, String claimID) {
557
        return " select rel.*, dmf.dmf from (Select * from "+this.migrationTable+"   where id='"+claimID+"' and type='rels2actions' ) 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

    
562

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

    
566
    }
567
    public  String generateSelectRelationClaimByIdQuery(String id) {
568
        return " Select * from "+this.migrationTable+"  where type='rels2actions' and id='"+id+"'";
569

    
570
    }
571

    
572

    
573
    /**
574
     ** Select - Fetch Queries *New* Database **
575
     **/
576

    
577

    
578
    private  String addPagingClause(Integer limit, Integer offset) {
579
        if(limit==null && offset==null){
580
            return "";
581
        }
582
        else if((limit==null || offset==null || offset <0 || limit<=0)){
583
            limit=10;
584
            offset=0;
585
        }
586
        return  " limit " + limit + " offset " + offset;
587

    
588
    }
589
    private  String addOrderByClause( String orderBy, boolean desc) {
590
        if(orderBy==null){
591
            return null;
592
        }else if(orderBy.equals("date")){
593
            return  " order by claim.claim_date "+((desc)?"desc":"asc");
594
        }else if(orderBy.equals("user")){
595
            return  " order by claim.claimedBy "+((desc)?"desc":"asc");
596

    
597
        }else if(orderBy.equals("source")){
598
            return  " order by claim.source_title "+((desc)?"desc":"asc");
599

    
600
        }else if(orderBy.equals("target")){
601
            return  " order by claim.target_title "+((desc)?"desc":"asc");
602

    
603
        }else{
604
            return  " order by claim.claim_date  desc";
605
        }
606
 
607
    }
608

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

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

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

    
678
    }
679

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

    
690
    }
691
    public  String generateFetchAllProjectsQuery() {
692
        return " select "+getProjectFields("source")+" from project as source";
693

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

    
705
    }
706
    /**
707
     *
708
     * @param limit how many results to return
709
     * @param offset starting from
710
     * @param keyword containing keyword
711
     * @return
712
     */
713

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

    
727
    }
728
     public  String generateFetchClaimsByDate(String dateFrom, String dateTo, Integer limit, Integer offset,String keyword, String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
729
         String clause=  " claim.claim_date >= ?::timestamp and claim.claim_date <= ?::timestamp ";
730
         ArrayList<Object> clauseParams = new ArrayList<>();
731
         clauseParams.add(dateFrom);
732
         clauseParams.add(dateTo);
733
          return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause, clauseParams,keyword,types, params);
734
    }
735

    
736
    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) {
737
        String clause=  " claim.claim_date >= ?::timestamp and claim.claim_date <= ?::timestamp and source.openaire_id =? ";
738
        ArrayList<Object> clauseParams = new ArrayList<>();
739
        clauseParams.add(dateFrom);
740
        clauseParams.add(dateTo);
741
        clauseParams.add(openaireId);
742
        return generateSelectCountClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause, clauseParams,keyword,types, params);
743
    }
744

    
745
    public  String generateFetchClaimsByProject(String projectId, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
746
        String clause = "source.openaire_id =?";
747
        ArrayList<Object> clauseParams = new ArrayList<>();
748
        clauseParams.add(projectId);
749
        String filterByType = addFilterByType(types, clauseParams);
750
        clause+= ((filterByType==null)?"":" and ("+filterByType+") ");
751
        String query = " select * from ("+" select * from ( " + generateSelectclaimQuery(ClaimUtils.PROJECT, ClaimUtils.PUBLICATION, limit, offset, orderBy, desc, clause, clauseParams, keyword, params) + " ) as claim  "+
752
                ") as claim ";
753

    
754
                return query;
755
    }
756
/*
757
    public  String generateFetchClaimsByProjectToken(String token, String email, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types) {
758
        String clause = "source.token = '" + token + "' and '" + email + "' = ANY(source.contact_person)";
759
        String filterByType = addFilterByType(types);
760
        return " select * from ("+" select * from ( " + generateSelectclaimQuery(ClaimUtils.PROJECT, ClaimUtils.PUBLICATION, limit, offset, orderBy, desc, clause, keyword) + " ) as claim  "+
761
                ") as claim "+
762
                ((filterByType==null)?"":" where "+filterByType+" ");
763
    }
764
*/
765
    public String generateSelectProjectIdByTokenAndEmailQuery(String token, String email, ArrayList<Object> params) {
766
        params.add(token);
767
        params.add(email);
768
        return "SELECT openaire_id FROM project WHERE token=? AND ?= ANY(contact_person);";
769
    }
770

    
771
    public String generateSelectProjectIdByTokenQuery(String token, ArrayList<Object> params) {
772
        params.add(token);
773
        return "SELECT openaire_id FROM project WHERE token=?;";
774
    }
775

    
776
    public  String generateFetchClaimsByContext(String contextId,  Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
777
        String clause=  "claim.source_id like ?";
778
        ArrayList<Object> clauseParams = new ArrayList<>();
779
        clauseParams.add(contextId+'%');
780
        String filterByType = addFilterByType(types, clauseParams);
781
        clause+= ((filterByType==null)?"":" and ("+filterByType+") ");
782
        String query = " select * from ("+" ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,limit, offset, orderBy,desc,clause,clauseParams, keyword, params)+")"+
783
                 ") as claim ";
784
        return query;
785
    }
786
    public  String generateFetchClaimsByFunder(String funderId, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
787
        String whereClause = "source_id =source.openaire_id ";
788
        ArrayList<Object> whereParams = new ArrayList<>();
789
        String filterByType = addFilterByType(types, whereParams);
790
        whereClause+= ((filterByType==null)?"":" and ("+filterByType+") ");
791
        String query = " select * from ("+" ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,whereClause,whereParams, keyword, params)+" )"+
792
                ") as claim ";
793

    
794

    
795
        return query;
796
    }
797
    public  String generateFetchClaimsByResult(String resultId,  Integer limit, Integer offset, String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
798
         String queryWhereClause=" ( source.openaire_id = ?  or target.openaire_id = ? )";
799
        ArrayList<Object> whereParams = new ArrayList<>();
800
         whereParams.add(resultId);
801
         whereParams.add(resultId);
802
        String filterByType = addFilterByType(types, whereParams);
803
        queryWhereClause+= ((filterByType==null)?"":" and ("+filterByType+") ");
804
        String query =  " select * from ("+" ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) \nunion "+
805
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) \nunion "+
806
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) "+
807
                ") as claim ";
808

    
809
        return query;
810

    
811
    }
812

    
813
    public  String generateFetchClaimsByClaimId(String claimId, String sourceType, String targetType, ArrayList<Object> params) {
814
        String keyword = null;
815
        String clause=  " claim.id = ?::int ";
816
        ArrayList<Object> clauseParams = new ArrayList<>();
817
        clauseParams.add(claimId);
818
        String orderbyLimitClause= null;
819
        if(sourceType.equals(ClaimUtils.PUBLICATION)||sourceType.equals(ClaimUtils.DATASET)||sourceType.equals(ClaimUtils.SOFTWARE)||sourceType.equals(ClaimUtils.OTHER)){
820
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
821
        }else if(sourceType.equals(ClaimUtils.PROJECT)){
822
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
823
        }else if(sourceType.equals(ClaimUtils.CONTEXT)){
824
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
825
        }
826
        return null;
827
    }
828

    
829
    private  String getClaimFields() {
830
        return " claim.id, claim.claim_date, claim.claimedBy, claim.source_type, claim.target_type, claim.semantics, claim.curation_date, claim.curated_by, claim.approved ";
831
    }
832
    private  String getResultFields(String tableAlias) {
833
        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  ";
834
    }
835
    private  String getProjectFields(String tableAlias) {
836
        return " "+tableAlias+".openaire_id, "+tableAlias+".name  as "+tableAlias+"_title, "+tableAlias+".acronym, "+tableAlias+".funder_id, "+tableAlias+".funder_name, null as field6, null as field7, null as field8, null as field9, null as field10 ";
837
    }
838
    private  String getContextFields(String tableAlias) {
839
        return " "+tableAlias+".openaire_id, "+tableAlias+".name  "+tableAlias+"_title, "+" null as field3, null as field4, null as field5, null as field6, null as field7, null as field8, null as field9, null as field10 ";
840
    }
841

    
842
    private  String getFieldsPerType(String type, String tableAlias){
843
        String fields= null;
844

    
845
        if (type != null) {
846
            if (type.equals(ClaimUtils.PUBLICATION) || type.equals(ClaimUtils.DATASET) || type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)) {
847
                fields = getResultFields(tableAlias);
848

    
849
            } else if (type.equals(ClaimUtils.PROJECT)) {
850
                fields = getProjectFields(tableAlias);
851

    
852
            } else if (type.equals(ClaimUtils.CONTEXT)) {
853
                fields = getContextFields(tableAlias);
854
            }
855
        }
856

    
857
        return fields;
858
    }
859
    //private  String generateSelectclaimQuery(String sourceType, String targetType, Integer limit,Integer offset,String orderBy, boolean desc,String whereClause, String keyword, ArrayList<Object> params) {
860
    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) {
861
        if(sourceType == null || targetType == null){
862
            return null;
863
        }
864
        /*
865
        " select "+getClaimFields()+" ,"+getFieldsPerType(sourceType, "source")+" , "+getFieldsPerType(targetType,"target")+
866
                " \nfrom claim, "+getTypeForTable(sourceType)+" as source, "+getTypeForTable(targetType)+" as target \n" +
867
                "where claim.source_id = source.openaire_id and claim.target_id = target.openaire_id "+((specificWhereClause==null)?"":" and "+specificWhereClause+" ");
868
         */
869
        String orderByClause= addOrderByClause(orderBy,desc);
870
        String pagingClause= addPagingClause(limit,offset);
871
        String query = " select "+getClaimFields()+" ,"+getFieldsPerType(sourceType, "source")+" , "+getFieldsPerType(targetType,"target")+
872
                " \nfrom claim, "+getTypeForTable(sourceType)+" as source, has_source_"+getTypeForTable(sourceType)+", has_target_"+getTypeForTable(targetType)+", "+getTypeForTable(targetType)+" as target \n" +
873
                "where claim.id =  has_source_"+getTypeForTable(sourceType)+".claim_id   and   has_source_"+getTypeForTable(sourceType)+".openaire_id = source.openaire_id " +
874
                "and claim.id =  has_target_"+getTypeForTable(targetType)+".claim_id   and   has_target_"+getTypeForTable(targetType)+".openaire_id  = target.openaire_id "+
875
                ((keyword==null)?"":(" and ("+getKeywordClauseForType(sourceType, "source", keyword, params)+" or "+getKeywordClauseForType(targetType, "target", keyword, params)+" ")+" or "+getKeywordClauseForClaim( keyword, params)+" )")+
876
                ((whereClause==null)?"":" and "+whereClause+" ")+
877
                ((orderByClause==null)?"":" "+orderByClause+" ")+
878
                pagingClause;
879
        if(whereParams != null && !whereParams.isEmpty()) {
880
            params.addAll(whereParams);
881
        }
882
        return query;
883
    }
884
    private String getKeywordClauseForType(String type,String tableAlias,String keyword, ArrayList<Object> params){
885
        if (type == null ||keyword == null){
886
            return "";
887
        }
888
        keyword=keyword.toLowerCase();
889
        if (type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET)||type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)){
890
            params.add("%" + keyword + "%");
891
            params.add("%" + keyword + "%");
892
            return "  (lower("+tableAlias+".title) like ? or lower("+tableAlias+".doi) like ?"+")";
893
        }else if (type.equals(ClaimUtils.PROJECT)){
894
            params.add("%" + keyword + "%");
895
            params.add("%" + keyword + "%");
896
            params.add("%" + keyword + "%");
897
            params.add("%" + keyword + "%");
898
            return "  (lower("+tableAlias+".name) like ? or lower("+tableAlias+".acronym) like ? or lower("+tableAlias+".funder_name) like ? or lower("+tableAlias+".funder_acronym) like ? "+")";
899
        }else if (type.equals(ClaimUtils.CONTEXT)){
900
            params.add("%" + keyword + "%");
901
            return "  (lower("+tableAlias+".name) like ? )";
902
        }
903
        return "";
904
    }
905
    private String getKeywordClauseForClaim(String keyword, ArrayList<Object> params){
906
        if (keyword == null){
907
            return "";
908
        }else {
909
            params.add("%" + keyword.toLowerCase() + "%");
910
            return " (lower(claim.claimedby) like ?)";
911
        }
912
     }
913
    private  String generateSelectClaimQueryAsUnionOfAllRelations(Integer limit,Integer offset,String orderBy, boolean desc,String specificWhereClause,ArrayList<Object> whereParams, String keyword,List<String> types, ArrayList<Object> params) {
914
        //TODO eliminate unions  based on the to
915
        // ClaimUtils.PUBLICATION or ClaimUtils.DATASET  it
916
        String orderByClause= addOrderByClause(orderBy,desc);
917
        String pagingClause= addPagingClause(limit,offset);
918
        String query = "select * from ("+
919

    
920
                " ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause,whereParams,keyword, params)+" ) \nunion "+
921
                " ( " +generateSelectclaimQuery(ClaimUtils.DATASET,ClaimUtils.DATASET,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
922
                " ( " +generateSelectclaimQuery(ClaimUtils.SOFTWARE,ClaimUtils.SOFTWARE,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
923
                " ( " +generateSelectclaimQuery(ClaimUtils.OTHER,ClaimUtils.OTHER,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
924
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
925
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause, whereParams, keyword, params)+" )" +
926

    
927
                ") as claim   ";
928
        String filterByType = addFilterByType(types, params);
929
         query += ((filterByType==null)?"":" where "+filterByType+" ")+
930
                ((orderByClause==null)?"":" "+orderByClause+" ")+
931
                pagingClause;
932

    
933
         return query;
934
    }
935
    private  String generateSelectCountClaimQueryAsUnionOfAllRelations(Integer limit,Integer offset,String orderBy, boolean desc,String specificWhereClause,ArrayList<Object> whereParams, String keyword,List<String> types, ArrayList<Object> params) {
936
        //TODO eliminate unions  based on the to
937
        // ClaimUtils.PUBLICATION or ClaimUtils.DATASET  it
938
        String orderByClause= addOrderByClause(orderBy,desc);
939
        String pagingClause= addPagingClause(limit,offset);
940
        String query = "select count(id) from ("+
941

    
942
                " ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause,whereParams,keyword, params)+" ) \nunion "+
943
                " ( " +generateSelectclaimQuery(ClaimUtils.DATASET,ClaimUtils.DATASET,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
944
                " ( " +generateSelectclaimQuery(ClaimUtils.SOFTWARE,ClaimUtils.SOFTWARE,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
945
                " ( " +generateSelectclaimQuery(ClaimUtils.OTHER,ClaimUtils.OTHER,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
946
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
947
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause, whereParams, keyword, params)+" )" +
948

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

    
955
        return query;
956
    }
957

    
958
    private  String getTypeForTable(String type){
959
        if(type == null){
960
            return null;
961
        }
962
        if(type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET) ||type.equals(ClaimUtils.SOFTWARE)||type.equals(ClaimUtils.OTHER)){
963
            return "result";
964
        }else{
965
            return type;
966
        }
967
    }
968
    /**
969
     ** Update - Queries *New* Database **
970
     **/
971

    
972
    private  void updateResult(){
973

    
974
    }
975
    private  void updateProject(){
976

    
977
    }
978
    /**
979
     ** Delete - Queries *New* Database **
980
     **/
981

    
982
    private String generateDeleteEntityQuery(String resultid, String claimId, String type, ArrayList<Object> params){
983
        if(type == null||resultid == null||claimId ==  null ){
984
            return null;
985
        }
986
        String query = null;
987
        if(type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET) ||type.equals(ClaimUtils.SOFTWARE) ||type.equals(ClaimUtils.OTHER)){
988
            query = generateDeleteResultQuery(resultid,claimId, params);
989
        }else if(type.equals(ClaimUtils.PROJECT)){
990
            query = generateDeleteProjectQuery(resultid,claimId, params);
991
        }else if (type.equals(ClaimUtils.CONTEXT)){
992
            query = generateDeleteContextQuery(resultid,claimId, params);
993
        }
994
        return query;
995
    }
996
/*
997
    Before delete check a Result, Project, Context
998
    check if there is another claim in  has_source_* or has_target_* relation
999
    for the entity
1000
 */
1001
    private String generateDeleteResultQuery(String resultid, String claimId, ArrayList<Object> params){
1002
        params.add(resultid);
1003
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.PUBLICATION)+" WHERE  openaire_id = ? and NOT EXISTS \n" +
1004
                "   (   " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.PUBLICATION), params) + " union " +
1005
                generateSelectOthersFromRelationTableQuery(resultid,claimId,getTargetTableName(ClaimUtils.PUBLICATION), params)+"  ) ;\n" ;
1006
        return query;
1007
    }
1008
    private String generateDeleteProjectQuery(String resultid, String claimId, ArrayList<Object> params){
1009
        params.add(resultid);
1010
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.PROJECT)+" WHERE openaire_id = ? and NOT EXISTS \n" +
1011
                "  (    " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.PROJECT), params) + " union " +
1012
                generateSelectOthersFromRelationTableQuery(resultid,claimId,getTargetTableName(ClaimUtils.PROJECT), params)+"  ) ;\n" ;
1013
        return query;
1014
    }
1015
    private String generateDeleteContextQuery(String resultid, String claimId, ArrayList<Object> params){
1016
        params.add(resultid);
1017
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.CONTEXT)+" WHERE openaire_id = ? and NOT EXISTS \n" +
1018
                " (  " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.CONTEXT), params) +"  ) ;\n" ;
1019
        return query;
1020
    }
1021

    
1022
    public String  generateCountClaimsForResultQuery(String resultId){
1023
        return " Select count(*) from claim where source_id = '"+ resultId +"' or target_id = '"+resultId+"' ";
1024
    }
1025
    public String  generateSelectResultSource(String resultId){
1026
        return " Select collected_from from result where openaire_id = '"+ resultId +"' ";
1027
    }
1028

    
1029
    /**
1030
     * Select form a has_source_* or has_target_* table
1031
     * ...
1032
     * @param resultid
1033
     * @param claimId
1034
     * @param tableName
1035
     * @return
1036
     */
1037
    private String  generateSelectOthersFromRelationTableQuery(String resultid, String claimId , String tableName, ArrayList<Object> params){
1038
        params.add(resultid);
1039
        params.add(claimId);
1040
        String query =
1041
                " SELECT 1 FROM "+ tableName+"  WHERE openaire_id = ? and claim_id != ?::int " ;
1042
        return query;
1043
    }
1044
    public String  generateDeleteFullClaimQuery(String id, String user, String sourceType, String sourceId, String targetType, String targetId, ArrayList<Object> params){
1045
        //TODO generate delete query
1046
        params.add(id);
1047
        params.add(id);
1048
        params.add(id);
1049
        String query =
1050
                "BEGIN;\n" +
1051
                //delete has_source_*
1052
                "DELETE FROM "+ getSourceTableName(sourceType)+" WHERE   claim_id = ?::int ;\n" +
1053

    
1054
                //delete has_target_*
1055
                "DELETE FROM "+ getTargetTableName(targetType)+" WHERE  claim_id = ?::int ;\n" +
1056

    
1057
                //delete claim
1058
                "DELETE FROM claim where id = ?::int ;\n" +
1059

    
1060
                        //delete source
1061
                generateDeleteEntityQuery(sourceId,id,sourceType, params)+
1062

    
1063
                        //delete target
1064
                generateDeleteEntityQuery(targetId,id,targetType, params)+
1065
                "COMMIT";
1066
        return query;
1067
    }
1068
    public String  generateSelectClaimQuery(String id, String user, ArrayList<Object> params){
1069

    
1070
        params.add(id);
1071
        params.add(user);
1072
        String query =" ";
1073
        return " Select id, source_type, source_id, target_type, target_id from claim where id = ?::int and claimedBy = ? ";
1074
    }
1075

    
1076
    public String  generateSelectClaimQuery(String id, ArrayList<Object> params){
1077

    
1078
        params.add(id);
1079
        String query =" ";
1080
        return " Select id, source_type, source_id, target_type, target_id,claimedBy  from claim where id = ?::int";
1081
    }
1082
    /**
1083
     * used to fetch the information from DB
1084
     * @param ids
1085
     * @param users
1086
     * @return
1087
     */
1088
    public String  generateSelectClaimQuery(List<String> ids, List<String> users, ArrayList<Object> params){
1089

    
1090
        String query =" Select id, source_type, source_id, target_type, target_id from claim where ";
1091
        if(ids.size()>0 && users.size() > 0 && ids.size() == users.size()) {
1092
            for (int i = 0; i < ids.size(); i++) {
1093
                query+="  ( id = ? and claimedBy = ? ) or";
1094
                params.add(ids.get(i));
1095
                params.add(users.get(i));
1096
            }
1097
            query = query.substring(0, query.length()-2);
1098
            return query;
1099
        }
1100
        return null;
1101
    }
1102

    
1103
    public  String generateSelectFirstContextByCommunityIdQuery(String communityId, ArrayList<Object> params) {
1104
        params.add(communityId+"%");
1105
        return " Select " + getContextFields("context") + " from context where openaire_id like '?' LIMIT 1";
1106
    }
1107

    
1108
    public  String generateSelectProjectByIdQuery(String projectId, ArrayList<Object> params) {
1109
        params.add(projectId);
1110
        return " Select " + getProjectFields("project") + " from project where openaire_id = ?";
1111
    }
1112

    
1113
    public  String generateSelectContactEmailsByProjectIdQuery(String projectId, ArrayList<Object> params) {
1114
        params.add(projectId);
1115
        //return " SELECT contact_person FROM project WHERE openaire_id = ? ;";
1116
        return "SELECT DISTINCT unnest(contact_person) as contact_person FROM project WHERE openaire_id = ?;";
1117
    }
1118

    
1119
    public String generateSelectProjectIdsAndNamesByProjectManagerMail(String userMail, ArrayList<Object> params) {
1120
        params.add(userMail);
1121
        return "SELECT openaire_id, name FROM project WHERE ? = ANY (contact_person);";
1122
    }
1123

    
1124
    public String generateUpdateTokenByProjectId(String projectdId, String newToken, ArrayList<Object> params) {
1125
        params.add(newToken);
1126
        params.add(projectdId);
1127
        return "UPDATE project SET token = ? WHERE openaire_id = ?";
1128
    }
1129
    public String generateUpdateContactEmailsByProjectIdByProjectId(String projectdId, List<String> contactEmails, ArrayList<Object> params) {
1130
        String emails = "";
1131
        if(contactEmails != null && contactEmails.size() > 0){
1132
            //emails+="'{";
1133
            for(int i = 0; i< contactEmails.size(); i++){
1134

    
1135
                emails+=contactEmails.get(i)+((i < contactEmails.size() -1 )?",":"");
1136
                //params.add(contactEmails.get(i));
1137
            }
1138
            //emails+="}'";
1139
        }
1140

    
1141
        params.add(emails);
1142
        params.add(projectdId);
1143
        return "UPDATE project SET contact_person = string_to_array(?, ',') WHERE openaire_id = ?;";
1144
    }
1145

    
1146
    public String generateUpdateClaimCuration(String curatedBy, String claimId, boolean approved, ArrayList<Object> params) {
1147
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1148
        Date date = new Date();
1149
        String dateStr=null;
1150
        dateStr=(format.format(date));
1151

    
1152
        params.add(dateStr);
1153
        params.add(curatedBy);
1154
        params.add(approved);
1155
        params.add(claimId);
1156
        String query = "UPDATE claim "
1157
                + "SET curation_date = ?::timestamp, curated_by = ?, approved = ? "
1158
                + "WHERE id = ?::int";// RETURNING curation_date, curated_by, approved";
1159

    
1160
        logger.debug("Query to execute: "+query);
1161

    
1162
        return query;
1163
    }
1164

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

    
1167
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1168
        String dateStr=null;
1169
        dateStr=(format.format(date));
1170
        String fields="last_interaction_date, user_email, frequency, notify, openaire_id";
1171

    
1172
        String values="?::timestamp,?,?,?,?";
1173
        params.add(dateStr);
1174
        params.add(userMail);
1175
        params.add(frequency);
1176
        params.add(notify);
1177
        params.add(openaire_id);
1178

    
1179
        return "     INSERT INTO notification( "+fields+")\n" +
1180
                "    VALUES ( "+values+")\n" +
1181
                "    RETURNING openaire_id, user_email\n";
1182
    }
1183

    
1184
    public String generateUpdateNotificationPreferences(String openaire_id, String userMail, int frequency, boolean notify, ArrayList<Object> params) {
1185
        params.add(frequency);
1186
        params.add(notify);
1187
        params.add(userMail);
1188
        params.add(openaire_id);
1189
        String query = "UPDATE notification "
1190
                + "SET frequency = ?, notify = ? "
1191
                + "WHERE user_email = ? AND openaire_id = ?";// RETURNING curation_date, curated_by, approved";
1192

    
1193
        logger.debug("Query to execute: "+query);
1194

    
1195
        return query;
1196
    }
1197

    
1198
    public String generateUpdateNotificationLastInteractionDate(String openaire_id, String userMail, Date date, ArrayList<Object> params) {
1199
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1200
        String dateStr=null;
1201
        dateStr=(format.format(date));
1202

    
1203
        params.add(dateStr);
1204
        params.add(userMail);
1205
        params.add(openaire_id);
1206
        String query = "UPDATE notification "
1207
                + "SET last_interaction_date = ?::timestamp "
1208
                + "WHERE user_email = ? AND openaire_id = ?";// RETURNING curation_date, curated_by, approved";
1209

    
1210
        logger.debug("Query to execute: "+query);
1211

    
1212
        return query;
1213
    }
1214

    
1215
    public String generateSelectNotificationQuery(String openaire_id, String userMail, ArrayList<Object> params) {
1216
        params.add(userMail);
1217
        params.add(openaire_id);
1218
        String query = "SELECT * FROM notification WHERE user_email = ? AND openaire_id = ?";
1219

    
1220
        logger.debug("Query to execute: "+query);
1221

    
1222
        return query;
1223
    }
1224

    
1225
    public String generateSelectTrueNotificationsQuery() {
1226
        String query = "SELECT * FROM notification WHERE notify=true";
1227

    
1228
        logger.debug("Query to execute: "+query);
1229

    
1230
        return query;
1231
    }
1232

    
1233
    public String getMigrationTable() {
1234
        return migrationTable;
1235
    }
1236

    
1237
    public void setMigrationTable(String migrationTable) {
1238
        this.migrationTable = migrationTable;
1239
    }
1240
}
(4-4/9)