import { Metadata } from '../../decorator/metadata/metadata';
import { ConditionOperator } from './type/condition-operator.type';
import { Expression } from './type/expression.type';
/**
 * see http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html
 * https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html
 */
export declare class ConditionExpressionBuilder {
    /**
     * Will walk the object tree recursively and removes all items which do not satisfy the filterFn
     * @param obj
     * @param {(value: any) => boolean} filterFn
     * @returns {any}
     */
    static deepFilter(obj: any, filterFn: (value: any) => boolean): any | null;
    /**
     * Will create a condition which can be added to a request using the param object.
     * It will create the expression statement and the attribute names and values.
     *
     * @param {string} attributePath
     * @param {ConditionOperator} operator
     * @param {any[]} values Depending on the operator the amount of values differs
     * @param {string[]} existingValueNames If provided the existing names are used to make sure we have a unique name for the current attributePath
     * @param {Metadata<any>} metadata If provided we use the metadata to define the attribute name and use it to map the given value(s) to attributeValue(s)
     * @returns {Expression}
     */
    static buildFilterExpression(attributePath: string, operator: ConditionOperator, values: any[], existingValueNames: string[] | undefined, metadata: Metadata<any> | undefined): Expression;
    /**
     * IN expression is unlike all the others property the operand is an array of unwrapped values (not attribute values)
     *
     * @param {string} attributePath
     * @param {string[]} values
     * @param {string[]} existingValueNames
     * @param {PropertyMetadata<any>} propertyMetadata
     * @returns {Expression}
     */
    private static buildInConditionExpression;
    private static buildBetweenConditionExpression;
    private static buildDefaultConditionExpression;
    /**
     * Every operator requires a predefined arity of parameters, this method checks for the correct arity and throws an Error
     * if not correct
     *
     * @param {any[]} values The values which will be applied to the operator function implementation
     * @throws {Error} error Throws an error if the amount of values won't match the operator function parameter arity or
     * the given values is not an array
     */
    private static validateValues;
}
