import { BaseQuery } from './base-query';
import { IConditionExpr, IGroupBy, IIndexOnParams, IIndexWithParams, ILetExpr, IndexType, ISelectType, LogicalWhereExpr, SortType } from './interface/query.types';
export declare class Query extends BaseQuery {
    /**
     * SELECT Expression.
     */
    private selectExpr?;
    /**
     * WHERE Expression.
     */
    private whereExpr?;
    /**
     * ORDER BY Expression.
     */
    private orderExpr?;
    /**
     * LIMIT Expression.
     */
    private limitExpr?;
    /**
     * OFFSET Expression.
     */
    private offSetExpr?;
    /**
     * LET Expression.
     */
    private letExpr?;
    /**
     * GROUP BY Expression.
     */
    private groupByExpr?;
    /**
     * LETTING Expression.
     */
    private lettingExpr?;
    /**
     * HAVING Expression.
     */
    private havingExpr?;
    /**
     * Plain JOIN Expression.
     */
    private plainJoinExpr?;
    /**
     * USE Expression.
     */
    private useKeysExpr?;
    /**
     * Available query types.
     */
    private queryType?;
    /**
     * INDEX ON Expression.
     */
    private indexOn?;
    /**
     * Types of supported index statements.
     */
    private indexType?;
    /**
     * Index name.
     */
    private indexName?;
    /**
     * INDEX USING GSI Expression.
     */
    private indexUsingGSI?;
    /**
     * INDEX USING GSI Expression.
     */
    private indexWith?;
    /**
     * @summary Create an instance of Query.
     * @name Query
     * @class
     * @public
     *
     * @param conditions List of SELECT clause conditions
     * @param collection Collection name
     * @returns Query
     *
     * @example
     * ```ts
     *  const query = new Query({$select: [{$field: 'address'}], $where: {$nill: [{ address: { $like: '%57-59%' } }, { free_breakfast: true }, { free_lunch: [1] }]}}, 'travel-sample');
     * ```
     */
    constructor(conditions: IConditionExpr, collection: string);
    /**
     * Add result selectors to SELECT clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample`
     */
    select(value?: ISelectType[] | string | undefined): Query;
    /**
     * Add index type and name to INDEX clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const result = new Query({}, 'travel-sample').index('DROP', 'travel_sample_id_test').build();
     *   console.log(result)
     * ```
     * > DROP INDEX `travel-sample`.`travel_sample_id_test`
     */
    index(type: IndexType, name: string): Query;
    /**
     * Add items to ON clause in INDEX clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const on = [{ name: 'travel-sample.callsing', sort: 'ASC' }];
     *   const result = new Query({}, 'travel-sample').index('CREATE', 'travel_sample_id_test').on(on).build();
     *   console.log(result)
     * ```
     * > CREATE INDEX `travel_sample_id_test` ON `travel-sample`(`travel-sample.callsing`['ASC'])
     */
    on(value: IIndexOnParams[]): Query;
    /**
     * Create INDEX using General Secondary Index(GSI).
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const result = new Query({}, 'travel-sample').index('CREATE', 'travel_sample_id_test').usingGSI().build();
     *   console.log(result)
     * ```
     * > CREATE INDEX `travel_sample_id_test` USING GSI)
     */
    usingGSI(): Query;
    /**
     * Add items to WITH clause in INDEX clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const withExpr = {nodes: ['192.168.1.1:8078'],defer_build: true,num_replica: 2};
     *   const result = new Query({}, 'travel-sample').index('CREATE', 'travel_sample_id_test').with(withExpr).build();
     *   console.log(result)
     * ```
     * > CREATE INDEX `travel_sample_id_test` WITH {'nodes': ['192.168.1.1:8078'],'defer_build': true,'num_replica': 2})
     */
    with(value: IIndexWithParams): Query;
    /**
     * Add WHERE expression to SELECT clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const expr_where = {$or: [{ address: { $like: '%57-59%' } }, { free_breakfast: true }]};
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).where(expr_where).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample WHERE (address LIKE '%57-59%' OR free_breakfast = true)`
     */
    where(value: LogicalWhereExpr): Query;
    /**
     * Add JOIN expression to SELECT clause.
     * @method
     * @public
     *
     * @example
     * ```tS
     *   const query = new Query({}, 'beer-sample brewery');
     *   const result = query.select([{$field: 'address'}]).plainJoin('JOIN `beer-sample` beer ON beer.brewery_id = LOWER(REPLACE(brewery.name, " ", "_"))').build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `beer-sample brewery` JOIN `beer-sample` beer ON beer.brewery_id = LOWER(REPLACE(brewery.name, " ", "_")) LIMIT 1`
     */
    plainJoin(value: string): Query;
    /**
     * Add ORDER BY expression to SELECT clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).orderBy({ size: 'DESC' }).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample ORDER BY size = 'DESC'`
     */
    orderBy(value: Record<string, SortType>): Query;
    /**
     * Add LIMIT expression to SELECT clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).limit(10).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample LIMIT 10`
     */
    limit(value: number): Query;
    /**
     * Add OFFSET expression to SELECT clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).offset(10).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample OFFSET 10`
     */
    offset(value: number): Query;
    /**
     * Add LET expression to SELECT clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const letExpr = [{ key: 'amount_val', value: 10 }];
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).let(letExpr).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample LET amount_val = 10`
     */
    let(value: ILetExpr[]): Query;
    /**
     * Add GROUP BY expression to GROUP BY clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const groupByExpr = [{ expr: 'COUNT(amount_val)', as: 'amount' }];
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).groupBy(groupByExpr).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample GROUP BY COUNT(amount) AS amount`
     */
    groupBy(value: IGroupBy[]): Query;
    /**
     * Add LETTING expression to GROUP BY clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const groupByExpr = [{ expr: 'COUNT(amount_val)', as: 'amount' }];
     *   const letExpr = [{ key: 'amount_val', value: 10 }];
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).groupBy(groupByExpr).let(letExpr).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample GROUP BY COUNT(amount) AS amount LETTING amount = 10`
     */
    letting(value: ILetExpr[]): Query;
    /**
     * Add HAVING expression to GROUP BY clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const groupByExpr = [{ expr: 'COUNT(amount_val)', as: 'amount' }];
     *   const having = {address: {$like: '%58%'}};
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).groupBy(groupByExpr).having(having).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample GROUP BY COUNT(amount) AS amount HAVING address LIKE '%58%'`
     */
    having(value: LogicalWhereExpr): Query;
    /**
     * Add USE KEYS expression to SELECT clause.
     * @method
     * @public
     *
     * @example
     * ```ts
     *   const query = new Query({}, 'travel-sample');
     *   const result = query.select([{$field: 'address'}]).useKeys(['airlineR_8093']).build()
     *   console.log(result)
     * ```
     * > SELECT address FROM `travel-sample USE KEYS ['airlineR_8093']`
     */
    useKeys(value: string[]): Query;
    /**
     * Converts the conditional parameters passed to the constructor to the properties of the N1QL Query.
     * @method
     * @public
     *
     */
    compileFromConditions(conditionals: IConditionExpr): void;
    /**
     * Build a n1ql query from the defined parameters.
     * @method
     * @public
     *
     */
    build(): string;
    get conditions(): IConditionExpr;
    set conditions(value: IConditionExpr);
    get collection(): string;
    set collection(value: string);
}
