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
import { CacheService  } from '../shared/cache.service';
11
@Injectable()
12
export class SearchDatasetsService {
13
    private sizeOfDescription: number = 497;
14

    
15
    constructor(private http: Http, public _cache: CacheService) {}
16

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

    
19
        let link = OpenaireProperties.getSearchAPIURLLast()+"datasets";
20

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

    
30
        let key = url;
31
        if (this._cache.has(key)) {
32
          return Observable.of(this._cache.get(key)).map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "dataset")]);
33
        }
34
        return this.http.get(url)
35
                    .map(res => <any> res.json())
36
                    //.do(res => console.info(res))
37
                    .do(res => {
38
                      this._cache.set(key, res);
39
                    })
40
                    .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "dataset")]);
41
    }
42
    searchDatasetsByDois (DOIs: string[], refineParams:string, page: number, size: number, refineFields:string[] ):any {
43
        let link = OpenaireProperties.getSearchAPIURLLast()+"datasets";
44
        let url = link+"?";
45
        var doisParams = "";
46

    
47
        for(var i =0 ;i < DOIs.length; i++){
48
          doisParams+=(doisParams.length > 0?" or ":"")+'((pidclassid exact doi) and (pid exact "'+ DOIs[i]+'"))';
49
        }
50
        if(doisParams.length > 0){
51
          url += "q=("+doisParams+")"
52
        }
53
        if(refineParams!= null && refineParams != ''  ) {
54
            url += refineParams;
55
        }
56
        url += "&page="+ (page-1) +"&size="+size+"&format=json";
57

    
58
        let key = url;
59
        if (this._cache.has(key)) {
60
          return Observable.of(this._cache.get(key)).map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "dataset")]);
61
        }
62
        return this.http.get(url)
63
                    .map(res => <any> res.json())
64
                    //.do(res => console.info(res))
65
                    .do(res => {
66
                      this._cache.set(key, res);
67
                    })
68
                    .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "dataset")]);
69
    }
70
    advancedSearchDatasets (params: string, page: number, size: number ):any {
71
      let url = OpenaireProperties.getSearchResourcesAPIURL();
72
      var basicQuery = "(oaftype exact result) and (resulttypeid exact dataset)  "
73
      url += "?query=";
74
      if(params!= null && params != ''  ) {
75
        url +=" ( "+basicQuery+ " ) " +" and (" + params + ")";
76
      }else{
77
        url +=" ( "+basicQuery+ " ) ";
78
      }
79

    
80
      url += "&page="+(page-1)+"&size="+size;
81
      url += "&format=json";
82
      let key = url;
83
      if (this._cache.has(key)) {
84
        return Observable.of(this._cache.get(key));
85
      }
86
      return this.http.get(url)
87
      .map(res => <any> res.json())
88
      //.do(res => console.info(res))
89
      .map(res => [res['meta'].total, this.parseResults(res['results'])])
90
      .do(res => {
91
        this._cache.set(key, res);
92
      });
93
    }
94
    searchDatasetsForEntity (params: string, page: number, size: number):any {
95
        let link = OpenaireProperties.getSearchAPIURLLast();
96
        let url = link+params+"/datasets"+"?format=json";
97
        let key = url;
98
        if (this._cache.has(key)) {
99
          return Observable.of(this._cache.get(key)).map(res => [res['meta'].total, this.parseResults(res['results'])]);
100
        }
101
        return this.http.get(url)
102
                    .map(res => <any> res.json())
103
                    .do(res => {
104
                      this._cache.set(key, res);
105
                    })
106
                    .map(res => [res['meta'].total, this.parseResults(res['results'])]);
107
    }
108

    
109
    searchDatasetsForDataproviders(params: string, page: number, size: number):any {
110
        let link = OpenaireProperties.getSearchAPIURLLast();
111
        let url = link+params+"&format=json";
112
        let key = url;
113
        if (this._cache.has(key)) {
114
          return Observable.of(this._cache.get(key)).map(res => [res['meta'].total, this.parseResults(res['results'])]);
115
        }
116
        return this.http.get(url)
117
                    .map(res => <any> res.json())
118
                    .do(res => {
119
                      this._cache.set(key, res);
120
                    })
121
                    .map(res => [res['meta'].total, this.parseResults(res['results'])]);
122
    }
