Project

General

Profile

1
import {Injectable} from '@angular/core';
2
import {Http, Response} from '@angular/http';
3
import {Observable}     from 'rxjs/Observable';
4
import {OpenaireProperties} from '../utils/properties/openaireProperties';
5
import {SearchResult}     from '../utils/entities/searchResult';
6
import {RefineResultsUtils} from './servicesUtils/refineResults.class';
7
import 'rxjs/add/observable/of';
8
import 'rxjs/add/operator/do';
9
import 'rxjs/add/operator/share';
10

    
11
import { ParsingFunctions } from '../landingPages/landing-utils/parsingFunctions.class';
12

    
13
@Injectable()
14
export class SearchDatasetsService {
15
    private sizeOfDescription: number = 270;
16
    public parsingFunctions: ParsingFunctions = new ParsingFunctions();
17

    
18
    constructor(private http: Http ) {}
19

    
20
    searchDatasets (params: string, refineParams:string, page: number, size: number, refineFields:string[] ):any {
21

    
22
        let link = OpenaireProperties.getSearchAPIURLLast()+"datasets";
23

    
24
        let url = link+"?";
25
        if(params!= null && params != ''  ) {
26
            url += params;
27
        }
28
        if(refineParams!= null && refineParams != ''  ) {
29
            url += refineParams;
30
        }
31
        url += "&page="+ (page-1) +"&size="+size+"&format=json";
32

    
33

    
34
        return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url)
35
                    .map(res => <any> res.json())
36
                    //.do(res => console.info(res))
37
                    .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "dataset")]);
38
    }
39
    searchDatasetById (id: string ):any {
40

    
41
        let url = OpenaireProperties.getSearchAPIURLLast()+"datasets/"+id+"?format=json";
42
         return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url)
43
                    .map(res => <any> res.json())
44
                    .map(res => this.parseResults(res));
45
    }
46

    
47
    searchAggregators (id: string, params: string, refineParams:string, page: number, size: number ):any {
48

    
49
        let link = OpenaireProperties.getSearchAPIURLLast()+"datasets";
50

    
51
        let url = link+"?"+"&format=json";
52
        if(params!= null && params != ''  ) {
53
            url += params;
54
        }
55
        if(refineParams!= null && refineParams != ''  ) {
56
            url += refineParams;
57
        }
58
        url += "&page="+(page-1)+"&size="+size;
59

    
60

    
61

    
62
        return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url)
63
                    .map(res => <any> res.json())
64
                    .map(res => this.parseRefineResults(id, res['refineResults']))
65
    }
66

    
67
    searchDatasetsByDois (DOIs: string[], refineParams:string, page: number, size: number, refineFields:string[] ):any {
68
        let link = OpenaireProperties.getSearchAPIURLLast()+"datasets";
69
        let url = link+"?";
70
        var doisParams = "";
71

    
72
        for(var i =0 ;i < DOIs.length; i++){
73
          doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"';
74
        }
75
        if(doisParams.length > 0){
76
          url += "&"+doisParams;
77

    
78
        }
79
        if(refineParams!= null && refineParams != ''  ) {
80
            url += refineParams;
81
        }
82
        url += "&page="+ (page-1) +"&size="+size+"&format=json";
83

    
84

    
85
        return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url)
86
                    .map(res => <any> res.json())
87
                    //.do(res => console.info(res))
88

    
89
                    .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "dataset")]);
90
    }
91
    advancedSearchDatasets (params: string, page: number, size: number ):any {
92
      let url = OpenaireProperties.getSearchResourcesAPIURL();
93
      var basicQuery = "(oaftype exact result) and (resulttypeid exact dataset)  "
94
      url += "?query=";
95
      if(params!= null && params != ''  ) {
96
        url +=" ( "+basicQuery+ " ) " +" and (" + params + ")";
97
      }else{
98
        url +=" ( "+basicQuery+ " ) ";
99
      }
100

    
101
      url += "&page="+(page-1)+"&size="+size;
102
      url += "&format=json";
103

    
104
      return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url)
105
      .map(res => <any> res.json())
106
      //.do(res => console.info(res))
107
      .map(res => [res['meta'].total, this.parseResults(res['results'])]);
108
    }
109
    searchDatasetsForEntity (params: string, page: number, size: number):any {
110
        let link = OpenaireProperties.getSearchAPIURLLast();
111
        let url = link+params+"/datasets"+"?format=json";
112

    
113
        return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url)
114
                    .map(res => <any> res.json())
115
                    .map(res => [res['meta'].total, this.parseResults(res['results'])]);
