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.text.SimpleDateFormat;
7
import java.util.ArrayList;
8
import java.util.Date;
9
import java.util.List;
10
import org.apache.log4j.Logger;
11

    
12

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

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

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

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

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

    
222
        return "     INSERT INTO claim( "+fields+")\n" +
223
                "    VALUES ( "+values+")\n" +
224
                "    RETURNING id, source_id, target_id\n";
225
    }
226

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

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

    
275
        return query;
276
    }
277

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

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

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

    
359
        return semantics;
360
    }
361
   /* public  String generateInsertClaimResultQuery(Result targetResult, Result sourceResult, Claim claim) {
362

    
363
        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()),
364
                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);
365
    }
366
    public  String generateInsertClaimProjectQuery(String   targetQuery, String projectQuery, Claim claim) {
367

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

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

    
390
        return generateInsertClaimContextQuery
391
                (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())
392
                        ,generateInsertContextQuery(context.getOpenaireId(), context.getTitle()),claim);
393
    }
394
    public  String generateInsertClaimContextQuery(String targetQuery,String sourceQuery, Claim claim) {
395

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

    
414
    public String generateDeleteClaimTablesQuery() {
415
        return "drop table  if exists has_source_context;\n" +
416
                "drop table if exists has_source_project;\n" +
417
                "drop table if exists has_source_result;\n" +
418
                "drop table if exists has_target_project;\n" +
419
                "drop table if exists has_target_result;\n" +
420
                "drop table if exists claim;\n" +
421
                "drop table if exists project;\n" +
422
                "drop table if exists result;\n" +
423
                "drop table if exists context;\n" +
424
                "\n ";
425

    
426
    }
427

    
428
    /**
429
     ** Create Tables Queries **
430
     **/
431

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

    
501
                ;
502

    
503
    }
504

    
505
    /**
506
     ** Select Queries *Old* Database **
507
     **/
508

    
509

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

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

    
528
    }
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 generateSelectConceptClaimsEnrichedWithDMFClaimsQuery(Integer limit) {
536
        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" +
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
    public String generateSelectConceptClaimByIDEnrichedWithDMFClaimsQuery(Integer limit, String claimID) {
544
        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" +
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
                +(limit>0?" limit "+limit:"");
547
    }
548
    public String generateSelectRelationClaimByIDEnrichedWithDMFClaimsQuery(Integer limit, String claimID) {
549
        return " select rel.*, dmf.dmf from (Select * from "+this.migrationTable+"   where id='"+claimID+"' and type='rels2actions' ) 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
                +(limit>0?" limit "+limit:"");
552
    }
553

    
554

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

    
558
    }
559
    public  String generateSelectRelationClaimByIdQuery(String id) {
560
        return " Select * from "+this.migrationTable+"  where type='rels2actions' and id='"+id+"'";
561

    
562
    }
563

    
564

    
565
    /**
566
     ** Select - Fetch Queries *New* Database **
567
     **/
568

    
569

    
570
    private  String addPagingClause(Integer limit, Integer offset) {
571
        if(limit==null && offset==null){
572
            return "";
573
        }
574
        else if((limit==null || offset==null || offset <0 || limit<=0)){
575
            limit=10;
576
            offset=0;
577
        }
578
        return  " limit " + limit + " offset " + offset;
579

    
580
    }
581
    private  String addOrderByClause( String orderBy, boolean desc) {
582
        if(orderBy==null){
583
            return null;
584
        }else if(orderBy.equals("date")){
585
            return  " order by claim.claim_date "+((desc)?"desc":"asc");
586
        }else if(orderBy.equals("user")){
587
            return  " order by claim.claimedBy "+((desc)?"desc":"asc");
588

    
589
        }else if(orderBy.equals("source")){
590
            return  " order by claim.source_title "+((desc)?"desc":"asc");
591

    
592
        }else if(orderBy.equals("target")){
593
            return  " order by claim.target_title "+((desc)?"desc":"asc");
594

    
595
        }else{
596
            return  " order by claim.claim_date  desc";
597
        }
598
 
599
    }
