export type QueryObjectRoot = QueryObjectFilterComparison;
export type QueryObjectFilterComparison = {
    __and?: QueryObjectRoot | QueryObjectRoot[];
    __or?: QueryObjectRoot | QueryObjectRoot[];
    __not?: QueryObjectRoot | QueryObjectRoot[];
    [key: string]: {
        __eq?: string | number | boolean;
        __lt?: string | number;
        __gt?: string | number;
        __le?: string | number;
        __ge?: string | number;
    } | string | string[] | number | QueryObjectRoot | QueryObjectRoot[] | Array<string | number | boolean | null> | undefined;
    __eq?: {
        [key: string]: string | number | boolean;
    };
    __lt?: {
        [key: string]: string | number;
    };
    __gt?: {
        [key: string]: string | number;
    };
    __le?: {
        [key: string]: string | number;
    };
    __ge?: {
        [key: string]: string | number;
    };
    __in?: Array<string | number | boolean | null>;
    __bygroupid?: number | string | Array<string | number>;
    __isinhierarchyof?: number | string | Array<string | number>;
    __has?: string;
    __hasany?: string | string[];
    __useFilterQueryString?: string;
};
/**
 * Object defining how to order results by specific fields.
 *
 * Key is the field path, value is:
 * 1 for ascending, -1 for descending, 0 for no order
 */
