import type { Entity } from '../../../entity/index.js';
import type { InputValue, Schema, TransformedValue } from '../../../schema/index.js';
import type { IQueryCommand, Query, QueryOptions } from '../../../table/actions/query/index.js';
import { QueryCommand } from '../../../table/actions/query/queryCommand.js';
import type { Table } from '../../../table/index.js';
import { TableAction } from '../../../table/index.js';
import type { Overwrite } from '../../../types/index.js';
import { $meta, $options, $pattern, $schema } from './constants.js';
interface AccessPatternMetadata {
    title?: string;
    description?: string;
    [x: string]: unknown;
}
type MergeOptions<TABLE extends Table, ENTITIES extends Entity[], QUERY extends Query<TABLE>, DEFAULT_OPTIONS extends QueryOptions<TABLE, ENTITIES, QUERY>, CONTEXT_OPTIONS extends QueryOptions<TABLE, ENTITIES, QUERY>> = QueryOptions<TABLE, ENTITIES, QUERY> extends DEFAULT_OPTIONS ? CONTEXT_OPTIONS : QueryOptions<TABLE, ENTITIES, QUERY> extends CONTEXT_OPTIONS ? DEFAULT_OPTIONS : Overwrite<DEFAULT_OPTIONS, CONTEXT_OPTIONS> & CONTEXT_OPTIONS;
export declare class IAccessPattern<TABLE extends Table = Table, ENTITIES extends Entity[] = Entity[], SCHEMA extends Schema = Schema, QUERY extends Query<TABLE> = Query<TABLE>, DEFAULT_OPTIONS extends QueryOptions<TABLE, ENTITIES, QUERY> = QueryOptions<TABLE, ENTITIES, QUERY>, CONTEXT_OPTIONS extends QueryOptions<TABLE, ENTITIES, QUERY> = QueryOptions<TABLE, ENTITIES, QUERY>> extends TableAction<TABLE, ENTITIES> {
    static actionName: "access-pattern";
    [$schema]?: SCHEMA;
    [$pattern]?: (input: Schema extends SCHEMA ? any : TransformedValue<SCHEMA>) => QUERY & {
        options?: CONTEXT_OPTIONS;
    };
    [$options]: DEFAULT_OPTIONS;
    [$meta]: AccessPatternMetadata;
    constructor(table: TABLE, entities?: ENTITIES, schema?: SCHEMA, pattern?: (input: TransformedValue<SCHEMA>) => QUERY & {
        options?: CONTEXT_OPTIONS;
    }, options?: DEFAULT_OPTIONS, meta?: AccessPatternMetadata);
    query(input: InputValue<SCHEMA>): Table extends TABLE ? IQueryCommand : QueryCommand<TABLE, ENTITIES, QUERY, MergeOptions<TABLE, ENTITIES, QUERY, DEFAULT_OPTIONS, CONTEXT_OPTIONS>>;
}
export declare class AccessPattern<TABLE extends Table = Table, ENTITIES extends Entity[] = Entity[], SCHEMA extends Schema = Schema, QUERY extends Query<TABLE> = Query<TABLE>, DEFAULT_OPTIONS extends QueryOptions<TABLE, ENTITIES, QUERY> = QueryOptions<TABLE, ENTITIES, QUERY>, CONTEXT_OPTIONS extends QueryOptions<TABLE, ENTITIES, QUERY> = QueryOptions<TABLE, ENTITIES, QUERY>> extends IAccessPattern<TABLE, ENTITIES, SCHEMA, QUERY, DEFAULT_OPTIONS, CONTEXT_OPTIONS> {
    constructor(table: TABLE, entities?: ENTITIES, schema?: SCHEMA, pattern?: (input: TransformedValue<SCHEMA>) => QUERY & {
        options?: CONTEXT_OPTIONS;
    }, options?: DEFAULT_OPTIONS, meta?: AccessPatternMetadata);
    entities<NEXT_ENTITIES extends Entity[]>(...nextEntities: NEXT_ENTITIES): AccessPattern<TABLE, NEXT_ENTITIES, SCHEMA, QUERY, DEFAULT_OPTIONS extends QueryOptions<TABLE, NEXT_ENTITIES, QUERY> ? DEFAULT_OPTIONS : QueryOptions<TABLE, NEXT_ENTITIES, QUERY>, CONTEXT_OPTIONS extends QueryOptions<TABLE, NEXT_ENTITIES, QUERY> ? CONTEXT_OPTIONS : QueryOptions<TABLE, NEXT_ENTITIES, QUERY>>;
    schema<NEXT_SCHEMA extends Schema>(nextSchema: NEXT_SCHEMA): AccessPattern<TABLE, ENTITIES, NEXT_SCHEMA, QUERY, DEFAULT_OPTIONS, CONTEXT_OPTIONS>;
    pattern<NEXT_QUERY extends Query<TABLE>, NEXT_CONTEXT_OPTIONS extends QueryOptions<TABLE, ENTITIES, NEXT_QUERY>>(nextPattern: (input: TransformedValue<SCHEMA>) => NEXT_QUERY & {
        options?: NEXT_CONTEXT_OPTIONS;
    }): AccessPattern<TABLE, ENTITIES, SCHEMA, NEXT_QUERY, DEFAULT_OPTIONS, NEXT_CONTEXT_OPTIONS>;
    options<NEXT_OPTIONS extends QueryOptions<TABLE, ENTITIES, QUERY>>(nextOptions: NEXT_OPTIONS | ((prevOptions: DEFAULT_OPTIONS) => NEXT_OPTIONS)): AccessPattern<TABLE, ENTITIES, SCHEMA, QUERY, NEXT_OPTIONS, CONTEXT_OPTIONS>;
    meta(nextMeta: AccessPatternMetadata): AccessPattern<TABLE, ENTITIES, SCHEMA, QUERY, DEFAULT_OPTIONS, CONTEXT_OPTIONS>;
}
export {};