600

    
601
    private  String addFilterByType( List<String> types, ArrayList<Object> params) {
602
        logger.debug(types);
603
        if(types == null || types.isEmpty() || (types.size() == 1 && types.get(0).isEmpty())){
604
            return null;
605
        }else if (types.contains(ClaimUtils.PUBLICATION) && types.contains(ClaimUtils.DATASET) && types.contains(ClaimUtils.SOFTWARE) && types.contains(ClaimUtils.PROJECT) && types.contains(ClaimUtils.CONTEXT) ){
606
            //it's all types - no need to filter
607
            return null;
608
        }
609
        else{
610
            String filter = "";
611
            for(String type: types){
612
                filter+=((filter.length()>0)?" or  ":"")+" claim.source_type = ? or claim.target_type = ?";
613
                params.add(type);
614
                params.add(type);
615
            }
616
            return filter;
617
        }
618
    }
619

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

    
661
    }
662
    public  String generateCountByResult(String resultId ,String  keyword, List<String> types, ArrayList<Object> params) {
663
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
664
            params.add(resultId);
665
            params.add(resultId);
666
            return " select count(*) from claim where "+" (  claim.source_id= ?  or  claim.target_id = ? )";
667
        }
668
        return " select count(*) from claim where  claim.id in ( select claim.id from ("+generateFetchClaimsByResult(resultId, null,null,keyword,null,false,types, params)+")as claim )";
669

    
670
    }
671

    
672
    public  String generateCountAllClaims(String keyword,List<String> types, ArrayList<Object> params) {
673
        if((keyword == null || keyword.equals(""))&&types.isEmpty()){
674
            String filterByType = addFilterByType(types, params);
675
            //if(filterByType!= null){
676
            //    params.add(filterByType);
677
            //}
678
            return "select count(*) from claim "+((filterByType==null)?"":" where " + filterByType);
679
        }
680
        return " select count(*) from claim where claim.id in ( select claim.id from ("+generateFetchClaims(null,null,keyword,null,false,types, params)+" ) as claim )";
681

    
682
    }
683
    public  String generateFetchAllProjectsQuery() {
684
        return " select "+getProjectFields("source")+" from project as source";
685

    
686
    }
687
    public  String generateFetchAllContextsQuery() {
688
        return " select "+getContextFields("source")+" from context as source";
689
    }
690
    public  String generateFetchClaimsByUser(String user, Integer limit, Integer offset,String keyword,String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
691
        // "claim.claim_date", true
692
        String clause=  " claim.claimedBy=?";
693
        ArrayList<Object> clauseParams = new ArrayList<>();
694
        clauseParams.add(user);
695
        return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause,clauseParams, keyword, types, params);
696

    
697
    }
698
    /**
699
     *
700
     * @param limit how many results to return
701
     * @param offset starting from
702
     * @param keyword containing keyword
703
     * @return
704
     */
705

    
706
    public  String generateFetchClaims(Integer limit, Integer offset,String keyword,String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
707
        return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,null,null, keyword, types, params)+"";
708
    }
709
    /**
710
     *
711
     * @param limit how many results to return
712
     * @param offset starting from
713
     * @return
714
     */
715
     public  String generateFetchClaims(Integer limit, Integer offset, String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
716
         String keyword = null;
717
        return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,null,null,keyword,types, params)+"";
718

    
719
    }
720
     public  String generateFetchClaimsByDate(String dateFrom, String dateTo, Integer limit, Integer offset,String keyword, String orderBy, boolean desc,List<String> types, ArrayList<Object> params) {
721
         String clause=  " claim.claim_date >= ?::timestamp and claim.claim_date <= ?::timestamp ";
722
         ArrayList<Object> clauseParams = new ArrayList<>();
723
         clauseParams.add(dateFrom);
724
         clauseParams.add(dateTo);
725
          return generateSelectClaimQueryAsUnionOfAllRelations(limit, offset, orderBy,desc,clause, clauseParams,keyword,types, params);
726
    }
