import {Injectable} from '@angular/core'; import {Http, Response} from '@angular/http'; import {HttpClient} from "@angular/common/http"; import {Observable} from 'rxjs'; import {SearchResult} from '../utils/entities/searchResult'; import {RefineResultsUtils} from './servicesUtils/refineResults.class'; import { ParsingFunctions } from '../landingPages/landing-utils/parsingFunctions.class'; import{EnvProperties} from '../utils/properties/env-properties'; import {DOI, StringUtils} from '../utils/string-utils.class'; import {map} from "rxjs/operators"; @Injectable() export class SearchSoftwareService { private sizeOfDescription: number = 270; public parsingFunctions: ParsingFunctions = new ParsingFunctions(); constructor(private http: HttpClient ) {} searchSoftware (params: string, refineParams:string, page: number, size: number, sortBy: string, refineFields:string[], properties:EnvProperties ):any { let link = properties.searchAPIURLLAst+"software"; let url = link+"?"; if(params!= null && params != '' ) { url += params; } if(refineParams!= null && refineParams != '' ) { url += refineParams; } if(sortBy) { url += "&sortBy=" + sortBy; } url += "&page="+ (page-1) +"&size="+size+"&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.do(res => console.info(res)) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'], properties),RefineResultsUtils.parse(res['refineResults'],refineFields, "software")])); } searchSoftwareById (id: string, properties:EnvProperties ):any { let url = properties.searchAPIURLLAst+"software/"+id+"?format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) .pipe(map(res => this.parseResults(res, properties))); } searchAggregators (id: string, params: string, refineParams:string, page: number, size: number, properties:EnvProperties ):any { let link = properties.searchAPIURLLAst+"software"; let url = link+"?"+"&format=json"; if(params!= null && params != '' ) { url += params; } if(refineParams!= null && refineParams != '' ) { url += refineParams; } url += "&page="+(page-1)+"&size="+size; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) .pipe(map(res => this.parseRefineResults(id, res['refineResults']))); } searchSoftwareByDois (DOIs: string[], refineParams:string, page: number, size: number, refineFields:string[], properties:EnvProperties ):any { let link = properties.searchAPIURLLAst+"software"; let url = link+"?"; var doisParams = ""; for(var i =0 ;i < DOIs.length; i++){ doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; } if(doisParams.length > 0){ url += "&"+doisParams; } if(refineParams!= null && refineParams != '' ) { url += refineParams; } url += "&page="+ (page-1) +"&size="+size+"&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.do(res => console.info(res)) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'], properties),RefineResultsUtils.parse(res['refineResults'],refineFields, "software")])); } advancedSearchSoftware (params: string, page: number, size: number, sortBy: string, properties:EnvProperties ):any { let url = properties.searchResourcesAPIURL; var basicQuery = "(oaftype exact result) and (resulttypeid exact software) " url += "?query="; if(params!= null && params != '' ) { url +=" ( "+basicQuery+ " ) " +" and (" + params + ")"; }else{ url +=" ( "+basicQuery+ " ) "; } if(sortBy) { let sortOptions = sortBy.split(","); url += "sortBy "+sortOptions[0]+"/sort."+sortOptions[1]+" "; } url += "&page="+(page-1)+"&size="+size; url += "&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'], properties)])); } searchSoftwareForEntity (params: string, page: number, size: number, properties:EnvProperties):any { let link = properties.searchAPIURLLAst; let url = link+params+"/software"+"?format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'], properties)])); } searchSoftwareForDataproviders(params: string, page: number, size: number, properties:EnvProperties):any { let link = properties.searchAPIURLLAst; let url = link+params+ "&page="+(page-1)+"&size="+size + "&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'], properties)])); } parseResults(data: any, properties: EnvProperties): SearchResult[] { let results: SearchResult[] = []; let length = Array.isArray(data) ? data.length : 1; for(let i=0; i(); let types = new Set(); let instance; let length = Array.isArray(resData['children']['instance']) ? resData['children']['instance'].length : 1; for(let i=0; i(); if(!Array.isArray(resData['programmingLanguage'])) { if(resData['programmingLanguage'].classname != "Undetermined" && resData['programmingLanguage'].classname) { result.programmingLanguages.push(resData['programmingLanguage'].classname); } } else { for(let i=0; i(); if(!Array.isArray(resData['language'])) { if(resData['language'].classname != "Undetermined" && resData['language'].classname) { result.languages.push(resData['language'].classname); } } else { for(let i=0; i(); if(!Array.isArray(resData['country'])) { if(resData['country'].classname != "Undetermined" && resData['country'].classname) { result.countriesForResults.push(resData['country'].classname); } } else { for(let i=0; i(); } result['authors'].push({"name": relation.fullname, "id": relation['to'].content}); } else */if(relation['to'].class == "isProducedBy") { result['projects'] = this.parseProjects(result['projects'], relation); } } } } if(resData.hasOwnProperty("creator") && resData['creator'] != null) { if(result['authors'] == undefined) { result['authors'] = new Array<{"fullName": string, "orcid": string}>(); } let authors = resData['creator']; let length = Array.isArray(authors) ? authors.length : 1; for(let i=0; i this.sizeOfDescription) { result.description = result.description.substring(0, this.sizeOfDescription)+"..."; } result.embargoEndDate = resData.embargoenddate; if(!Array.isArray(resData.publisher)) { result.publisher = resData.publisher; } else { for(let i=0; i(); } let countProjects = projects.length; projects[countProjects] = { "id": "", "acronym": "", "title": "", "funderShortname": "", "funderName": "", "code": "" } if(relation.title != 'unidentified') { projects[countProjects]['id'] = /*OpenaireProperties.getsearchLinkToProject() + */relation['to'].content; projects[countProjects]['acronym'] = relation.acronym; projects[countProjects]['title'] = relation.title; projects[countProjects]['code'] = relation.code; } else { projects[countProjects]['id'] = ""; projects[countProjects]['acronym'] = ""; projects[countProjects]['title'] = ""; projects[countProjects]['code'] = ""; } if(relation.hasOwnProperty("funding")) { let fundingLength = Array.isArray(relation['funding']) ? relation['funding'].length : 1; for(let z=0; z res.json()) .pipe(map(res => res['total'])); } numOfEntitySoftware(id: string, entity: string, properties:EnvProperties):any { var parameters = ""; if(entity == "project") { parameters = "projects/"+id+"/software/count"; } let url = properties.searchAPIURLLAst+parameters+"?format=json"; return this.numOfSoftware(url, properties); } numOfSearchSoftware(params: string, properties:EnvProperties, refineParams:string=null):any { let url = properties.searchAPIURLLAst+"software/count?format=json"; if(params.length > 0){ var DOIs:string[] = DOI.getDOIsFromString(params); var doisParams = ""; for(var i =0 ;i < DOIs.length; i++){ doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; } if(doisParams.length > 0){ url += "&"+doisParams; }else{ url += "&q=" + StringUtils.URIEncode(params); } } // if(params != "") { // url += "&q=" + StringUtils.URIEncode(params); // } if(refineParams!= null && refineParams != '' ) { url += refineParams; } return this.numOfSoftware(url, properties); } }