import {Logger} from "tslog"; import {loggerSettings} from "../utils/loggerSettings"; import {Query} from "./Query"; import {QueryContext} from "../utils/queryContext"; import {AggregatedQuery} from "./AggregatedQuery"; import {Bindings} from "@comunica/bindings-factory"; import {SolidClient} from "../classes/SolidClient"; import {QueryExecutor} from "incremunica"; import {QueryExplanation} from "incremunica"; export class LocalQuery extends Query { private logger = new Logger(loggerSettings); private readonly solidClient: SolidClient; private queryExecutor: QueryExecutor | null; private readonly queryExplanation: QueryExplanation; private guardingEnabled = false; setGuardingEnabled = (val: boolean) => this.guardingEnabled = val; isGuardingEnabled = () => this.guardingEnabled; constructor(solidClient: SolidClient, queryContext: QueryContext, queryBindings?: Array) { super(queryContext, queryBindings); this.logger.info("LocalQuery"); this.solidClient = solidClient; this.guardingEnabled = (queryContext.local == undefined)? false : queryContext.local.guarded this.queryExplanation = new QueryExplanation( queryContext.query, queryContext.sources, queryContext.comunicaVersion, queryContext.comunicaContext, queryContext.reasoningRules, queryContext.lenient ); this.queryExecutor = new QueryExecutor( "", this.queryExplanation, this.guardingEnabled ); this.queryExecutor.on("queryEvent", (value) => { if (value === "initialized") { this.afterQueryReady(); } }); } private checkQueryExecutor(): void { if (this.queryExecutor == null) { this.queryExecutor = new QueryExecutor( "", this.queryExplanation, this.guardingEnabled ); this.queryExecutor.on("queryEvent", (value) => { if (value === "initialized") { this.afterQueryReady(); } }); } } async getBindings(): Promise { this.checkQueryExecutor(); await this.queryReadyPromise(); // @ts-ignore this.queryBindings = await this.queryExecutor.getData(); return this.queryBindings; } streamBindings(cb: (bindings: Bindings, addition: boolean) => void): void { this.checkQueryExecutor(); // @ts-ignore this.queryExecutor.on("binding", (bindings: Bindings, addition: boolean) => { cb(bindings, addition); }); } switchQueryType(): AggregatedQuery { //TODO implement return new AggregatedQuery(this.solidClient, this.queryContext, this.queryBindings); } delete(): void { if (this.queryExecutor != null) { this.queryExecutor.delete(); this.queryExecutor = null; } } }