diff --git a/src/filter.ts b/src/filter.ts index dfa6bbe..8b925f9 100644 --- a/src/filter.ts +++ b/src/filter.ts @@ -57,12 +57,20 @@ export const ft = (ops: SmartAPIKGOperationObject[], criteria: FilterCriteria) = return filters[field].has(rec.association["x-translator"][field]) ? true : false; } else if (field === "qualifiers") { // return true; - if (rec.tags?.includes?.("bte-trapi") || criteria[field] === undefined || criteria[field].length < 1) { + if (criteria[field] === undefined || criteria[field].length < 1) { return true; } return [...filters[field]].some(qualifierConstraintSet => { return Object.entries(qualifierConstraintSet).every(([qualifierType, qualifierValue]) => { - return rec.association[field] && rec.association[field][qualifierType] === qualifierValue; + if (!rec.association[field]) return false; + const qualifierValueArray = Array.isArray(qualifierValue) ? qualifierValue : [qualifierValue]; + const associationValueArray = Array.isArray(rec.association[field][qualifierType]) + ? rec.association[field][qualifierType] + : [rec.association[field][qualifierType]]; + + return qualifierValueArray.some(value => { + return associationValueArray.includes(value); + }); }); }); } else { diff --git a/src/operations_builder/async_operations_builder_with_reasoner.ts b/src/operations_builder/async_operations_builder_with_reasoner.ts index fb6d5e9..b09fe42 100644 --- a/src/operations_builder/async_operations_builder_with_reasoner.ts +++ b/src/operations_builder/async_operations_builder_with_reasoner.ts @@ -67,9 +67,10 @@ export default class AsyncOperationsBuilderWithReasoner extends AsyncOperationsB association: { input_type: this.removeBioLinkPrefix(sbj), output_type: this.removeBioLinkPrefix(obj), - predicate: this.removeBioLinkPrefix(pred), + predicate: this.removeBioLinkPrefix(typeof(pred) === "string" ? pred : pred.predicate), api_name: metadata.title, smartapi: metadata.smartapi, + qualifiers: (typeof(pred) === "string" || !pred.qualifiers) ? undefined : Object.fromEntries(pred.qualifiers.map((q: any) => [this.removeBioLinkPrefix(q.qualifier_type_id), q.applicable_values.map(this.removeBioLinkPrefix)])), "x-translator": metadata["x-translator"], }, tags: [...metadata.tags, ...["bte-trapi"]], diff --git a/src/operations_builder/sync_builder_factory.ts b/src/operations_builder/sync_builder_factory.ts index fd6f44f..b342ad3 100644 --- a/src/operations_builder/sync_builder_factory.ts +++ b/src/operations_builder/sync_builder_factory.ts @@ -7,18 +7,34 @@ export const syncBuilderFactory = ( options: BuilderOptions, includeReasoner: boolean, smartapi_path: string, - predicates_path: string + predicates_path: string, ): SmartAPIKGOperationObject[] => { let builder; if (includeReasoner === true) { - builder = new SyncOperationsBuilderWithReasoner( - options, - smartapi_path, - predicates_path - ); + builder = new SyncOperationsBuilderWithReasoner(options, smartapi_path, predicates_path); } else { builder = new SyncOperationsBuilder(options, smartapi_path); } const ops = builder.build(); + + const primaryKnowledgeAPIs = new Set(); + options.apiList?.include.forEach(api => { + if (api.primarySource) { + if (api.id) primaryKnowledgeAPIs.add(api.id); + if (api.infores) primaryKnowledgeAPIs.add(api.infores); + } + }); + options.apiList?.exclude.forEach(api => { + if (api.primarySource) { + if (api.id) primaryKnowledgeAPIs.add(api.id); + if (api.infores) primaryKnowledgeAPIs.add(api.infores); + } + }); + ops.map(op => { + const apiIsPrimaryKnowledgeSource = + primaryKnowledgeAPIs.has(op.association.smartapi.id) || + primaryKnowledgeAPIs.has(op.association["x-translator"].infores); + op.association.apiIsPrimaryKnowledgeSource = apiIsPrimaryKnowledgeSource ? true : false; + }); return ops; }; diff --git a/src/operations_builder/sync_operations_builder_with_reasoner.ts b/src/operations_builder/sync_operations_builder_with_reasoner.ts index 8fed28c..2c1d36d 100644 --- a/src/operations_builder/sync_operations_builder_with_reasoner.ts +++ b/src/operations_builder/sync_operations_builder_with_reasoner.ts @@ -48,9 +48,10 @@ export default class SyncOperationsBuilderWithReasoner extends BaseOperationsBui input_id: metadata?.nodes?.[sbj]?.id_prefixes, output_type: this.removeBioLinkPrefix(obj), output_id: metadata?.nodes?.[obj]?.id_prefixes, - predicate: this.removeBioLinkPrefix(pred), + predicate: this.removeBioLinkPrefix(typeof(pred) === "string" ? pred : pred.predicate), api_name: metadata.association.api_name, smartapi: metadata.association.smartapi, + qualifiers: (typeof(pred) === "string" || !pred.qualifiers) ? undefined : Object.fromEntries(pred.qualifiers.map((q: any) => [this.removeBioLinkPrefix(q.qualifier_type_id), q.applicable_values.map(this.removeBioLinkPrefix)])), "x-translator": metadata.association["x-translator"], "x-trapi": metadata.association["x-trapi"], }, @@ -78,7 +79,7 @@ export default class SyncOperationsBuilderWithReasoner extends BaseOperationsBui const includeInfoRes = this._options.apiList.include.find(api => api.infores === op.association?.["x-translator"]?.infores && api.infores !== undefined) const excludeSmartAPI = this._options.apiList.exclude.find(api => api.id === op.association.smartapi.id && api.id !== undefined); const excludeInfoRes = this._options.apiList.exclude.find(api => api.infores === op.association?.["x-translator"]?.infores && api.infores !== undefined) - + let willBeIncluded; let apiValue; if (excludeSmartAPI) { diff --git a/src/parser/types.ts b/src/parser/types.ts index 15cc99b..d1c4a63 100644 --- a/src/parser/types.ts +++ b/src/parser/types.ts @@ -1,7 +1,7 @@ export interface XTranslatorObject { component: string; team: string[]; - "infores"?: string; + infores?: string; } interface SmartAIPInfoObject { @@ -111,7 +111,7 @@ export interface XBTEKGSOperationObject { inputs: XBTEKGSOperationBioEntityObject[]; outputs: XBTEKGSOperationBioEntityObject[]; predicate: string; - qualifiers?: { [qualifierType: string]: string; }; + qualifiers?: { [qualifierType: string]: string }; source?: string; parameters?: XBTEParametersObject; requestBody?: any; @@ -157,11 +157,12 @@ interface KGAssociationObject { source?: string; api_name?: string; component?: string; + apiIsPrimaryKnowledgeSource?: boolean; smartapi?: SmartAPIRegistryRecordObject; "x-translator"?: any; "x-trapi"?: XTRAPIObject; qualifiers?: { - [qualifierType: string]: string; + [qualifierType: string]: string | string[]; } } diff --git a/src/types.ts b/src/types.ts index 839c17f..bf5ed92 100644 --- a/src/types.ts +++ b/src/types.ts @@ -5,6 +5,7 @@ export interface SmartAPIQueryResult { } export interface apiListItem { + primarySource?: boolean; id?: string; infores?: string; name: string; @@ -58,7 +59,7 @@ interface PredicatesNode { } interface ReasonerSubjectAndPredicate { - [propName: string]: string[]; + [propName: string]: (string | any)[]; } export interface ReasonerPredicatesResponse {