116
    }
117

    
118
    searchDatasetsForDataproviders(params: string, page: number, size: number):any {
119
        let link = OpenaireProperties.getSearchAPIURLLast();
120
        let url = link+params+ "&page="+(page-1)+"&size="+size + "&format=json";
121
        return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url)
122
                    .map(res => <any> res.json())
123
                    .map(res => [res['meta'].total, this.parseResults(res['results'])]);
124
    }
125

    
126
    parseResults(data: any): SearchResult[] {
127
        let results: SearchResult[] = [];
128

    
129
        let length = Array.isArray(data) ? data.length : 1;
130

    
131
        for(let i=0; i<length; i++) {
132
            let resData = Array.isArray(data) ? data[i]['result']['metadata']['oaf:entity']['oaf:result'] : data['result']['metadata']['oaf:entity']['oaf:result'];
133

    
134
            var result: SearchResult = new SearchResult();
135
            result.entityType = "dataset";
136
            if(resData['language'] && resData['language'] != null) {
137
              result.languages = new Array<string>();
138
              result.types = new Array<string>();
139
              let types = new Set<string>();
140

    
141
              let counter = 0;
142
              let instance;
143

    
144
              let length = Array.isArray(resData['children']['instance']) ? resData['children']['instance'].length : 1;
145

    
146
              for(let i=0; i<length; i++) {
147
                instance = Array.isArray(resData['children']['instance']) ? resData['children']['instance'][i] : resData['children']['instance'];
148
                this.parsingFunctions.parseTypes(result.types, types, instance);
149
              }
150
              if(!Array.isArray(resData['language'])) {
151
                if(resData['language'].classname != "Undetermined" && resData['language'].classname) {
152
                  result.languages.push(resData['language'].classname);
153
                }
154
              } else {
155
                for(let i=0; i<resData['language'].length; i++) {
156
                  if(resData['language'][i].classname != "Undetermined" && resData['language'][i].classname) {
157
                    result.languages.push(resData['language'][i].classname);
158
                  }
159
                }
160
              }
161
            }
162
            result['title'] = {"name": '', "accessMode": '', "sc39": ''};
163

    
164
            if(Array.isArray(resData['title'])) {
165
                result['title'].name = resData['title'][0].content;
166
            } else {
167
                result['title'].name = resData['title'].content;
168
            }
169

    
170
            //result['title'].url = OpenaireProperties.getsearchLinkToDataset();
171
            //result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
172
            result['id'] = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
173
            if(resData['bestaccessright'].hasOwnProperty("classid")) {
174
                result['title'].accessMode = resData['bestaccessright'].classid;
175
            }
176

    
177
            if(resData['rels'].hasOwnProperty("rel")) {
178
                let relLength = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'].length : 1;
179

    
180
                for(let j=0; j<relLength; j++) {
181
                    let relation = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'][j] : resData['rels']['rel'];
182

    
183
                    if(relation.hasOwnProperty("to")) {
184
                        /*if(relation['to'].class == "hasAuthor") {
185
                          if(result['authors'] == undefined) {
186
                            result['authors'] = new Array<{"name": string, "id": string}>();
187
                          }
188

    
189
                          result['authors'].push({"name": relation.fullname, "id": relation['to'].content});
190
                        } else */if(relation['to'].class == "isProducedBy") {
191
                          result['projects'] = this.parseProjects(result['projects'], relation);
192
                        }
193
                    }
194
                }
195
            }
196

    
197
            if(resData.hasOwnProperty("creator") && resData['creator'] != null) {
198
              if(result['authors'] == undefined) {
199
                result['authors'] = new Array<string>();
200
              }
201

    
202
              let authors = resData['creator'];
203
              let length = Array.isArray(authors) ? authors.length : 1;
204

    
205
              for(let i=0; i<length; i++) {
206
                let author = Array.isArray(authors) ? authors[i] : authors;
207
                result.authors[author.rank-1] = author.content;
208
              }
209
              result.authors = result.authors.filter(function (item) {
210
                return (item != undefined);
211
              });
212
            }
213

    
214
            var date:string = (resData.dateofacceptance)+""; // transform to string in case it is an integer
215
            result.year = (date && (date).indexOf('-') !== -1)?date.split('-')[0]:date;
216
            if(!Array.isArray(resData.description)) {
217
                result.description = resData.description;
218
            } else {
219
                result.description = resData.description[0];
220
            }
221
            if(result.description.length > this.sizeOfDescription) {
222
                result.description = result.description.substring(0, this.sizeOfDescription)+"...";
223
            }
224

    
225
            result.embargoEndDate = resData.embargoenddate;
226

    
227
            if(!Array.isArray(resData.publisher)) {
228
                result.publisher = resData.publisher;
229
            } else {
230
                for(let i=0; i<resData.publisher.length; i++) {
231
                    if(result.publisher != undefined){
232
                        result.publisher += ', '+resData['publisher'][i];
233
                    } else {
234
                        result.publisher = resData['publisher'][i];
235
                    }
236
                }
237
            }
238

    
239
            results.push(result);
240
        }
241

    
242
        return results;
243
    }
