All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.rbmhtechnology.vind.model.MultiValuedComplexField Maven / Gradle / Ivy

There is a newer version: 3.2.0
Show newest version
package com.rbmhtechnology.vind.model;

import com.rbmhtechnology.vind.api.Document;
import com.rbmhtechnology.vind.api.query.datemath.DateMathExpression;
import com.rbmhtechnology.vind.api.query.filter.Filter;
import com.rbmhtechnology.vind.model.value.LatLng;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Collection;
import java.util.Date;
import java.util.function.Function;

import static com.rbmhtechnology.vind.api.query.filter.Filter.*;

/**
 * Created by fonso on 01.03.17.
 */
public abstract class MultiValuedComplexField extends ComplexFieldDescriptor {


    protected MultiValuedComplexField(String fieldName, Class type, Class facet, Class storedType) {
        super(fieldName, type, facet, storedType);
    }

    public Function, S> getSortFunction(){
        return (Function, S>)this.sortFunction;
    }

        //Type Specific complexField class definitions

    /**
     * Class to instantiate {@link Document} complex fields containing text facet value.
     *
     * @param  The field original model type.
     * @param  The field facet type, must extend CharSequence.
     */
    public static class TextComplexField  extends MultiValuedComplexField {

        /**
         * Creates an instance of a {@link MultiValuedComplexField.TextComplexField}.
         * @param fieldName String name of the created field.
         * @param type The field original model type.
         * @param facet The field facet type, must extend CharSequence.
         * @param store The field store type.
         */
        protected TextComplexField(String fieldName, Class type, Class facet, Class store) {
            super(fieldName, type, facet, store);
        }

        /**
         * Instantiates a new {@link Filter} which filters in all the documents matching at least one
         * of the given terms.
         * @param terms text to check against.
         * @return A configured filter for the field.
         */
        public Filter terms(String... terms) {
            return Filter.terms(this, terms);
        }