727
    public  String generateFetchClaimsByProject(String projectId, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
728
        String clause = "source.openaire_id =?";
729
        ArrayList<Object> clauseParams = new ArrayList<>();
730
        clauseParams.add(projectId);
731
        String filterByType = addFilterByType(types, clauseParams);
732
        clause+= ((filterByType==null)?"":" and ("+filterByType+") ");
733
        String query = " select * from ("+" select * from ( " + generateSelectclaimQuery(ClaimUtils.PROJECT, ClaimUtils.PUBLICATION, limit, offset, orderBy, desc, clause, clauseParams, keyword, params) + " ) as claim  "+
734
                ") as claim ";
735

    
736
                return query;
737
    }
738
/*
739
    public  String generateFetchClaimsByProjectToken(String token, String email, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types) {
740
        String clause = "source.token = '" + token + "' and '" + email + "' = ANY(source.contact_person)";
741
        String filterByType = addFilterByType(types);
742
        return " select * from ("+" select * from ( " + generateSelectclaimQuery(ClaimUtils.PROJECT, ClaimUtils.PUBLICATION, limit, offset, orderBy, desc, clause, keyword) + " ) as claim  "+
743
                ") as claim "+
744
                ((filterByType==null)?"":" where "+filterByType+" ");
745
    }
746
*/
747
    public String generateSelectProjectIdByTokenQuery(String token, String email, ArrayList<Object> params) {
748
        params.add(token);
749
        params.add(email);
750
        return "SELECT openaire_id FROM project WHERE token=? AND ?= ANY(contact_person);";
751
    }
752

    
753
    public  String generateFetchClaimsByContext(String contextId,  Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
754
        String clause=  "claim.source_id like ?";
755
        ArrayList<Object> clauseParams = new ArrayList<>();
756
        clauseParams.add(contextId+'%');
757
        String filterByType = addFilterByType(types, clauseParams);
758
        clause+= ((filterByType==null)?"":" and ("+filterByType+") ");
759
        String query = " select * from ("+" ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,limit, offset, orderBy,desc,clause,clauseParams, keyword, params)+")"+
760
                 ") as claim ";
761
        return query;
762
    }
763
    public  String generateFetchClaimsByFunder(String funderId, Integer limit, Integer offset,String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
764
        String whereClause = "source_id =source.openaire_id ";
765
        ArrayList<Object> whereParams = new ArrayList<>();
766
        String filterByType = addFilterByType(types, whereParams);
767
        whereClause+= ((filterByType==null)?"":" and ("+filterByType+") ");
768
        String query = " select * from ("+" ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,whereClause,whereParams, keyword, params)+" )"+
769
                ") as claim ";
770

    
771

    
772
        return query;
773
    }
774
    public  String generateFetchClaimsByResult(String resultId,  Integer limit, Integer offset, String keyword, String orderBy, boolean desc, List<String> types, ArrayList<Object> params) {
775
         String queryWhereClause=" ( source.openaire_id = ?  or target.openaire_id = ? )";
776
        ArrayList<Object> whereParams = new ArrayList<>();
777
         whereParams.add(resultId);
778
         whereParams.add(resultId);
779
        String filterByType = addFilterByType(types, whereParams);
780
        queryWhereClause+= ((filterByType==null)?"":" and ("+filterByType+") ");
781
        String query =  " select * from ("+" ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) \nunion "+
782
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) \nunion "+
783
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION, limit, offset, orderBy,desc,queryWhereClause,whereParams, keyword, params)+" ) "+
784
                ") as claim ";
785

    
786
        return query;
787

    
788
    }
789

    
790
    public  String generateFetchClaimsByClaimId(String claimId, String sourceType, String targetType, ArrayList<Object> params) {
791
        String keyword = null;
792
        String clause=  " claim.id = ?::int ";
793
        ArrayList<Object> clauseParams = new ArrayList<>();
794
        clauseParams.add(claimId);
795
        String orderbyLimitClause= null;
796
        if(sourceType.equals(ClaimUtils.PUBLICATION)||sourceType.equals(ClaimUtils.DATASET)||sourceType.equals(ClaimUtils.SOFTWARE)){
797
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
798
        }else if(sourceType.equals(ClaimUtils.PROJECT)){
799
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
800
        }else if(sourceType.equals(ClaimUtils.CONTEXT)){
801
            return generateSelectclaimQuery(sourceType,targetType,null,null,null,false, clause,clauseParams,keyword, params);
802
        }
803
        return null;
804
    }
805

    
806
    private  String getClaimFields() {
807
        return " claim.id, claim.claim_date, claim.claimedBy, claim.source_type, claim.target_type, claim.semantics, claim.curation_date, claim.curated_by, claim.approved ";
808
    }
809
    private  String getResultFields(String tableAlias) {
810
        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  ";
811
    }
812
    private  String getProjectFields(String tableAlias) {
813
        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 ";
814
    }
815
    private  String getContextFields(String tableAlias) {
816
        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 ";
817
    }
818

    
819
    private  String getFieldsPerType(String type, String tableAlias){
820
        String fields= null;
821

    
822
        if (type != null) {
823
            if (type.equals(ClaimUtils.PUBLICATION) || type.equals(ClaimUtils.DATASET) || type.equals(ClaimUtils.SOFTWARE)) {
824
                fields = getResultFields(tableAlias);
825

    
826
            } else if (type.equals(ClaimUtils.PROJECT)) {
827
                fields = getProjectFields(tableAlias);
828

    
829
            } else if (type.equals(ClaimUtils.CONTEXT)) {
830
                fields = getContextFields(tableAlias);
831
            }
832
        }
833

    
834
        return fields;
835
    }
836
    //private  String generateSelectclaimQuery(String sourceType, String targetType, Integer limit,Integer offset,String orderBy, boolean desc,String whereClause, String keyword, ArrayList<Object> params) {
837
    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) {
838
        if(sourceType == null || targetType == null){
839
            return null;
840
        }
841
        /*
842
        " select "+getClaimFields()+" ,"+getFieldsPerType(sourceType, "source")+" , "+getFieldsPerType(targetType,"target")+
843
                " \nfrom claim, "+getTypeForTable(sourceType)+" as source, "+getTypeForTable(targetType)+" as target \n" +
844
                "where claim.source_id = source.openaire_id and claim.target_id = target.openaire_id "+((specificWhereClause==null)?"":" and "+specificWhereClause+" ");
845
         */
846
        String orderByClause= addOrderByClause(orderBy,desc);
847
        String pagingClause= addPagingClause(limit,offset);
848
        String query = " select "+getClaimFields()+" ,"+getFieldsPerType(sourceType, "source")+" , "+getFieldsPerType(targetType,"target")+
849
                " \nfrom claim, "+getTypeForTable(sourceType)+" as source, has_source_"+getTypeForTable(sourceType)+", has_target_"+getTypeForTable(targetType)+", "+getTypeForTable(targetType)+" as target \n" +
850
                "where claim.id =  has_source_"+getTypeForTable(sourceType)+".claim_id   and   has_source_"+getTypeForTable(sourceType)+".openaire_id = source.openaire_id " +
851
                "and claim.id =  has_target_"+getTypeForTable(targetType)+".claim_id   and   has_target_"+getTypeForTable(targetType)+".openaire_id  = target.openaire_id "+
852
                ((keyword==null)?"":(" and ("+getKeywordClauseForType(sourceType, "source", keyword, params)+" or "+getKeywordClauseForType(targetType, "target", keyword, params)+" ")+" or "+getKeywordClauseForClaim( keyword, params)+" )")+
853
                ((whereClause==null)?"":" and "+whereClause+" ")+
854
                ((orderByClause==null)?"":" "+orderByClause+" ")+
855
                pagingClause;
856
        if(whereParams != null && !whereParams.isEmpty()) {
857
            params.addAll(whereParams);
858
        }
859
        return query;
860
    }
