import * as Druid from 'druid.d.ts';
import { PlywoodRequester } from 'plywood-base-api';
import { Transform } from 'readable-stream';
import { Attributes, PlywoodRange } from '../datatypes';
import { ApplyExpression, ChainableExpression, Expression, FilterExpression, SortExpression, SplitExpression } from '../expressions';
import { ExtendableError } from '../helper/utils';
import { External, ExternalJS, ExternalValue, Inflater, IntrospectionDepth, QueryAndPostTransform, QuerySelection } from './baseExternal';
import { CustomDruidAggregations, CustomDruidTransforms } from './utils/druidTypes';
export declare class InvalidResultError extends ExtendableError {
    result: any;
    constructor(message: string, result: any);
}
export interface ParsedResplitAgg {
    resplitAgg: ChainableExpression;
    resplitApply: ApplyExpression;
    resplitSplit: SplitExpression;
}
export interface GranularityInflater {
    granularity: Druid.Granularity;
    inflater: Inflater;
}
export interface DimensionInflater {
    virtualColumn?: Druid.VirtualColumn;
    dimension: Druid.DimensionSpec;
    inflater?: Inflater;
}
export interface DimensionInflaterHaving extends DimensionInflater {
    having?: Expression;
}
export interface DruidSplit {
    queryType: string;
    timestampLabel?: string;
    virtualColumns?: Druid.VirtualColumn[];
    granularity: Druid.Granularity | string;
    dimension?: Druid.DimensionSpec;
    dimensions?: Druid.DimensionSpec[];
    leftoverHavingFilter?: Expression;
    postTransform: Transform;
}
export declare class DruidExternal extends External {
    static engine: string;
    static type: string;
    static TIME_ATTRIBUTE: string;
    static SELECT_MAX_LIMIT: number;
    static fromJS(parameters: ExternalJS, requester: PlywoodRequester<any>): DruidExternal;
    static getSourceList(requester: PlywoodRequester<any>): Promise<string[]>;
    static getVersion(requester: PlywoodRequester<any>): Promise<string>;
    static isTimestampCompatibleSort(sort: SortExpression, label: string): boolean;
    static timeBoundaryPostTransformFactory(applies?: ApplyExpression[]): Transform;
    static generateMaker(aggregation: Druid.Aggregation): Expression;
    static columnMetadataToRange(columnMetadata: Druid.ColumnMetadata): null | PlywoodRange;
    static segmentMetadataPostProcess(timeAttribute: string, res: Druid.SegmentMetadataResults): Attributes;
    static introspectAttributesWithSegmentMetadata(dataSource: Druid.DataSource, requester: PlywoodRequester<any>, timeAttribute: string, context: Record<string, any>, depth: IntrospectionDepth): Promise<Attributes>;
    static movePagingIdentifiers(pagingIdentifiers: Druid.PagingIdentifiers, increment: number): Druid.PagingIdentifiers;
    static parseResplitAgg(applyExpression: Expression): ParsedResplitAgg | null;
    timeAttribute: string;
    customAggregations: CustomDruidAggregations;
    customTransforms: CustomDruidTransforms;
    allowEternity: boolean;
    allowSelectQueries: boolean;
    exactResultsOnly: boolean;
    querySelection: QuerySelection;
    context: Record<string, any>;
    constructor(parameters: ExternalValue);
    valueOf(): ExternalValue;
    toJS(): ExternalJS;
    equals(other: DruidExternal | undefined): boolean;
    canHandleFilter(filter: FilterExpression): boolean;
    canHandleSort(sort: SortExpression): boolean;
    getQuerySelection(): QuerySelection;
    getDruidDataSource(): Druid.DataSource;
    getTimeAttribute(): string | undefined;
    splitExpressionToGranularityInflater(splitExpression: Expression, label: string): GranularityInflater | null;
    makeOutputName(name: string): string;
    topNCompatibleSort(): boolean;
    expressionToDimensionInflater(expression: Expression, label: string): DimensionInflater;
    expressionToDimensionInflaterHaving(expression: Expression, label: string, havingFilter: Expression): DimensionInflaterHaving;
    splitToDruid(split: SplitExpression): DruidSplit;
    isMinMaxTimeExpression(applyExpression: Expression): boolean;
    getTimeBoundaryQueryAndPostTransform(): QueryAndPostTransform<Druid.Query>;
    nestedGroupByIfNeeded(): QueryAndPostTransform<Druid.Query> | null;
    getQueryAndPostTransform(): QueryAndPostTransform<Druid.Query>;
    protected getIntrospectAttributes(depth: IntrospectionDepth): Promise<Attributes>;
}
//# sourceMappingURL=druidExternal.d.ts.map