export declare namespace Filter {
    /**
     * Collection of strategies for wilcard string matching.
     */
    class MatchMode {
        /**
         * Match the start of a string.
         */
        static readonly START: string;
        /**
         * Match the end of a string.
         */
        static readonly END: string;
        /**
         * Match anywhere in the string.
         */
        static readonly ANYWHERE: string;
    }
    /**
     * A filter item that can define a comparison/condition.
     */
    interface Property {
        /**
         * Create a filter condition to evaluate whether the property is equal to the specified value.
         *
         * @param value the pattern to evaluate
         * @param moreValues optional additional patterns to evaluate that will be treated as an OR condition
         * @returns an evaluatable filter condition
         */
        equalTo(value: (boolean | number | string), ...moreValues: (boolean | number | string)[]): CompleteCondition;
        /**
         * Create a filter condition to evaluate whether the property is not equal to the specified value.
         *
         * @param value the pattern to evaluate
         * @returns an evaluatable filter condition
         */
        notEqualTo(value: (boolean | number | string)): CompleteCondition;
        /**
         * Create a filter condition to evaluate whether the property is less than the specified value.
         *
         * @param value the pattern to evaluate
         * @returns an evaluatable filter condition
         */
        lessThan(value: number): CompleteCondition;
        /**
         * Create a filter condition to evaluate whether the property is less than or equal to the specified value.
         *
         * @param value the pattern to evaluate
         * @returns an evaluatable filter condition
         */
        lessOrEqualTo(value: number): CompleteCondition;
        /**
         * Create a filter condition to evaluate whether the property is greater than the specified value.
         *
         * @param value the pattern to evaluate
         * @returns an evaluatable filter condition
         */
        greaterThan(value: number): CompleteCondition;
        /**
         * Create a filter condition to evaluate whether the property is greater than or equal to the specified value.
         *
         * @param value the pattern to evaluate
         * @returns an evaluatable filter condition
         */
        greaterOrEqualTo(value: number): CompleteCondition;
        /**
         * Create a filter condition to evaluate whether the property is a wildcard match with the specified value.
         *
         * @param value the pattern to evaluate
         * @param mode the type of wildcard evaluation to perform
         * @returns an evaluatable filter condition
         */
        like(value: string, mode: MatchMode): CompleteCondition;
    }
    /**
     * A representation of a condition that is incomplete by itself, like an empty condition, aggregation wrapper, or junction.
     */
    interface PartialCondition {
        /**
         * Create a simple property to be evaulated as a filter condition.
         *
         * @param property the name of the property
         * @returns a Property instance for defining a filter condition
         */
        is(property: string): Property;
        /**
         * Create a conjunction (AND) condition from existing conditions.
         *
         * @param condition1 first condition
         * @param condition2 second condition
         * @param conditionN any additional conditions
         * @returns an evaluatable filter condition
         */
        and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;
        /**
         * Create a disjunction (OR) condition from existing conditions.
         *
         * @param condition1 first condition
         * @param condition2 second condition
         * @param conditionN any additional conditions
         * @returns an evaluatable filter condition
         */
        or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;
    }
    /**
     * An evaluatable filter condition.
     */
    interface CompleteCondition {
        /**
         * Add a condtion to this condition.
         *
         * This new condition will be ANDed to the existing condition.
         *
         * @returns an incomplete (empty) condition
         */
        and(): PartialCondition;
        /**
         * Add a condtion to this condition.
         *
         * This new condition will be ORed to the existing condition.
         *
         * @returns an incomplete (empty) condition
         */
        or(): PartialCondition;
        /**
         * Build the FIQL representation of the condition.
         *
         * @returns a FIQL string
         */
        query(): string;
    }
    /**
     * Builds a FIQL search condition using a fluent interface.
     */
    class Builder implements PartialCondition {
        /**
         * Create a simple property to be evaulated as a filter condition.
         *
         * @param property the name of the property
         * @returns a Property instance for defining a filter condition
         */
        is(property: string): Property;
        /**
         * Create a conjunction (AND) condition from existing conditions.
         *
         * @param condition1 first condition
         * @param condition2 second condition
         * @param conditionN any additional conditions
         * @returns an evaluatable filter condition
         */
        and(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;
        /**
         * Create a disjunction (OR) condition from existing conditions.
         *
         * @param condition1 first condition
         * @param condition2 second condition
         * @param conditionN any additional conditions
         * @returns an evaluatable filter condition
         */
        or(condition1: CompleteCondition, condition2: CompleteCondition, conditionN?: CompleteCondition[]): CompleteCondition;
    }
}
