import type { Step, UnbatchedExecutionExtra } from "grafast";
import { UnbatchedStep } from "grafast";
import type { SQL } from "pg-sql2";
import type { PgCodecAttribute } from "../codecs.ts";
import type { PgResource } from "../datasource.ts";
import type { GetPgResourceAttributes, GetPgResourceCodec, GetPgResourceRelations, PgCodec, PgQueryRootStep, PgRegistry, PgSQLCallbackOrDirect, PgTypedStep } from "../interfaces.ts";
import type { PlantimeEmbeddable } from "../utils.ts";
import { PgClassExpressionStep } from "./pgClassExpression.ts";
import type { PgSelectMode } from "./pgSelect.ts";
import { PgSelectStep } from "./pgSelect.ts";
export interface PgSelectSinglePlanOptions {
    fromRelation?: [PgSelectSingleStep<PgResource>, string];
}
/**
 * Represents the single result of a unique PgSelectStep. This might be
 * retrieved explicitly by PgSelectStep.single(), or implicitly (via Grafast)
 * by PgSelectStep.item(). Since this is the result of a fetch it does not make
 * sense to support changing `.where` or similar; however we now add methods
 * such as `.get` and `.cursor` which can receive specific properties by
 * telling the PgSelectStep to select the relevant expressions.
 */
export declare class PgSelectSingleStep<TResource extends PgResource<any, any, any, any, any> = PgResource> extends UnbatchedStep<unknown[] | null> implements PgTypedStep<TResource extends PgResource<any, infer UCodec, any, any, any> ? UCodec : never> {
    static $$export: {
        moduleName: string;
        exportName: string;
    };
    isSyncAndSafe: boolean;
    readonly pgCodec: GetPgResourceCodec<TResource>;
    readonly itemStepId: number;
    readonly mode: PgSelectMode;
    private classStepId;
    private nullCheckId;
    readonly resource: TResource;
    private _coalesceToEmptyObject;
    private fromRelation;
    constructor($class: PgSelectStep<TResource>, $item: Step<unknown[]>, options?: PgSelectSinglePlanOptions);
    coalesceToEmptyObject(): void;
    toStringMeta(): string;
    getClassStep(): PgSelectStep<TResource>;
    __inferGet?: {
        [TAttr in keyof GetPgResourceAttributes<TResource>]: PgClassExpressionStep<GetPgResourceAttributes<TResource>[TAttr] extends PgCodecAttribute<infer UCodec, any> ? UCodec : never, TResource>;
    };
    /**
     * Returns a plan representing a named attribute (e.g. column) from the class
     * (e.g. table).
     */
    get<TAttr extends keyof GetPgResourceAttributes<TResource>>(attr: TAttr): PgClassExpressionStep<GetPgResourceAttributes<TResource>[TAttr] extends PgCodecAttribute<infer UCodec, any> ? UCodec : never, TResource>;
    private _getInternal;
    getMeta(key: string): import("grafast").AccessStep<unknown>;
    /**
     * Returns a plan representing the result of an expression.
     */
    select<TExpressionCodec extends PgCodec>(fragment: PgSQLCallbackOrDirect<SQL, this | PlantimeEmbeddable>, codec: TExpressionCodec, guaranteedNotNull?: boolean): PgClassExpressionStep<TExpressionCodec, TResource>;
    scopedSQL: <T>(cb: PgSQLCallbackOrDirect<T, this | PlantimeEmbeddable>) => T;
    getPgRoot(): PgQueryRootStep;
    /** @deprecated Use .getPgRoot().placeholder() */
    placeholder($step: PgTypedStep<any>): SQL;
    /** @deprecated Use .getPgRoot().placeholder() */
    placeholder($step: Step, codec: PgCodec): SQL;
    deferredSQL($step: Step<SQL>): SQL;
    private existingSingleRelation;
    singleRelation<TRelationName extends keyof GetPgResourceRelations<TResource>>(relationIdentifier: TRelationName): PgSelectSingleStep<GetPgResourceRelations<TResource>[TRelationName]["remoteResource"]>;
    manyRelation<TRelationName extends keyof GetPgResourceRelations<TResource>>(relationIdentifier: TRelationName): PgSelectStep<GetPgResourceRelations<TResource>[TRelationName]["remoteResource"]>;
    record(): PgClassExpressionStep<GetPgResourceCodec<TResource>, TResource>;
    toRecord(): Step;
    deduplicate(peers: PgSelectSingleStep<any>[]): PgSelectSingleStep<TResource>[];
    private nonNullAttribute;
    private nullCheckAttributeIndex;
    optimize(): this;
    unbatchedExecute(_extra: UnbatchedExecutionExtra, result: string[] | null): unknown[] | null;
}
/**
 * Given a plan that represents a single record (via
 * PgSelectSingleStep.record()) this turns it back into a PgSelectSingleStep
 */
export declare function pgSelectFromRecord<TResource extends PgResource<any, PgCodec<any, any, any, any, any, any, any>, any, any, PgRegistry>>(resource: TResource, $record: PgClassExpressionStep<GetPgResourceCodec<TResource>, TResource> | Step<{
    [Attr in keyof TResource["codec"]["attributes"]]: Step;
}>): PgSelectStep<TResource>;
/**
 * Given a plan that represents a single record (via
 * PgSelectSingleStep.record()) this turns it back into a PgSelectSingleStep
 */
export declare function pgSelectSingleFromRecord<TResource extends PgResource<any, any, any, any>>(resource: TResource, $record: PgClassExpressionStep<GetPgResourceCodec<TResource>, TResource> | Step): PgSelectSingleStep<TResource>;
//# sourceMappingURL=pgSelectSingle.d.ts.map