861
    private String getKeywordClauseForType(String type,String tableAlias,String keyword, ArrayList<Object> params){
862
        if (type == null ||keyword == null){
863
            return "";
864
        }
865
        keyword=keyword.toLowerCase();
866
        if (type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET)||type.equals(ClaimUtils.SOFTWARE)){
867
            params.add("%" + keyword + "%");
868
            params.add("%" + keyword + "%");
869
            return "  (lower("+tableAlias+".title) like ? or lower("+tableAlias+".doi) like ?"+")";
870
        }else if (type.equals(ClaimUtils.PROJECT)){
871
            params.add("%" + keyword + "%");
872
            params.add("%" + keyword + "%");
873
            params.add("%" + keyword + "%");
874
            params.add("%" + keyword + "%");
875
            return "  (lower("+tableAlias+".name) like ? or lower("+tableAlias+".acronym) like ? or lower("+tableAlias+".funder_name) like ? or lower("+tableAlias+".funder_acronym) like ? "+")";
876
        }else if (type.equals(ClaimUtils.CONTEXT)){
877
            params.add("%" + keyword + "%");
878
            return "  (lower("+tableAlias+".name) like ? )";
879
        }
880
        return "";
881
    }
882
    private String getKeywordClauseForClaim(String keyword, ArrayList<Object> params){
883
        if (keyword == null){
884
            return "";
885
        }else {
886
            params.add("%" + keyword.toLowerCase() + "%");
887
            return " (lower(claim.claimedby) like ?)";
888
        }
889
     }
890
    private  String generateSelectClaimQueryAsUnionOfAllRelations(Integer limit,Integer offset,String orderBy, boolean desc,String specificWhereClause,ArrayList<Object> whereParams, String keyword,List<String> types, ArrayList<Object> params) {
891
        //TODO eliminate unions  based on the to
892
        // ClaimUtils.PUBLICATION or ClaimUtils.DATASET  it
893
        String orderByClause= addOrderByClause(orderBy,desc);
894
        String pagingClause= addPagingClause(limit,offset);
895
        String query = "select * from ("+
896

    
897
                " ( " +generateSelectclaimQuery(ClaimUtils.PUBLICATION,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause,whereParams,keyword, params)+" ) \nunion "+
898
                " ( " +generateSelectclaimQuery(ClaimUtils.DATASET,ClaimUtils.DATASET,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
899
                " ( " +generateSelectclaimQuery(ClaimUtils.SOFTWARE,ClaimUtils.SOFTWARE,null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
900
                " ( " +generateSelectclaimQuery(ClaimUtils.PROJECT,ClaimUtils.PUBLICATION, null,null,null,false, specificWhereClause, whereParams,keyword, params)+" ) \nunion "+
901
                " ( " +generateSelectclaimQuery(ClaimUtils.CONTEXT,ClaimUtils.PUBLICATION,null,null,null,false, specificWhereClause, whereParams, keyword, params)+" )" +
902

    
903
                ") as claim   ";
904
        String filterByType = addFilterByType(types, params);
905
         query += ((filterByType==null)?"":" where "+filterByType+" ")+
906
                ((orderByClause==null)?"":" "+orderByClause+" ")+
907
                pagingClause;
908

    
909
         return query;
910
    }
911
    private  String getTypeForTable(String type){
912
        if(type == null){
913
            return null;
914
        }
915
        if(type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET) ||type.equals(ClaimUtils.SOFTWARE)){
916
            return "result";
917
        }else{
918
            return type;
919
        }
920
    }
921
    /**
922
     ** Update - Queries *New* Database **
923
     **/
924

    
925
    private  void updateResult(){
926

    
927
    }
928
    private  void updateProject(){
929

    
930
    }
931
    /**
932
     ** Delete - Queries *New* Database **
933
     **/
934

    
935
    private String generateDeleteEntityQuery(String resultid, String claimId, String type, ArrayList<Object> params){
936
        if(type == null||resultid == null||claimId ==  null ){
937
            return null;
938
        }
939
        String query = null;
940
        if(type.equals(ClaimUtils.PUBLICATION)||type.equals(ClaimUtils.DATASET) ||type.equals(ClaimUtils.SOFTWARE)){
941
            query = generateDeleteResultQuery(resultid,claimId, params);
942
        }else if(type.equals(ClaimUtils.PROJECT)){
943
            query = generateDeleteProjectQuery(resultid,claimId, params);
944
        }else if (type.equals(ClaimUtils.CONTEXT)){
945
            query = generateDeleteContextQuery(resultid,claimId, params);
946
        }
947
        return query;
948
    }
949
/*
950
    Before delete check a Result, Project, Context
951
    check if there is another claim in  has_source_* or has_target_* relation
952
    for the entity
953
 */
954
    private String generateDeleteResultQuery(String resultid, String claimId, ArrayList<Object> params){
955
        params.add(resultid);
956
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.PUBLICATION)+" WHERE  openaire_id = ? and NOT EXISTS \n" +
957
                "   (   " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.PUBLICATION), params) + " union " +
