Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/biothings/call-apis.js into…
Browse files Browse the repository at this point in the history
… dev
  • Loading branch information
tokebe committed Apr 12, 2024
2 parents d3c967c + ef7b1f9 commit b93e3f7
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 184 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
"@biothings-explorer/smartapi-kg": "workspace:../smartapi-kg",
"biomedical_id_resolver": "workspace:../biomedical_id_resolver",
"@biothings-explorer/utils": "workspace:../utils",
"@biothings-explorer/types": "workspace:../types",
"@sentry/node": "^7.74.1",
"axios": "^0.21.4",
"axios-retry": "^3.8.1",
Expand Down
6 changes: 4 additions & 2 deletions src/builder/base_query_builder.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AxiosRequestConfig, Method } from "axios";
import { QueryParams, APIEdge } from "../types";
import { QueryParams, APIEdge, QueryHandlerOptions } from "../types";

/**
* Build API queries serving as input for Axios library based on BTE Edge info
Expand All @@ -10,14 +10,16 @@ export default class BaseQueryBuilder {
APIEdge: APIEdge;
delayUntil: Date;
config: AxiosRequestConfig;
options: QueryHandlerOptions;
/**
* Constructor for Query Builder
* @param {object} APIEdge - BTE Edge object with input field provided
*/
constructor(APIEdge: APIEdge) {
constructor(APIEdge: APIEdge, options: QueryHandlerOptions) {
this.start = 0;
this.hasNext = false;
this.APIEdge = APIEdge;
this.options = options;
}

getUrl(): string {
Expand Down
9 changes: 5 additions & 4 deletions src/builder/builder_factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@ import TRAPIQueryBuilder from "./trapi_query_builder";
import TemplateQueryBuilder from "./template_query_builder";
import Debug from "debug";
const debug = Debug("bte:call-apis:query");
import type { APIEdge } from "../types";
import type { APIEdge, QueryHandlerOptions } from "../types";

function builderFactory(
APIEdge: APIEdge,
options: QueryHandlerOptions
): TRAPIQueryBuilder | TemplateQueryBuilder | QueryBuilder {
if ("tags" in APIEdge && APIEdge.tags.includes("bte-trapi")) {
debug(`using trapi builder now`);
return new TRAPIQueryBuilder(APIEdge);
return new TRAPIQueryBuilder(APIEdge, options);
} else if (APIEdge.query_operation.useTemplating) {
debug("using template builder");
return new TemplateQueryBuilder(APIEdge);
return new TemplateQueryBuilder(APIEdge, options);
}
debug("using default builder");
return new QueryBuilder(APIEdge);
return new QueryBuilder(APIEdge, options);
}

export default builderFactory;
19 changes: 11 additions & 8 deletions src/builder/trapi_query_builder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { APIEdge, TrapiResponse } from "../types";
import type { APIEdge } from "../types";
import { TrapiQuery, TrapiResponse } from "@biothings-explorer/types";
import { AxiosRequestConfig, Method } from "axios";
import { TrapiRequest } from "../types";
import BaseQueryBuilder from "./base_query_builder";

/**
Expand Down Expand Up @@ -42,8 +42,8 @@ export default class TRAPIQueryBuilder extends BaseQueryBuilder {
/**
* Construct TRAPI request body
*/
_getRequestBody(APIEdge: APIEdge, input: string | string[]): TrapiRequest {
const queryGraph: TrapiRequest = {
_getRequestBody(APIEdge: APIEdge, input: string | string[]): TrapiQuery {
const queryBody: TrapiQuery = {
message: {
query_graph: {
nodes: {
Expand All @@ -68,20 +68,23 @@ export default class TRAPIQueryBuilder extends BaseQueryBuilder {
};
const qualifierConstraints = APIEdge.reasoner_edge?.getQualifierConstraints?.();
if (qualifierConstraints) {
queryGraph.message.query_graph.edges.e01.qualifier_constraints =
queryBody.message.query_graph.edges.e01.qualifier_constraints =
qualifierConstraints;
}
if (this.options.caching === false) {
queryBody.bypass_cache = true;
}
const xmaturityMap = {
ci: "staging",
test: "test",
prod: "prod",
dev: "dev",
};
if (process.env.INSTANCE_ENV)
queryGraph.submitter += `; bte-${xmaturityMap[process.env.INSTANCE_ENV]}`;
queryBody.submitter += `; bte-${xmaturityMap[process.env.INSTANCE_ENV]}`;
if (this.originalSubmitter)
queryGraph.submitter += `; subquery for client "${this.originalSubmitter}"`;
return queryGraph;
queryBody.submitter += `; subquery for client "${this.originalSubmitter}"`;
return queryBody;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export default class APIQueryDispatcher {

_constructQueries(APIEdges: APIEdge[]) {
return APIEdges.map(edge => {
const built = queryBuilder(edge);
const built = queryBuilder(edge, this.options);
if (built instanceof TRAPIQueryBuilder) {
built.addSubmitter?.(this.options.submitter);
}
Expand Down
169 changes: 1 addition & 168 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { SmartAPIKGOperationObject } from "@biothings-explorer/smartapi-kg";
import { SmartAPISpec } from "@biothings-explorer/smartapi-kg";
import { Record } from "@biothings-explorer/api-response-transform";
import { StampedLog } from "@biothings-explorer/utils";
import { SRIBioEntity } from "biomedical_id_resolver";
import { TrapiQualifierConstraint } from "@biothings-explorer/types";

/* TODO: most of these are temporarily pulled from other packages
* Instead, they should be pulled out into a new package ('@biothings-explorer/types' or similar).
Expand All @@ -19,173 +19,6 @@ export interface BiothingsResponse {
max_total?: number;
}

export interface TrapiQNode {
ids?: string[];
categories?: string[];
is_set?: boolean;
constraints?: TrapiAttributeConstraint[];
}

export interface TrapiQEdge {
knowledge_type?: string;
predicates?: string[];
subject: string;
object: string;
attribute_constraints?: TrapiAttributeConstraint[];
qualifier_constraints?: TrapiQualifierConstraint[];
}

export interface TrapiQueryGraph {
nodes: {
[QNodeID: string]: TrapiQNode;
};
edges: {
[QEdgeID: string]: TrapiQEdge;
};
}

export interface TrapiSource {
resource_id: string;
resource_role: string;
upstream_resource_ids?: string[];
}

export interface TrapiKGNodes {
[nodeID: string]: TrapiKGNode;
}

export interface TrapiKGEdges {
[edgeID: string]: TrapiKGEdge;
}

export interface TrapiKnowledgeGraph {
nodes: TrapiKGNodes;
edges: TrapiKGEdges;
}

export interface TrapiKGEdge {
predicate: string;
subject: string;
object: string;
attributes?: TrapiAttribute[];
qualifiers?: TrapiQualifier[];
sources: TrapiSource[];
}

export interface TrapiKGNode {
categories: string[];
name: string;
attributes?: TrapiAttribute[];
}

export interface TrapiAttribute {
attribute_type_id: string;
original_attribute_name?: string;
value: string | string[] | number | number[];
value_type_id?: string;
attribute_source?: string | null;
value_url?: string | null;
attributes?: TrapiAttribute;
[additionalProperties: string]:
| string
| string[]
| null
| TrapiAttribute
| number
| number[];
}

export interface TrapiQualifier {
qualifier_type_id: string;
qualifier_value: string | string[];
}

export interface TrapiQualifierConstraint {
qualifier_set: TrapiQualifier[];
}

export interface TrapiAttributeConstraint {
id: string;
name: string;
not: boolean;
operator: string;
value: string | string[] | number | number[];
}

export interface TrapiNodeBinding {
id: string;
query_id?: string;
attributes?: TrapiAttribute[];
}

export interface TrapiEdgeBinding {
id: string;
attributes?: TrapiAttribute[];
}

export interface TrapiAnalysis {
resource_id?: string;
score?: number;
edge_bindings: {
[qEdgeID: string]: TrapiEdgeBinding[];
};
support_graphs?: string[];
scoring_method?: string;
attributes?: TrapiAttribute[];
}

export interface TrapiAuxiliaryGraph {
edges: string[];
attributes?: TrapiAttribute[];
}

export interface TrapiPfocrFigure {
figureUrl: string;
pmc: string;
matchedCuries: string[];
score: number;
}

export interface TrapiResult {
node_bindings: {
[qNodeID: string]: TrapiNodeBinding[];
};
analyses: TrapiAnalysis[];
pfocr?: TrapiPfocrFigure[];
}

export interface TrapiAuxGraphCollection {
[supportGraphID: string]: TrapiAuxiliaryGraph;
}

export interface TrapiResponse {
description?: string;
schema_version?: string;
biolink_version?: string;
workflow?: { id: string }[];
message: {
query_graph: TrapiQueryGraph;
knowledge_graph: TrapiKnowledgeGraph;
auxiliary_graphs?: TrapiAuxGraphCollection;
results: TrapiResult[];
};
logs: TrapiLog[];
}

export interface TrapiLog {
timestamp: string;
level: string;
message: string;
code: string;
}

export interface TrapiRequest {
message: {
query_graph: any;
};
submitter?: string;
}

export interface JSONDoc {
[key1: string]: any;
[key2: number]: any;
Expand Down
6 changes: 5 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"@biothings-explorer/smartapi-kg": ["../smartapi-kg"],
"@biothings-explorer/api-response-transform": ["../api-response-transform"],
"biomedical_id_resolver": ["../biomedical_id_resolver"],
"@biothings-explorer/utils": ["../utils"]
"@biothings-explorer/utils": ["../utils"],
"@biothings-explorer/types": ["../types"]
}
},
"include": ["./src/**/*"],
Expand All @@ -25,6 +26,9 @@
},
{
"path": "../utils"
},
{
"path": "../types"
}
]
}

0 comments on commit b93e3f7

Please sign in to comment.