import {Injectable} from '@angular/core'; import {HttpClient} from "@angular/common/http"; import {SearchResult} from '../utils/entities/searchResult'; import {RefineResultsUtils} from './servicesUtils/refineResults.class'; import {StringUtils} from '../utils/string-utils.class'; import{EnvProperties} from '../utils/properties/env-properties'; import {map} from "rxjs/operators"; @Injectable() export class SearchDataprovidersService { private sizeOfDescription: number = 270; constructor(private http: HttpClient ) {} searchDataproviders (params: string, refineParams:string, page: number, size: number, refineFields:string[], properties:EnvProperties, usedBy: string="search" ):any { let link = properties.searchAPIURLLAst+"datasources"; let url = link+"?"; if(params!= null && params != '' ) { url += params; } 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) //.map(res => res.json()) //.do(res => console.info(res)) .pipe(map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource", usedBy)])); } //((oaftype exact datasource) and(collectedfromdatasourceid exact "openaire____::47ce9e9f4fad46e732cff06419ecaabb")) advancedSearchDataproviders (params: string, page: number, size: number, properties: EnvProperties, refineParams:string=null, refineFields:string[] =null, refineQuery:string = null, depositQuery:boolean = false ):any { let url = properties.searchAPIURLLAst+"resources"+(depositQuery?'':2)+"/?format=json"; if(params!= null && params != '' ) { url +="&query=(" + params + ")"; } if(refineParams!= null && refineParams != '' ) { url += refineParams; } if(refineQuery) { url += "&" + refineQuery; } url += "&page="+(page-1)+"&size="+size; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) //.do(res => console.info(res)) .pipe(map(res => [res['meta'].total, this.parseResults(res['results']), RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource")])); } searchCompatibleDataprovidersTable ( properties:EnvProperties):any { let size: number = 0; let url: string= properties.searchResourcesAPIURL; url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other) not(datasourcetypeuiid exact "pubsrepository::journal") not(datasourcetypeuiid exact "aggregator::pubsrepository::journals"))'; url += "&page=0&size=0&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) .pipe(map(res => res['meta'].total)); } searchCompatibleDataproviders (params: string,refineParams:string, page: number, size: number, refineFields:string[], properties:EnvProperties ):any { let url: string = properties.searchResourcesAPIURL; url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other) not(datasourcetypeuiid exact "pubsrepository::journal") not(datasourcetypeuiid exact "aggregator::pubsrepository::journals"))'; if(params!= null && params != '' ) { url += params; } 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) //.map(res => res.json()) //.do(res => console.info(res)) .pipe(map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource")])); } searchEntityRegistriesTable (properties:EnvProperties):any { let size: number = 0; let url: string= properties.searchResourcesAPIURL; url += "?query=((oaftype exact datasource) and(datasourcetypeuiid = other))"; url += "&page=0&size=0&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) .pipe(map(res => res['meta'].total)); } searchEntityRegistries (params: string,refineParams:string, page: number, size: number, refineFields:string[], properties:EnvProperties ):any { let url = properties.searchResourcesAPIURL; url += "?query=((oaftype exact datasource) and(datasourcetypeuiid = other))"; if(params!= null && params != '' ) { url += params; } 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) //.map(res => res.json()) //.do(res => console.info(res)) .pipe(map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource")])); } searchJournalsTable ( properties:EnvProperties):any { let size: number = 0; let url: string= properties.searchResourcesAPIURL; url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) and (datasourcetypeuiid exact "pubsrepository::journal" or datasourcetypeuiid exact "aggregator::pubsrepository::journals" ))'; url += "&page=0&size=0&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url)//.map(res => res.json()) .pipe(map(res => res['meta'].total)); } searchJournals (params: string,refineParams:string, page: number, size: number, refineFields:string[] , properties:EnvProperties):any { let url: string = properties.searchResourcesAPIURL; //url += "?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other))" url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) and (datasourcetypeuiid exact "pubsrepository::journal" or datasourcetypeuiid exact "aggregator::pubsrepository::journals" ))'; if(params!= null && params != '' ) { url += params; } 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) //.map(res => res.json()) //.do(res => console.info(res)) .pipe(map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource")])); } searchDataprovidersForDeposit (id: string,type:string, page: number, size: number, properties:EnvProperties):any { let link = properties.searchResourcesAPIURL; var compatibilities = ""; if(type == "Research Data"){ //compatibilities = " and (datasourcecompatibilityid <> UNKNOWN) and (datasourcecompatibilityid = openaire2.0_data)" compatibilities = " and (datasourcecompatibilityid = openaire2.0_data)"; }else if(type == "Publications"){ //compatibilities = " and (datasourcecompatibilityid <> UNKNOWN) and (datasourcecompatibilityid <> openaire2.0_data)" compatibilities = " and (datasourcecompatibilityid <> openaire2.0_data)"; } let url = link+"?query=(((deletedbyinference = false) AND (oaftype exact datasource)) "+((compatibilities && compatibilities.length > 0)?" "+compatibilities+" ":"")+") and (relorganizationid exact \""+id+"\")"; url += "&page="+(page-1)+"&size="+size+"&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'])])); } searchDataprovidersForDepositSearch(params: string, refineParams:string, page: number, size: number, refineFields:string[], properties:EnvProperties, usedBy: string="search" ):any { let link = properties.searchResourcesAPIURL; let url = link+"?query=((deletedbyinference = false) AND (oaftype exact datasource)) "+params; 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) .pipe(map(res => [res['meta'].total, this.parseResults(res['results']), RefineResultsUtils.parse(res['refineResults'], refineFields, "datasource", usedBy)])); } searchDataProvidersBySubjects(keyword:string, type:string, page: number, size: number, properties:EnvProperties):any { let link = properties.searchResourcesAPIURL; var compatibilities = ""; if(type == "Research Data"){ compatibilities = " and (datasourcecompatibilityid <> UNKNOWN) and (datasourcecompatibilityid = openaire2.0_data)" }else if(type == "Publications"){ compatibilities = " and (datasourcecompatibilityid <> UNKNOWN) and (datasourcecompatibilityid <> openaire2.0_data)" } let url = link+"?query=(((deletedbyinference = false) AND (oaftype exact datasource)) "+((compatibilities && compatibilities.length > 0)?" "+ compatibilities+" ":"")+") "+ " and (datasourcesubject all "+'"'+keyword+'"'+") " ; url += "&page="+(page-1)+"&size="+size+"&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'])])); } getDataProvidersforEntityRegistry(datasourceId: string, page: number, size: number , properties:EnvProperties):any { let url = properties.searchResourcesAPIURL; var basicQuery = "(oaftype exact datasource) " url += "?query="; if(datasourceId!= null && datasourceId != '' ) { url +=" ( "+basicQuery+ " ) " +" and (collectedfromdatasourceid exact \"" + datasourceId + "\" or resulthostingdatasourceid exact \""+ datasourceId + "\")"; }else{ url +=" ( "+basicQuery+ " ) "; } url += "&page="+(page-1)+"&size="+size+"&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'])])); } searchDataprovidersForEntity (params: string, page: number, size: number, properties:EnvProperties):any { let link = properties.searchAPIURLLAst; let url = link+params+"/datasources?format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) .pipe(map(res => [res['meta'].total, this.parseResults(res['results'])])); } /* searchDataprovidersCSV (params: string, refineParams:string, page: number, size: number):any { let link = OpenaireProperties. getSearchAPIURLLast()+"datasources"; let url = link+"?"; if(params!= null && params != '' ) { url += params; } 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) .map(res => res.json()) //.do(res => console.info(res)) .map(res => this.parseResultsCSV(res['results'])); } */ /* searchEntityRegistriesCSV (params: string,refineParams:string, page: number, size: number):any { let url = properties.searchAPIURLLAst; url += "?query=((oaftype exact datasource) and(datasourcetypeuiid = other))" if(params!= null && params != '' ) { url += params; } 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) .map(res => res.json()) //.do(res => console.info(res)) .map(res => this.parseResultsCSV(res['results'])); } */ /* searchCompatibleDataprovidersCSV (params: string,refineParams:string, page: number, size: number):any { let url = properties.searchAPIURLLAst; url += "?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other))" if(params!= null && params != '' ) { url += params; } 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) .map(res => res.json()) //.do(res => console.info(res)) .map(res => this.parseResultsCSV(res['results'])); } */ parseResults(data: any): SearchResult[] { let results: SearchResult[] = []; let length = Array.isArray(data) ? data.length : 1; for(let i=0; i this.sizeOfDescription) { result.description = result.description.substring(0, this.sizeOfDescription) + "..."; } let typeid: string = resData['datasourcetype'].classid; //console.info(typeid); if(typeid != "entityregistry" && typeid != "entityregistry::projects" && typeid != "entityregistry::repositories") { if(resData.hasOwnProperty('accessinfopackage')) { let OAIPMHURL: string; if(Array.isArray(resData['accessinfopackage'])) { OAIPMHURL = resData['accessinfopackage'][0]; } else { OAIPMHURL = resData['accessinfopackage']; } if(OAIPMHURL != '' && OAIPMHURL != 'unknown') { result['OAIPMHURL'] = OAIPMHURL; } } let compatibility = this.getDataproviderCompatibility(resData); result['compatibility'] = compatibility.classname; if(compatibility.classid == "UNKNOWN") { result['compatibilityUNKNOWN'] = true; } } else { result['compatibility'] = ""; } result['websiteURL'] = resData.websiteurl; let res:[string[], {"name":string, "id":string}[]] = this.getDataproviderCountriesOrganizations(resData, true, true); result['organizations'] = res[1]; result['countries'] = res[0]; result['subjects'] = this.getDataproviderSubjects(resData); //console.log(result['subjects']); results.push(result); } return results; } getDataproviderSubjects(resData: any): string [] { var subjects:string [] = []; let length = Array.isArray(resData['subjects']) ? resData['subjects'].length : 1; for(let i=0; i = new Set(); let relLength = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'].length : 1; for(let i=0; i res.json()) .pipe(map(res => res['total'])); } numOfEntityDataproviders(id: string, entity: string, properties:EnvProperties):any { var parameters = ""; if(entity == "organization") { parameters = "organizations/"+id+"/datasources/count"; } let url = properties.searchAPIURLLAst+parameters+"?format=json"; return this.numOfDataproviders(url, properties); } numOfSearchDataproviders(params: string, properties:EnvProperties, refineQuery:string=null):any { let url: string = properties.searchAPIURLLAst+"datasources/count?format=json"; if(params != "") { url += "&q=" + StringUtils.URIEncode(params); } if(refineQuery!= null && refineQuery != '' ) { url += refineQuery; } return this.numOfDataproviders(url, properties); } numOfSearchDataproviders2(params: string, properties:EnvProperties, refineQuery:string=null):any { let url: string = properties.searchAPIURLLAst+"resources2/?format=json&size=0&type=datasources"; if(params != "") { url += "&query=" +params; } if(refineQuery!= null && refineQuery != '' ) { url += refineQuery; } return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) .pipe(map(res => res['meta']['total'])); } /* private quote(word: any): string { return '"'+word+'"'; } */ getDataprovidersTableResults (queryType:string, properties:EnvProperties):any { let size: number = 0; let url: string= properties.searchAPIURLLAst; if(queryType == "compatible"){ url += '?query=((oaftype exact datasource) not (datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other) not(datasourcetypeuiid exact "pubsrepository::journal") not(datasourcetypeuiid exact "aggregator::pubsrepository::journals"))'; }else if(queryType=="registries"){ url += "?query=((oaftype exact datasource) and(datasourcetypeuiid = other))"; }else if(queryType=="journals"){ url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) and (datasourcetypeuiid exact "pubsrepository::journal" or datasourcetypeuiid exact "aggregator::pubsrepository::journals" ))'; } url += "&page=0&size=0&format=json"; return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url) //.map(res => res.json()) .pipe(map(res => res['meta'].total)); } }