958
                generateSelectOthersFromRelationTableQuery(resultid,claimId,getTargetTableName(ClaimUtils.PUBLICATION), params)+"  ) ;\n" ;
959
        return query;
960
    }
961
    private String generateDeleteProjectQuery(String resultid, String claimId, ArrayList<Object> params){
962
        params.add(resultid);
963
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.PROJECT)+" WHERE openaire_id = ? and NOT EXISTS \n" +
964
                "  (    " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.PROJECT), params) + " union " +
965
                generateSelectOthersFromRelationTableQuery(resultid,claimId,getTargetTableName(ClaimUtils.PROJECT), params)+"  ) ;\n" ;
966
        return query;
967
    }
968
    private String generateDeleteContextQuery(String resultid, String claimId, ArrayList<Object> params){
969
        params.add(resultid);
970
        String query = " DELETE FROM "+getTypeForTable(ClaimUtils.CONTEXT)+" WHERE openaire_id = ? and NOT EXISTS \n" +
971
                " (  " +generateSelectOthersFromRelationTableQuery(resultid,claimId,getSourceTableName(ClaimUtils.CONTEXT), params) +"  ) ;\n" ;
972
        return query;
973
    }
974

    
975
    public String  generateCountClaimsForResultQuery(String resultId){
976
        return " Select count(*) from claim where source_id = '"+ resultId +"' or target_id = '"+resultId+"' ";
977
    }
978
    public String  generateSelectResultSource(String resultId){
979
        return " Select collected_from from result where openaire_id = '"+ resultId +"' ";
980
    }
981

    
982
    /**
983
     * Select form a has_source_* or has_target_* table
984
     * ...
985
     * @param resultid
986
     * @param claimId
987
     * @param tableName
988
     * @return
989
     */
990
    private String  generateSelectOthersFromRelationTableQuery(String resultid, String claimId , String tableName, ArrayList<Object> params){
991
        params.add(resultid);
992
        params.add(claimId);
993
        String query =
994
                " SELECT 1 FROM "+ tableName+"  WHERE openaire_id = ? and claim_id != ?::int " ;
995
        return query;
996
    }
997
    public String  generateDeleteFullClaimQuery(String id, String user, String sourceType, String sourceId, String targetType, String targetId, ArrayList<Object> params){
998
        //TODO generate delete query
999
        params.add(id);
1000
        params.add(id);
1001
        params.add(id);
1002
        String query =
1003
                "BEGIN;\n" +
1004
                //delete has_source_*
1005
                "DELETE FROM "+ getSourceTableName(sourceType)+" WHERE   claim_id = ?::int ;\n" +
1006

    
1007
                //delete has_target_*
1008
                "DELETE FROM "+ getTargetTableName(targetType)+" WHERE  claim_id = ?::int ;\n" +
1009

    
1010
                //delete claim
1011
                "DELETE FROM claim where id = ?::int ;\n" +
1012

    
1013
                        //delete source
1014
                generateDeleteEntityQuery(sourceId,id,sourceType, params)+
1015

    
1016
                        //delete target
1017
                generateDeleteEntityQuery(targetId,id,targetType, params)+
1018
                "COMMIT";
1019
        return query;
1020
    }