244

    
245
    parseProjects(projects: { "id": string, "acronym": string, "title": string,
246
                              "funderShortname": string, "funderName": string,
247
                              "code": string }[], relation: any ) :  {
248
                              "id": string, "acronym": string, "title": string,
249
                              "funderShortname": string, "funderName": string,
250
                              "code": string }[] {
251
      if(projects == undefined) {
252
          projects = new Array<
253
              { "id": string, "acronym": string, "title": string,
254
                "funderShortname": string, "funderName": string,
255
                "code": string
256
              }>();
257
      }
258

    
259
      let countProjects = projects.length;
260

    
261
      projects[countProjects] = {
262
          "id": "", "acronym": "", "title": "",
263
          "funderShortname": "", "funderName": "",
264
          "code": ""
265
      }
266

    
267
      if(relation.title != 'unidentified') {
268
          projects[countProjects]['id'] =
269
              /*OpenaireProperties.getsearchLinkToProject() + */relation['to'].content;
270
          projects[countProjects]['acronym'] = relation.acronym;
271
          projects[countProjects]['title'] = relation.title;
272
          projects[countProjects]['code'] = relation.code;
273
      } else {
274
          projects[countProjects]['id'] = "";
275
          projects[countProjects]['acronym'] = "";
276
          projects[countProjects]['title'] = "";
277
          projects[countProjects]['code'] = "";
278
      }
279

    
280
      if(relation.hasOwnProperty("funding")) {
281
          let fundingLength = Array.isArray(relation['funding']) ? relation['funding'].length : 1;
282

    
283
          for(let z=0; z<fundingLength; z++) {
284
              let fundingData = Array.isArray(relation['funding']) ? relation['funding'][z] : relation['funding'];
285

    
286
              if(fundingData.hasOwnProperty("funder")) {
287
                  projects[countProjects]['funderShortname'] = fundingData['funder'].shortname;
288
                  projects[countProjects]['funderName'] = fundingData['funder'].name;
289
              }
290
          }
291
      }
292

    
293
      return projects;
294
    }
295

    
296
    parseRefineResults(id: string, data: any): any {
297
        var results:any = [];
298
        if(data.hasOwnProperty("resulthostingdatasource")) {
299
            let length = Array.isArray(data['resulthostingdatasource']) ? data['resulthostingdatasource'].length : 1;
300

    
301
            for(let i=0; i<length; i++) {
302
                let datasource = Array.isArray(data['resulthostingdatasource']) ? data['resulthostingdatasource'][i] : data['resulthostingdatasource'];
303

    
304
                let result: {"name": string, "id": string, "count": number} = {"name": "", "id": "", "count": 0};
305
                result['name'] = datasource.name;
306
                result['id'] = datasource.id.split("||")[0];
307
                //result['url'] = OpenaireProperties.getsearchLinkToDataProvider()+result['id'];
308
                result['count'] = datasource.count;
309

    
310
                if(result['id'] != id && result['name'] != "Unknown Repository") {
311
                    results.push(result);
312
                }
313
            }
314
        }
315
        return results;
316
    }
317

    
318
    numOfDatasets(url: string):any {
319

    
320
      return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url)
321
                  .map(res => <any> res.json())
322
                  .map(res => res.total);
323
    }
324

    
325
    numOfEntityDatasets(id: string, entity: string):any {
326
        var parameters = "";
327

    
328
        if(entity == "project") {
329
          parameters = "projects/"+id+"/datasets/count";
330
        }
331

    
332
        let url = OpenaireProperties.getSearchAPIURLLast()+parameters+"?format=json";
333
        return this.numOfDatasets(url);
334
    }
335

    
336
    numOfSearchDatasets(params: string):any {
337
        let url = OpenaireProperties.getSearchAPIURLLast()+"datasets/count?format=json";
338
        if(params != "") {
339
          url += "&q=" + params;
340
        }
341
        return this.numOfDatasets(url);
342
    }
343
}
(14-14/19)