[develop | DONE | CHANGED]: Moved predefined query checks to "fq" field instead of "query" | Updated cachingRequests | Temporary bug fix in refine fields dependent to static refine fields.
1. searchOrganizations.service.ts: In method "numOfSearchOrganizations2()" and in method "advancedSearchOrganizations()" moved predefined query checks to "fq" field instead of "query". 2. entitySearch.service.ts: Mark method "searchByDepositType()" as @deprecated since it is not used anymore. 3. searchDataProviders.component.ts: In methods "_getFilters()" and "getResults()" updated parameters to set predefined query checks to "fq" field instead of "query" for repositories, journals, entity registries, but keep in "query" field for deposit search. 4. cache-interceptor.service.ts: Updated urls in cachingRequests table and checks in "checkForCachedRequests()" method. 5. searchFields.base.ts: [Bug fix] Temporarily removed from HIDDEN_FIELDS and "DEPENDENT_FIELDS" the "instancetypename" field - there is a bug with static refine fields, until the "angular-16-irish-monitor" branch is merged.
This commit is contained in:
parent
6b5b7df8be
commit
243e736362
|
@ -8,29 +8,39 @@ import { properties } from "../../environments/environment";
|
||||||
export class CacheInterceptorService implements HttpInterceptor {
|
export class CacheInterceptorService implements HttpInterceptor {
|
||||||
cachingRequests = [
|
cachingRequests = [
|
||||||
// Remove 2 following lines when bug with hidden refine filters is solved.
|
// Remove 2 following lines when bug with hidden refine filters is solved.
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=relfundinglevel0_id&fields=relproject&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&fields=country&&fq=resultbestaccessright exact \"Open Access\"&type=results&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=relfundinglevel0_id&fields=relproject&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright exact \"Open Access\"&type=results&page=0&size=0",
|
||||||
"/resources2/?format=json&refine=true&fields=funder&fields=fundinglevel0_id&fields=projectstartyear&fields=projectendyear&fields=projectoamandatepublications&&type=projects&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=funder&fields=fundinglevel0_id&fields=projectstartyear&fields=projectendyear&fields=projectoamandatepublications&&type=projects&page=0&size=0",
|
||||||
|
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=results&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=results&page=0&size=0",
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=relfundinglevel0_id&fields=relproject&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&fields=country&&fq=resultbestaccessright%20exact%20%22Open%20Access%22&fq=relfunder%20exact%20%22ec__________%3A%3AEC%7C%7CEuropean%20Commission%7C%7CEC%22&type=results&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=relfundinglevel0_id&fields=relproject&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright%20exact%20%22Open%20Access%22&fq=relfunder%20exact%20%22ec__________%3A%3AEC%7C%7CEuropean%20Commission%7C%7CEC%22&type=results&page=0&size=0",
|
||||||
|
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=publications&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=publications&page=0&size=0",
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=datasets&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=datasets&page=0&size=0",
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=software&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=software&page=0&size=0",
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=other&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=other&page=0&size=0",
|
||||||
|
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright%20exact%20%22Open%20Access%22&type=results&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright%20exact%20%22Open%20Access%22&type=results&page=0&size=0",
|
||||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright exact \"Open Access\"&type=results&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright exact \"Open Access\"&type=results&page=0&size=0",
|
||||||
"/resources2/?format=json&refine=true&fields=funder&fields=projectstartyear&fields=projectendyear&fields=projectoamandatepublications&&type=projects&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=funder&fields=projectoamandatepublications&fields=projectstartyear&fields=projectendyear&&type=projects&page=0&size=0",
|
||||||
"/resources2/?format=json&refine=true&fields=eoscdatasourcetype&fields=datasourceodlanguages&fields=datasourceodcontenttypes&fields=datasourcecompatibilityname&fields=country&fields=collectedfromname&fields=datasourcethematic&fields=datasourcejurisdiction&&type=datasources&page=0&size=0",
|
"/resources2/?format=json&refine=true&fields=eoscdatasourcetype&fields=datasourceodlanguages&fields=datasourceodcontenttypes&fields=datasourcecompatibilityname&fields=country&fields=collectedfromname&fields=datasourcethematic&fields=datasourcejurisdiction&&type=datasources&page=0&size=0",
|
||||||
"/resources2/?format=json&query= ( (reldatasourcecompatibilityid exact driver or reldatasourcecompatibilityid exact driver-openaire2.0 or reldatasourcecompatibilityid exact openaire2.0 or reldatasourcecompatibilityid exact openaire3.0 or reldatasourcecompatibilityid exact openaire4.0 or reldatasourcecompatibilityid exact openaire-cris_1.1 or reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*) ) &refine=true&fields=country&&type=organizations&page=0&size=0",
|
// "/resources2/?format=json&query= ( (reldatasourcecompatibilityid exact driver or reldatasourcecompatibilityid exact driver-openaire2.0 or reldatasourcecompatibilityid exact openaire2.0 or reldatasourcecompatibilityid exact openaire3.0 or reldatasourcecompatibilityid exact openaire4.0 or reldatasourcecompatibilityid exact openaire-cris_1.1 or reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*) ) &refine=true&fields=country&&type=organizations&page=0&size=0",
|
||||||
|
"/resources2/?format=json&refine=true&fields=country&&type=organizations&fq=(reldatasourcecompatibilityid exact driver or reldatasourcecompatibilityid exact driver-openaire2.0 or reldatasourcecompatibilityid exact openaire2.0 or reldatasourcecompatibilityid exact openaire3.0 or reldatasourcecompatibilityid exact openaire4.0 or reldatasourcecompatibilityid exact openaire-cris_1.1 or reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*)&page=0&size=0&minRef=true",
|
||||||
|
|
||||||
"/projects/?format=json&refine=true&page=1&size=0&fields=funder",
|
"/resources2/?format=json&size=0&type=organizations&fq=(reldatasourcecompatibilityid exact driver or reldatasourcecompatibilityid exact driver-openaire2.0 or reldatasourcecompatibilityid exact openaire2.0 or reldatasourcecompatibilityid exact openaire3.0 or reldatasourcecompatibilityid exact openaire4.0 or reldatasourcecompatibilityid exact openaire-cris_1.1 or reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*)",
|
||||||
|
|
||||||
|
// "/projects/?format=json&refine=true&page=1&size=0&fields=funder",
|
||||||
|
"/projects/?fields=funder&sf=funder&format=json&size=0",
|
||||||
|
"/results/?fields=relfunder&sf=relfunder&format=json&size=0",
|
||||||
|
|
||||||
"/resources/?format=json&query=( oaftype exact datasource and (eoscdatasourcetype exact \"Journal Archive\" or eoscdatasourcetype exact \"Repository\"))&refine=true&fields=datasourcetypename&fields=country&fields=datasourceodsubjects&fields=datasourceodcontenttypes&fields=datasourcecompatibilityname&fields=datasourcethematic&fields=datasourcejurisdiction&&type=datasources&page=0&size=0",
|
"/resources/?format=json&query=( oaftype exact datasource and (eoscdatasourcetype exact \"Journal Archive\" or eoscdatasourcetype exact \"Repository\"))&refine=true&fields=datasourcetypename&fields=country&fields=datasourceodsubjects&fields=datasourceodcontenttypes&fields=datasourcecompatibilityname&fields=datasourcethematic&fields=datasourcejurisdiction&&type=datasources&page=0&size=0",
|
||||||
|
|
||||||
"/search/v2/api/datasources/count?format=json", "/search/v2/api/publications/count?format=json", "/search/v2/api/datasets/count?format=json", "/search/v2/api/software/count?format=json", "/search/v2/api/other/count?format=json",
|
"/search/v2/api/datasources/count?format=json", "/search/v2/api/publications/count?format=json", "/search/v2/api/datasets/count?format=json", "/search/v2/api/software/count?format=json", "/search/v2/api/other/count?format=json",
|
||||||
"relresulttype%3Dpublication"
|
"relresulttype%3Dpublication",
|
||||||
|
|
||||||
|
"/resources2/?format=json&size=0&type=projects",
|
||||||
|
"/resources2/?format=json&size=0&type=datasources",
|
||||||
|
"/resources2/?format=json&size=0&type=results",
|
||||||
|
"/resources2/?format=json&size=0&type=results&fq=resultbestaccessright%20exact%20%22Open%20Access%22"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,7 +63,8 @@ export class CacheInterceptorService implements HttpInterceptor {
|
||||||
if (!properties.useLongCache) {
|
if (!properties.useLongCache) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(url.indexOf("refine=true") !== -1 || url.indexOf("/count?format=json") !== -1 || url.indexOf("relresulttype%3Dpublication") !== -1) {
|
if(url.indexOf("sf=") !== -1 || url.indexOf("refine=true") !== -1 || url.indexOf("/count?format=json") !== -1 || url.indexOf("relresulttype%3Dpublication") !== -1 ||
|
||||||
|
(url.indexOf("?format=json&size=0&type=") !== -1 && url.indexOf("query=") == -1)) {
|
||||||
return this.cachingRequests.some(partUrl => (url.indexOf(partUrl) !== -1));
|
return this.cachingRequests.some(partUrl => (url.indexOf(partUrl) !== -1));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -190,7 +190,17 @@ export class SearchDataProvidersComponent {
|
||||||
this.searchPageUpdates.emit({disableForms: this.disableForms, disableRefineForms: this.disableRefineForms, searchUtils: this.searchUtils});
|
this.searchPageUpdates.emit({disableForms: this.disableForms, disableRefineForms: this.disableRefineForms, searchUtils: this.searchUtils});
|
||||||
|
|
||||||
let datasourceQueryPrefix = DatasourcesHelperClass.getQueryPrefix(this.type);
|
let datasourceQueryPrefix = DatasourcesHelperClass.getQueryPrefix(this.type);
|
||||||
this.searchFiltersSub = this._searchDataProvidersService.advancedSearchDataproviders( datasourceQueryPrefix +(datasourceQueryPrefix.length > 0 && parameters.length > 0 ?' and (':'') + parameters +(datasourceQueryPrefix.length > 0 && parameters.length > 0 ?' ) ':''), page, size, this.properties, (refine /*&& (this.type=="all" || this.type == "deposit")*/) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineFieldsFilterQuery, (this.type == "deposit"), true)
|
let isDeposit: boolean = (this.type == "deposit");
|
||||||
|
let parametersFull;
|
||||||
|
let refineQueryFull;
|
||||||
|
if(isDeposit) {
|
||||||
|
parametersFull = datasourceQueryPrefix +(datasourceQueryPrefix.length > 0 && parameters.length > 0 ?' and (':'') + parameters +(datasourceQueryPrefix.length > 0 && parameters.length > 0 ?' ) ':'');
|
||||||
|
refineQueryFull = refineFieldsFilterQuery;
|
||||||
|
} else {
|
||||||
|
parametersFull = parameters;
|
||||||
|
refineQueryFull = refineFieldsFilterQuery+(refineFieldsFilterQuery.length > 0 && datasourceQueryPrefix.length >0 ? "&" : "")+(datasourceQueryPrefix.length>0 ? "fq=" : "")+datasourceQueryPrefix;
|
||||||
|
}
|
||||||
|
this.searchFiltersSub = this._searchDataProvidersService.advancedSearchDataproviders( parametersFull, page, size, this.properties, (refine /*&& (this.type=="all" || this.type == "deposit")*/) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineQueryFull, isDeposit, true)
|
||||||
//.switchMap(
|
//.switchMap(
|
||||||
.subscribe(
|
.subscribe(
|
||||||
data => {
|
data => {
|
||||||
|
@ -262,7 +272,17 @@ export class SearchDataProvidersComponent {
|
||||||
this.searchUtils.totalResults = 0;
|
this.searchUtils.totalResults = 0;
|
||||||
|
|
||||||
let datasourceQueryPrefix = DatasourcesHelperClass.getQueryPrefix(this.type);
|
let datasourceQueryPrefix = DatasourcesHelperClass.getQueryPrefix(this.type);
|
||||||
this.searchResultsSub = this._searchDataProvidersService.advancedSearchDataproviders( datasourceQueryPrefix +(datasourceQueryPrefix.length > 0 && parameters.length > 0 ?' and (':'') + parameters +(datasourceQueryPrefix.length > 0 && parameters.length > 0 ?' ) ':''), page, size, this.properties, null, this.searchPage.getFields(), refineFieldsFilterQuery, (this.type == "deposit")).subscribe(
|
let isDeposit: boolean = (this.type == "deposit");
|
||||||
|
let parametersFull;
|
||||||
|
let refineQueryFull;
|
||||||
|
if(isDeposit) {
|
||||||
|
parametersFull = datasourceQueryPrefix +(datasourceQueryPrefix.length > 0 && parameters.length > 0 ?' and (':'') + parameters +(datasourceQueryPrefix.length > 0 && parameters.length > 0 ?' ) ':'');
|
||||||
|
refineQueryFull = refineFieldsFilterQuery;
|
||||||
|
} else {
|
||||||
|
parametersFull = parameters;
|
||||||
|
refineQueryFull = refineFieldsFilterQuery+(refineFieldsFilterQuery.length > 0 && datasourceQueryPrefix.length >0 ? "&" : "")+(datasourceQueryPrefix.length>0 ? "fq=" : "")+datasourceQueryPrefix;
|
||||||
|
}
|
||||||
|
this.searchResultsSub = this._searchDataProvidersService.advancedSearchDataproviders( parametersFull, page, size, this.properties, null, this.searchPage.getFields(), refineQueryFull, isDeposit).subscribe(
|
||||||
data => {
|
data => {
|
||||||
let totalResults = data[0];
|
let totalResults = data[0];
|
||||||
let results = data[1];
|
let results = data[1];
|
||||||
|
|
|
@ -63,11 +63,12 @@ export class SearchOrganizationsService {
|
||||||
"reldatasourcecompatibilityid exact openaire-cris_1.1 or " +
|
"reldatasourcecompatibilityid exact openaire-cris_1.1 or " +
|
||||||
"reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*)";
|
"reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*)";
|
||||||
|
|
||||||
url += "&query=";
|
// url += "&query=";
|
||||||
if(params!= null && params != '' ) {
|
if(params!= null && params != '' ) {
|
||||||
url +=" ( "+basicQuery+ " ) " +" and (" + params + ")";
|
// url +=" ( "+basicQuery+ " ) " +" and (" + params + ")";
|
||||||
}else{
|
url +="&query=(" + params + ")";
|
||||||
url +=" ( "+basicQuery+ " ) ";
|
// }else{
|
||||||
|
// url +=" ( "+basicQuery+ " ) ";
|
||||||
}
|
}
|
||||||
if(refineParams!= null && refineParams != '' ) {
|
if(refineParams!= null && refineParams != '' ) {
|
||||||
url += refineParams;
|
url += refineParams;
|
||||||
|
@ -75,6 +76,7 @@ export class SearchOrganizationsService {
|
||||||
if(refineQuery) {
|
if(refineQuery) {
|
||||||
url += "&" + refineQuery;
|
url += "&" + refineQuery;
|
||||||
}
|
}
|
||||||
|
url += "&fq="+basicQuery;
|
||||||
url += "&page="+(page-1)+"&size="+size;
|
url += "&page="+(page-1)+"&size="+size;
|
||||||
url += minRef ? "&minRef=true" : "";
|
url += minRef ? "&minRef=true" : "";
|
||||||
|
|
||||||
|
@ -212,15 +214,17 @@ export class SearchOrganizationsService {
|
||||||
"reldatasourcecompatibilityid exact openaire-cris_1.1 or " +
|
"reldatasourcecompatibilityid exact openaire-cris_1.1 or " +
|
||||||
"reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*)";
|
"reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*)";
|
||||||
|
|
||||||
url += "&query=";
|
// url += "&query=";
|
||||||
if(params!= null && params != '' ) {
|
if(params!= null && params != '' ) {
|
||||||
url +=" ( "+basicQuery+ " ) " +" and (" + params + ")";
|
// url +=" ( "+basicQuery+ " ) " +" and (" + params + ")";
|
||||||
}else{
|
url +="&query=( "+params+ " ) ";
|
||||||
url +=" ( "+basicQuery+ " ) ";
|
// }else{
|
||||||
|
// url +=" ( "+basicQuery+ " ) ";
|
||||||
}
|
}
|
||||||
if(refineParams!= null && refineParams != '' ) {
|
if(refineParams!= null && refineParams != '' ) {
|
||||||
url += refineParams;
|
url += refineParams;
|
||||||
}
|
}
|
||||||
|
url += "&fq="+basicQuery;
|
||||||
return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url)
|
return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url)
|
||||||
.pipe(map(res => res['meta']['total']));
|
.pipe(map(res => res['meta']['total']));
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,11 @@ export class EntitiesSearchService {
|
||||||
return [{id:'-2',label:'Error'}];
|
return [{id:'-2',label:'Error'}];
|
||||||
});
|
});
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
// not used
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
searchByDepositType(keyword:string, DepositType:string, properties:EnvProperties ):any {
|
searchByDepositType(keyword:string, DepositType:string, properties:EnvProperties ):any {
|
||||||
this.ready = false;
|
this.ready = false;
|
||||||
|
|
||||||
|
|
|
@ -770,7 +770,9 @@ export class SearchFieldsBase {
|
||||||
|
|
||||||
//add project field depending on funder
|
//add project field depending on funder
|
||||||
public HIDDEN_FIELDS: string[] = ["fundinglevel0_id", "fundinglevel1_id", "fundinglevel2_id",
|
public HIDDEN_FIELDS: string[] = ["fundinglevel0_id", "fundinglevel1_id", "fundinglevel2_id",
|
||||||
"relfundinglevel0_id", "relfundinglevel1_id", "relfundinglevel2_id", "relproject", "instancetypename"];
|
"relfundinglevel0_id", "relfundinglevel1_id", "relfundinglevel2_id", "relproject",
|
||||||
|
// "instancetypename"
|
||||||
|
];
|
||||||
|
|
||||||
public DEPENDENT_FIELDS: { [key: string]: string } = {
|
public DEPENDENT_FIELDS: { [key: string]: string } = {
|
||||||
["relproject"]: "relfunder",
|
["relproject"]: "relfunder",
|
||||||
|
@ -780,7 +782,7 @@ export class SearchFieldsBase {
|
||||||
["relfundinglevel0_id"]: "relfunder",
|
["relfundinglevel0_id"]: "relfunder",
|
||||||
["relfundinglevel1_id"]: "relfundinglevel0_id",
|
["relfundinglevel1_id"]: "relfundinglevel0_id",
|
||||||
["relfundinglevel2_id"]: "relfundinglevel1_id",
|
["relfundinglevel2_id"]: "relfundinglevel1_id",
|
||||||
["instancetypename"]: "type"
|
// ["instancetypename"]: "type"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue