import type { IriTerm, Query, ServicePattern } from "sparqljs";
import type { Bindings } from "../../rdf/bindings.ts";
import ExecutionContext from "../context/execution-context.ts";
import type { PipelineStage } from "../pipeline/pipeline-engine.ts";
import StageBuilder from "./stage-builder.ts";
/**
 * A ServiceStageBuilder is responsible for evaluation a SERVICE clause in a SPARQL query.
 */
export default class ServiceStageBuilder extends StageBuilder {
    /**
     * Build a {@link PipelineStage} to evaluate a SERVICE clause
     * @param  source  - Input {@link PipelineStage}
     * @param  node    - Service clause
     * @param  options - Execution options
     * @return A {@link PipelineStage} used to evaluate a SERVICE clause
     */
    execute(source: PipelineStage<Bindings>, node: ServicePattern, context: ExecutionContext): Promise<PipelineStage<Bindings>>;
    /**
     * Returns a {@link PipelineStage} used to evaluate a SERVICE clause
     * @abstract
     * @param source    - Input {@link PipelineStage}
     * @param iri       - Iri of the SERVICE clause
     * @param subquery  - Subquery to be evaluated
     * @param options   - Execution options
     * @return A {@link PipelineStage} used to evaluate a SERVICE clause
     */
    _buildIterator(source: PipelineStage<Bindings>, iri: IriTerm, subquery: Query, context: ExecutionContext): Promise<PipelineStage<Bindings>>;
}