123

    
124
    parseResults(data: any): SearchResult[] {
125
        let results: SearchResult[] = [];
126

    
127
        let length = Array.isArray(data) ? data.length : 1;
128

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

    
132
            var result: SearchResult = new SearchResult();
133

    
134
            result['title'] = {"name": '', "url": '', "accessMode": ''};
135

    
136
            if(Array.isArray(resData['title'])) {
137
                result['title'].name = resData['title'][0].content;
138
            } else {
139
                result['title'].name = resData['title'].content;
140
            }
141

    
142
            result['title'].url = OpenaireProperties.getsearchLinkToDataset();
143
            result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
144
            result['id'] = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
145
            if(resData['bestlicense'].hasOwnProperty("classid")) {
146
                result['title'].accessMode = resData['bestlicense'].classid;
147
            }
148

    
149
            if(resData['rels'].hasOwnProperty("rel")) {
150
                let relLength = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'].length : 1;
151

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

    
155
                    if(relation.hasOwnProperty("to")) {
156
                        if(relation['to'].class == "hasAuthor") {
157
                            if(result['authors'] == undefined) {
158
                                result['authors'] = new Array<{"name": string, "url": string}>();
159
                            }
160

    
161
                            result['authors'].push({"name": relation.fullname, "url": OpenaireProperties.getsearchLinkToPerson()+relation['to'].content});
162
                        } else if(relation['to'].class == "isProducedBy") {
163
                            if(result['projects'] == undefined) {
164
                                result['projects'] = new Array<
165
                                    { "url": string, "acronym": string, "title": string,
166
                                      "funderShortname": string, "funderName": string,
167
                                      "code": string
168
                                    }>();
169
                            }
170

    
171
                            let countProjects = result['projects'].length;
172

    
173
                            result['projects'][countProjects] = {
174
                                "url": "", "acronym": "", "title": "",
175
                                "funderShortname": "", "funderName": "",
176
                                "code": ""
177
                            }
178

    
179
                            result['projects'][countProjects]['url'] =
180
                                OpenaireProperties.getsearchLinkToProject() + relation['to'].content;
181
                            result['projects'][countProjects]['acronym'] = relation.acronym;
182
                            result['projects'][countProjects]['title'] = relation.title;
183
                            result['projects'][countProjects]['code'] = relation.code;
184

    
185
                            if(relation.hasOwnProperty("funding")) {
186
                                let fundingLength = Array.isArray(relation['funding']) ? relation['funding'].length : 1;
187

    
188
                                for(let z=0; z<fundingLength; z++) {
189
                                    let fundingData = Array.isArray(relation['funding']) ? relation['funding'][z] : relation['funding'];
190

    
191
                                    if(fundingData.hasOwnProperty("funder")) {
192
                                        result['projects'][countProjects]['funderShortname'] = fundingData['funder'].shortname;
193
                                        result['projects'][countProjects]['funderName'] = fundingData['funder'].name;
194
                                    }
195
                                }
196
                            }
197

    
198
                        }
199
                    }
200
                }
201
            }
202

    
203
            result.year = resData.dateofacceptance.split('-')[0];
204

    
205
            if(!Array.isArray(resData.description)) {
206
                result.description = resData.description;
207
            } else {
208
                result.description = resData.description[0];
209
            }
210
            if(result.description.length > this.sizeOfDescription) {
211
                result.description = result.description.substring(0, this.sizeOfDescription)+"...";
212
            }
213

    
214
            result.embargoEndDate = resData.embargoenddate;
215

    
216
            if(!Array.isArray(resData.publisher)) {
217
                result.publisher = resData.publisher;
218
            } else {
219
                for(let i=0; i<resData.publisher.length; i++) {
220
                    if(result.publisher != undefined){
221
                        result.publisher += ', '+resData['publisher'][i];
222
                    } else {
223
                        result.publisher = resData['publisher'][i];
224
                    }
225
                }
226
            }
227

    
228
            results.push(result);
229
        }
230

    
231
        return results;
232
    }
233

    
234
    numOfEntityDatasets(id: string, entity: string):any {
235

    
236
        //OpenaireProperties.getSearchAPIURLLast()
237
        //"http://rudie.di.uoa.gr:8080/dnet-functionality-services-2.0.0-SNAPSHOT/rest/v2/api/"
238
        let url = OpenaireProperties.getSearchAPIURLLast()+entity+id+"/datasets/count"+"?format=json";
239
        let key = url;
240
        if (this._cache.has(key)) {
241
          return Observable.of(this._cache.get(key));
242
        }
243
        return this.http.get(url)
244
                    .map(res => <any> res.json())
245
                    .map(res => res.total)
246
                    .do(res => {
247
                      this._cache.set(key, res);
248
                    });
249
    }
250

    
251
    numOfSearchDatasets(params: string):any {
252

    
253
        //OpenaireProperties.getSearchAPIURLLast()
254
        //"http://rudie.di.uoa.gr:8080/dnet-functionality-services-2.0.0-SNAPSHOT/rest/v2/api/"
255
        let url = OpenaireProperties.getSearchAPIURLLast()+"datasets/count?q="+'"' + params + '"'+"&format=json";
256
        let key = url;
257
        if (this._cache.has(key)) {
258
          return Observable.of(this._cache.get(key));
259
        }
260
        return this.http.get(url)
261
                    .map(res => <any> res.json())
262
                    .map(res => res.total)
263
                    .do(res => {
264
                      this._cache.set(key, res);
265
                    });
266
    }
267
}
(17-17/23)