export interface QueryObjectOrderBy {
    [key: string]: 1 | -1 | 0 | undefined;
}
export interface QueryObjectWithDedicatedFilter {
    __filter?: QueryObjectRoot;
    __orderby?: QueryObjectOrderBy[];
}
export type QueryObject = QueryObjectWithDedicatedFilter | QueryObjectRoot;
export declare class QueriesUtil {
    protected operatorFns: {
        __not: (operand: any) => string;
        __and: (operand: any) => string;
        __or: (operand: any) => string;
        __eq: (operand: any, contextKey: string) => string;
        __gt: (operand: any, contextKey: string) => string;
        __ge: (operand: any, contextKey: string) => string;
        __lt: (operand: any, contextKey: string) => string;
        __le: (operand: any, contextKey: string) => string;
        __in: (operand: Array<string | number | boolean>, contextKey: string) => string;
        __bygroupid: (operand: number | string | Array<string | number>) => string;
        __has: (operand: string) => string;
        __isinhierarchyof: (operand: string | number | Array<string | number>) => string;
        __hasany: (operand: string | string[]) => string;
        __useFilterQueryString: (queryString: string) => string;
    };
    /**
     * Builds query string from provided query object.
     *
     * @param query Object containing filters and sort order for querying managed objects. Supported filters are:
     * - **__and** - Specifies conditions, e.g. `{__and: [{__has: 'c8y_IsDevice'}, {'count': {__gt: 0}}]}`.
     * - **__or** - Specifies alternative conditions, e.g. `{__or: [{__bygroupid: 10300}, {__bygroupid: 10400}]}`.
     * - **__eq** - Specified fragment must be equal to given value, e.g. `{'status': 'AVAILABLE'}` (no nested object required).
     * - **__lt** - Specified fragment must be less then given value, e.g. `{'count': {__lt: 10}}`.
     * - **__gt** - Specified fragment must be greater then given value, e.g. `{'count': {__gt: 0}}`.
     * - **__in** - Specified fragment must be equal to one of values in the list, e.g. `{'status': {__in: ['AVAILABLE', 'UNAVAILABLE']}}`.
     * - **__not** - Negates condition, e.g. `{__not: {'status': 'AVAILABLE'}}`.
     * - **__bygroupid** - True if filtered managed object is assigned to given group, e.g. `{__bygroupid: 10300}`.
     * - **__has** - Specified fragment must have a value defined, e.g. `{__has: 'c8y_IsDevice'}`.
     * - **__hasany** - Matches objects having at least one of the fragments defined, e.g. `{__has: ['c8y_IsDevice', 'c8y_Dashboard']}`.
     * - **__isinhierarchyof** - Matches objects that are in hierarchy of given managed object, e.g. `{__isinhierarchyof: '12345'}`.
     * - **__useFilterQueryString** - Gets rid of the `$filter=()… $orderby=…` parts of a query and keeps only what's between the most
     *                                exterior parentheses of the $filter.
     *                                EXAMPLE: takes a query of the form
     *                                `$filter=(name eq 'RaspPi*') $orderby=name asc`
     *                                and turns it into
     *                                `name eq 'RaspPi*'`
     *                                This is necessary for searching for smart groups, which are identified by their own query
     *                                that needs to be passed through.
     *
     * Note: if you want to specify the order, you need to wrap your filters within `__filter` property and then add `__orderby` with the array of field paths and sort directions (1 for ascending, -1 for descending), for example:
     * - `{ __filter: { ... }, __orderby: [{ 'creationTime': -1 }, { 'name': 1 }] }`
     *
     * @returns {string} Returns a query string ready to be sent in request params to backend.
     *
     * **Example**
     * ```typescript
     *   const query = {
     *     __filter: {
     *       'name': 'My Device*',
     *       'c8y_Availability.status': {
     *         __in: ['AVAILABLE', 'UNAVAILABLE']
     *       },
     *       'creationTime': {
     *         __lt: '2015-11-30T13:28:123Z'
     *       },
     *       'c8y_ActiveAlarmsStatus.critical': {
     *         __gt: 0
     *       },
     *       __or: [
     *         {__not: {__has: 'c8y_ActiveAlarmsStatus.major'}},
     *         {
     *           __or: [
     *             {__bygroupid: 10300},
     *             {__bygroupid: 10400}
     *           ]
     *         }
     *       ]
     *     },
     *     __orderby: [
     *       {'name': 1},
     *       {'creationTime': -1},
     *       {'c8y_ActiveAlarmsStatus.critical': -1}
     *     ]
     *   };
     *
     *   const params = {
     *     query: queriesUtil.buildQuery(query)
     *   };
     * ```
     */
    buildQuery(query: QueryObjectWithDedicatedFilter | QueryObjectRoot | QueryObjectRoot[]): string;
    buildQueryFilter(queryFilter: QueryObjectRoot | QueryObjectRoot[], _queryKey?: string, _glueType?: 'and' | 'or'): string;
    buildQueryOrderby(queryOrderbys: QueryObjectOrderBy[]): string;
    addAndFilter(query: QueryObjectWithDedicatedFilter | QueryObjectRoot, filter: QueryObjectRoot): QueryObjectFilterComparison | QueryObjectWithDedicatedFilter | {
        [x: string]: QueryObjectFilterComparison[];
    };
    addOrFilter(query: QueryObjectWithDedicatedFilter | QueryObjectRoot, filter: QueryObjectRoot): QueryObjectFilterComparison | QueryObjectWithDedicatedFilter | {
        [x: string]: QueryObjectFilterComparison[];
    };
    addFilter(query: QueryObjectWithDedicatedFilter | QueryObjectRoot, filter: QueryObjectRoot, operator: 'and' | 'or'): QueryObjectFilterComparison | QueryObjectWithDedicatedFilter | {
        [x: string]: QueryObjectFilterComparison[];
    };
    prependOrderbys(query: QueryObjectWithDedicatedFilter | QueryObjectRoot, orderbys: QueryObjectOrderBy[]): QueryObjectWithDedicatedFilter;
    appendOrderbys(query: QueryObjectWithDedicatedFilter | QueryObjectRoot, orderbys: QueryObjectOrderBy[]): QueryObjectWithDedicatedFilter;
    addOrderbys(query: QueryObjectWithDedicatedFilter | QueryObjectRoot, orderbys: QueryObjectOrderBy[], how: 'prepend' | 'append'): QueryObjectWithDedicatedFilter;
    extractAndMergeOrderBys(queries: string[]): string;
    protected glue(statements: string[], type: 'and' | 'or'): string;
    protected useAsFloat(operand: string | number): string;
    protected quoteString<T>(s: T): T;
    protected skipEmptyObjects<T extends object>(objs: T[]): T[];
    protected isEmptyObject(obj: object): boolean;
    /**
     * Escapes a string to be used in OData query.
     *
     * - OData does not support single quotes in the query. We need to replace all single quotes with double quotes.
     * - OData uses parentheses for grouping expressions and functions. We need to escape any parentheses in the string.
     * - OData uses backslash as an escape character. We need to escape any backslashes in the string.
     *
     * Spec: http://docs.oasis-open.org/odata/odata/v4.01/cs01/part2-url-conventions/odata-v4.01-cs01-part2-url-conventions.html#sec_URLComponents
     *
     * @param s String to be escaped.
     * @returns Escaped string.
     */
    private escapeString;
}
//# sourceMappingURL=QueriesUtil.d.ts.map