        /**
         * Instantiates a new {@link Filter} which filters in all the documents matching at least one
         * of the given terms.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @param terms text to check against.
         * @return A configured filter for the field.
         */
        public Filter terms(Scope scope, String... terms) {
            return Filter.terms(this, scope, terms);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is equals to a text.
         * @param text text to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter equals(String text, Scope scope) {
            return eq(this.getName(), text, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is equals to a text.
         * @param text text to check against.
         * @return A configured filter for the field.
         */
        public Filter equals(String text) {
            return eq(this.getName(), text);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value has as prefix a text.
         * @param prefix text to check against.
         * @return A configured filter for the field.
         */
        public Filter prefix(String prefix) {
            return Filter.prefix(this.getName(), prefix);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value has as prefix a text.
         * @param prefix text to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter prefix(String prefix, Scope scope) {
            return Filter.prefix(this.getName(), prefix, scope);
        }
    }

    /**
     * Class to instantiate {@link Document} complex fields containing Numeric facet value.
     *
     * @param  The field original model type.
     * @param  The field facet type, must extend Number.
     */
    public static class NumericComplexField  extends MultiValuedComplexField {

        /**
         * Creates an instance of a {@link MultiValuedComplexField.NumericComplexField}.
         * @param fieldName String name of the created field.
         * @param type The field original model type.
         * @param facet The field facet type, must extend Number.
         * @param store The field store type.
         */
        protected NumericComplexField(String fieldName, Class type, Class facet, Class store) {
            super(fieldName, type, facet, store);
        }

        /**
         * Instantiates a new {@link Filter} which filters in all the documents matching at least one
         * of the given terms.
         * @param terms number to check against.
         * @return A configured filter for the field.
         */
        public Filter terms(Number... terms) {
            return Filter.terms(this, terms);
        }

        /**
         * Instantiates a new {@link Filter} which filters in all the documents matching at least one
         * of the given terms.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @param terms number to check against.
         * @return A configured filter for the field.
         */
        public Filter terms(Scope scope, Number... terms) {
            return Filter.terms(this, scope, terms);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two numbers.
         * @param start Lower number on the filter range check.
         * @param end Greater number in the filter range check.
         * @return A configured filter for the field.
         */
        public Filter between(Number start, Number end) {
            return Filter.between(this.getName(), start, end);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two numbers.
         * @param start Lower number on the filter range check.
         * @param end Greater number in the filter range check.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter between(Number start, Number end, Scope scope) {
            return Filter.between(this.getName(), start, end, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is greater than a numbers.
         * @param number Number to check against.
         * @return A configured filter for the field.
         */
        public Filter greaterThan(Number number) {
            return Filter.greaterThan(this.getName(), number);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is greater than a numbers.
         * @param number Number to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter greaterThan(Number number, Scope scope) {
            return Filter.greaterThan(this.getName(), number, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is lower than a numbers.
         * @param number Number to check against.
         * @return A configured filter for the field.
         */
        public Filter lesserThan(Number number) {
            return Filter.lesserThan(this.getName(), number);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is lower than a numbers.
         * @param number Number to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter lesserThan(Number number, Scope scope) {
            return Filter.lesserThan(this.getName(), number, scope);
        }
    }

    /**
     * Class to instantiate {@link Document} complex fields containing ZoneDateTime facet value.
     *
     * @param  The field original model type.
     * @param  The field facet type, must extend ZoneDateTime.
     */
    public static class DateComplexField  extends MultiValuedComplexField {

        /**
         * Creates an instance of a {@link MultiValuedComplexField.DateComplexField}.
         * @param fieldName String name of the created field.
         * @param type The field original model type.
         * @param facet The field facet type, must extend ZoneDateTime.
         * @param store The field store type.
         */
        protected DateComplexField(String fieldName, Class type, Class facet, Class store) {
            super(fieldName, type, facet, store);
        }

        /**
         * Instantiates a new {@link Filter} which filters in all the documents matching at least one
         * of the given terms.
         * @param terms date to check against.
         * @return A configured filter for the field.
         */
        public Filter terms(ZonedDateTime... terms) {
            return Filter.terms(this, terms);
        }

        /**
         * Instantiates a new {@link Filter} which filters in all the documents matching at least one
         * of the given terms.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @param terms date to check against.
         * @return A configured filter for the field.
         */
        public Filter terms(Scope scope, ZonedDateTime... terms) {
            return Filter.terms(this, scope, terms);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two dates.
         * @param start Earliest date on the filter range check.
         * @param end Latest date in the filter range check.
         * @return A configured filter for the field.
         */
        public Filter between(ZonedDateTime start, ZonedDateTime end) {
            return Filter.between(this.getName(), start, end);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two dates.
         * @param start Earliest date on the filter range check.
         * @param end Latest date in the filter range check.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter between(ZonedDateTime start, ZonedDateTime end, Scope scope) {
            return Filter.between(this.getName(), start, end, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two points in time.
         * @param start Earliest {@link DateMathExpression} on the filter range check.
         * @param end Latest {@link DateMathExpression} in the filter range check.
         * @return A configured filter for the field.
         */
        public Filter between(DateMathExpression start, DateMathExpression end) {
            return Filter.between(this.getName(), start, end);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two points in time.
         * @param start Earliest {@link DateMathExpression} on the filter range check.
         * @param end Latest {@link DateMathExpression} in the filter range check.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter between(DateMathExpression start, DateMathExpression end, Scope scope) {
            return Filter.between(this.getName(), start, end, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two dates.
         * @param start Earliest date on the filter range check.
         * @param end Latest date in the filter range check.
         * @return A configured filter for the field.
         */
        public Filter between(Date start, Date end) {
            return Filter.between(this.getName(), ZonedDateTime.ofInstant(start.toInstant(), ZoneId.of("UTC")),ZonedDateTime.ofInstant(end.toInstant(), ZoneId.of("UTC")));
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two dates.
         * @param start Earliest date on the filter range check.
         * @param end Latest date in the filter range check.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter between(Date start, Date end, Scope scope) {
            return Filter.between(this.getName(), ZonedDateTime.ofInstant(start.toInstant(), ZoneId.of("UTC")),ZonedDateTime.ofInstant(end.toInstant(), ZoneId.of("UTC")), scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date {@link DateMathExpression} to check against.
         * @return A configured filter for the field.
         */
        public Filter before(DateMathExpression date) {
            return Filter.before(this.getName(), date);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date {@link DateMathExpression} to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter before(DateMathExpression date, Scope scope) {
            return Filter.before(this.getName(), date, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date Date to check against.
         * @return A configured filter for the field.
         */
        public Filter before(ZonedDateTime date) {
            return Filter.before(this.getName(), date);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date Date to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter before(ZonedDateTime date, Scope scope) {
            return Filter.before(this.getName(), date, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date Date to check against.
         * @return A configured filter for the field.
         */
        public Filter before(Date date) {
            return Filter.before(this.getName(),ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")));
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date Date to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter before(Date date, Scope scope) {
            return Filter.before(this.getName(),ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")), scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date Date to check against.
         * @return A configured filter for the field.
         */
        public Filter after(ZonedDateTime date) {
            return Filter.after(this.getName(), date);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date Date to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter after(ZonedDateTime date, Scope scope) {
            return Filter.after(this.getName(), date, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date {@link DateMathExpression} to check against.
         * @return A configured filter for the field.
         */
        public Filter after(DateMathExpression date) {
            return Filter.after(this.getName(), date);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date {@link DateMathExpression} to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter after(DateMathExpression date, Scope scope) {
            return Filter.after(this.getName(), date, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date Date to check against.
         * @return A configured filter for the field.
         */
        public Filter after(Date date) {
            return Filter.after(this.getName(), ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")));
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date Date to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter after(Date date, Scope scope) {
            return Filter.after(this.getName(), ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")),scope);
        }
    }

    /**
     * Class to instantiate {@link Document} complex fields containing Date facet value.
     *
     * @param  The field original model type.
     * @param  The field facet type, must extend Date.
     */
    public static class UtilDateComplexField  extends MultiValuedComplexField {

        /**
         * Creates an instance of a {@link MultiValuedComplexField.UtilDateComplexField}.
         *
         * @param fieldName String name of the created field.
         * @param type      The field original model type.
         * @param facet     The field facet type, must extend Date.
         * @param store The field store type.
         */
        protected UtilDateComplexField(String fieldName, Class type, Class facet, Class store) {
            super(fieldName, type, facet, store);
        }

        /**
         * Instantiates a new {@link Filter} which filters in all the documents matching at least one
         * of the given terms.
         * @param terms date to check against.
         * @return A configured filter for the field.
         */
        public Filter terms(ZonedDateTime... terms) {
            return Filter.terms(this, terms);
        }

        /**
         * Instantiates a new {@link Filter} which filters in all the documents matching at least one
         * of the given terms.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @param terms date to check against.
         * @return A configured filter for the field.
         */
        public Filter terms(Scope scope, ZonedDateTime... terms) {
            return Filter.terms(this, scope, terms);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two dates.
         * @param start Earliest date on the filter range check.
         * @param end Latest date in the filter range check.
         * @return A configured filter for the field.
         */
        public Filter between(ZonedDateTime start, ZonedDateTime end) {
            return Filter.between(this.getName(), start, end);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two dates.
         * @param start Earliest date on the filter range check.
         * @param end Latest date in the filter range check.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter between(ZonedDateTime start, ZonedDateTime end, Scope scope) {
            return Filter.between(this.getName(), start, end);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two points in time.
         * @param start Earliest {@link DateMathExpression} on the filter range check.
         * @param end Latest {@link DateMathExpression} in the filter range check.
         * @return A configured filter for the field.
         */
        public Filter between(DateMathExpression start, DateMathExpression end) {
            return Filter.between(this.getName(), start, end);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two points in time.
         * @param start Earliest {@link DateMathExpression} on the filter range check.
         * @param end Latest {@link DateMathExpression} in the filter range check.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter between(DateMathExpression start, DateMathExpression end, Scope scope) {
            return Filter.between(this.getName(), start, end, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two dates.
         * @param start Earliest date on the filter range check.
         * @param end Latest date in the filter range check.
         * @return A configured filter for the field.
         */
        public Filter between(Date start, Date end) {
            return Filter.between(this.getName(), ZonedDateTime.ofInstant(start.toInstant(), ZoneId.of("UTC")), ZonedDateTime.ofInstant(end.toInstant(), ZoneId.of("UTC")));
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is between two dates.
         * @param start Earliest date on the filter range check.
         * @param end Latest date in the filter range check.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter between(Date start, Date end, Scope scope) {
            return Filter.between(this.getName(), ZonedDateTime.ofInstant(start.toInstant(), ZoneId.of("UTC")), ZonedDateTime.ofInstant(end.toInstant(), ZoneId.of("UTC")), scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date {@link DateMathExpression} to check against.
         * @return A configured filter for the field.
         */
        public Filter before(DateMathExpression date) {
            return Filter.before(this.getName(), date);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date {@link DateMathExpression} to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter before(DateMathExpression date, Scope scope) {
            return Filter.before(this.getName(), date, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date Date to check against.
         * @return A configured filter for the field.
         */
        public Filter before(ZonedDateTime date) {
            return Filter.before(this.getName(), date);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date Date to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter before(ZonedDateTime date, Scope scope) {
            return Filter.before(this.getName(), date, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date Date to check against.
         * @return A configured filter for the field.
         */
        public Filter before(Date date) {
            return Filter.before(this.getName(), ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")));
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is before a date.
         * @param date Date to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter before(Date date, Scope scope) {
            return Filter.before(this.getName(), ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")), scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date Date to check against.
         * @return A configured filter for the field.
         */
        public Filter after(ZonedDateTime date) {
            return Filter.after(this.getName(), date);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date Date to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter after(ZonedDateTime date, Scope scope) {
            return Filter.after(this.getName(), date, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date {@link DateMathExpression} to check against.
         * @return A configured filter for the field.
         */
        public Filter after(DateMathExpression date) {
            return Filter.after(this.getName(), date);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date {@link DateMathExpression} to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter after(DateMathExpression date, Scope scope) {
            return Filter.after(this.getName(), date, scope);
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date Date to check against.
         * @return A configured filter for the field.
         */
        public Filter after(Date date) {
            return Filter.after(this.getName(), ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")));
        }

        /**
         * Instantiates a new {@link Filter} to checking if the field value is after a date.
         * @param date Date to check against.
         * @param scope Enum {@link Scope} describing the scope to perform the filter on.
         * @return A configured filter for the field.
         */
        public Filter after(Date date, Scope scope) {
            return Filter.after(this.getName(),ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("UTC")),scope);
        }
    }

    /**
     * Class to instantiate {@link Document} complex fields containing location type facet values.
     *
     * @param  The field content type, must extend LatLng.
     */
    public static class LocationComplexFieldDescriptor  extends MultiValuedComplexField {

        protected LocationComplexFieldDescriptor(String fieldName, Class type, Class facetType, Class suggestion) {
            super(fieldName, type, facetType, suggestion);
        }

        /**
         * Instantiates a new {@link Filter} to checking if a field value is within a bounding box.
         *
         * @param upperLeft  the upper left corner of the box
         * @param lowerRight the lower left corner of the box
         * @return A configured filter for the field.
         */
        public Filter withinBBox(LatLng upperLeft, LatLng lowerRight) {
            return Filter.withinBBox(this.getName(), upperLeft, lowerRight);
        }

        /**
         * Instantiates a new {@link Filter} to checking if a field value is within a circle.
         *
         * @param center   the of teh circle
         * @param distance the radius of the circle
         * @return A configured filter for the field.
         */
        public Filter withinCircle(LatLng center, double distance) {
            return Filter.withinCircle(this.getName(), center, distance);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy