import { GeneralItem } from 'lemon-model';
import { CosmosOption } from './cosmos-service';
/**
 * ComparisonCondition - arithmetic comparison (EQ, NE, LE, LT, GE, GT)
 * NOTE: '!=' is shortcut to { not: { comparator: '=' } }
 */
type Condition = ComparisonCondition | BetweenCondition | ExistenceCondition | StringCondition;
interface ComparisonCondition {
    key: string;
    comparator: '=' | '!=' | '<=' | '<' | '>=' | '>';
    value: number | string;
}
interface BetweenCondition {
    key: string;
    from: number | string;
    to: number | string;
}
interface ExistenceCondition {
    key: string;
    exists: boolean;
}
interface StringCondition {
    key: string;
    operator: 'begins_with' | 'contains';
    value: string;
}
export type CosmosQueryFilter = (Condition | {
    not: Condition;
}) | CosmosQueryFilter[] | {
    or: CosmosQueryFilter[];
};
/**
 * class: CosmosQueryResult
 * - result information of scan.
 */
export interface CosmosQueryResult<T> {
    list: T[];
    total?: number;
    last?: any;
}
/**
 * feature: `CosmosScannable`
 * - simple scan capable class.
 */
export interface CosmosScannable<T extends GeneralItem> {
    /**
     * simple scan w/ limit.
     * @param limit     limit of page
     * @param last      last result on previous page using continuation token
     * @param conditions
     */
    scan(limit?: number, last?: any, conditions?: CosmosQueryFilter): Promise<CosmosQueryResult<T>>;
}
export declare class QueryBuilder {
    buildConditionExpression(condition: Condition): Promise<string>;
    buildQueryByConditions(conditions: CosmosQueryFilter): Promise<string>;
}
export declare class QueryService {
    protected options: CosmosOption;
    constructor(options: CosmosOption);
    queryItems(query: string, limit?: number, last?: any): Promise<{
        queryResult: any[];
        continuationToken?: any;
    }>;
}
export declare class CosmosQueryService<T extends GeneralItem> implements CosmosScannable<T> {
    protected options: CosmosOption;
    private queryService;
    private queryBuilder;
    constructor(options: CosmosOption);
    /**
     * say hello of identity.
     */
    hello: () => string;
    /**
     * Read items by conditions using dynamic query
     */
    scan(limit?: number, last?: any, conditions?: CosmosQueryFilter): Promise<CosmosQueryResult<T>>;
}
export {};