1021
    public String  generateSelectClaimQuery(String id, String user, ArrayList<Object> params){
1022

    
1023
        params.add(id);
1024
        params.add(user);
1025
        String query =" ";
1026
        return " Select id, source_type, source_id, target_type, target_id from claim where id = ?::int and claimedBy = ? ";
1027
    }
1028

    
1029
    public String  generateSelectClaimQuery(String id, ArrayList<Object> params){
1030

    
1031
        params.add(id);
1032
        String query =" ";
1033
        return " Select id, source_type, source_id, target_type, target_id,claimedBy  from claim where id = ?::int";
1034
    }
1035
    /**
1036
     * used to fetch the information from DB
1037
     * @param ids
1038
     * @param users
1039
     * @return
1040
     */
1041
    public String  generateSelectClaimQuery(List<String> ids, List<String> users, ArrayList<Object> params){
1042

    
1043
        String query =" Select id, source_type, source_id, target_type, target_id from claim where ";
1044
        if(ids.size()>0 && users.size() > 0 && ids.size() == users.size()) {
1045
            for (int i = 0; i < ids.size(); i++) {
1046
                query+="  ( id = ? and claimedBy = ? ) or";
1047
                params.add(ids.get(i));
1048
                params.add(users.get(i));
1049
            }
1050
            query = query.substring(0, query.length()-2);
1051
            return query;
1052
        }
1053
        return null;
1054
    }
1055

    
1056
    public  String generateSelectProjectByIdQuery(String projectId, ArrayList<Object> params) {
1057
        params.add(projectId);
1058
        return " Select " + getProjectFields("project") + " from project where openaire_id = ?";
1059
    }
1060

    
1061
    public  String generateSelectContactEmailsByProjectIdQuery(String projectId, ArrayList<Object> params) {
1062
        params.add(projectId);
1063
        return " Select contact_person from project where openaire_id = ?";
1064
    }
1065

    
1066
    public String generateUpdateTokenByProjectId(String projectdId, String newToken, ArrayList<Object> params) {
1067
        params.add(newToken);
1068
        params.add(projectdId);
1069
        return "UPDATE project SET token = ? WHERE openaire_id = ?";
1070
    }
1071
    public String generateUpdateContactEmailsByProjectIdByProjectId(String projectdId, List<String> contactEmails, ArrayList<Object> params) {
1072
        String emails = "";
1073
        if(contactEmails != null && contactEmails.size() > 0){
1074
            //emails+="'{";
1075
            for(int i = 0; i< contactEmails.size(); i++){
1076

    
1077
                emails+=contactEmails.get(i)+((i < contactEmails.size() -1 )?",":"");
1078
                //params.add(contactEmails.get(i));
1079
            }
1080
            //emails+="}'";
1081
        }
1082

    
1083
        params.add(emails);
1084
        params.add(projectdId);
1085
        return "UPDATE project SET contact_person = string_to_array(?, ',') WHERE openaire_id = ?;";
1086
    }
1087

    
1088
    public String generateUpdateClaimCuration(String curatedBy, String claimId, boolean approved, ArrayList<Object> params) {
1089
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1090
        Date date = new Date();
1091
        String dateStr=null;
1092
        dateStr=(format.format(date));
1093

    
1094
        params.add(dateStr);
1095
        params.add(curatedBy);
1096
        params.add(approved);
1097
        params.add(claimId);
1098
        String query = "UPDATE claim "
1099
                + "SET curation_date = ?::timestamp, curated_by = ?, approved = ? "
1100
                + "WHERE id = ?::int RETURNING curation_date, curated_by, approved";
1101

    
1102
        logger.debug("Query to execute: "+query);
1103

    
1104
        return query;
1105
    }
1106

    
1107
    public String getMigrationTable() {
1108
        return migrationTable;
1109
    }
1110

    
1111
    public void setMigrationTable(String migrationTable) {
1112
        this.migrationTable = migrationTable;
1113
    }
1114
}
(4-4/9)