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

de.blackrose01.Parameters Maven / Gradle / Ivy

package de.blackrose01;

import de.blackrose01.endpoint.Endpoint;
import de.blackrose01.endpoint.EndpointPrivate;
import de.blackrose01.endpoint.EndpointPublic;

import java.util.ArrayList;
import java.util.List;

/**
 * Manage Parameters for API requests
 */
public class Parameters {
    private List filters = new ArrayList();
    private String ids = "";
    private String fields = "fields *";
    private String order = "";
    private String offset = "";
    private String limit = "";
    private String search = "";
    private String exclude = "";

    public Parameters() {
    }

    /**
     * Add single ID as filter
     *
     * @param id
     * @return Parameters object
     */
    public Parameters addId(long id) {
        this.ids = "id = (" + String.valueOf(id) + ")";
        return this;
    }

    /**
     * Add a bunch of IDs as filter
     *
     * @param id
     * @return Parameters object
     */
    public Parameters addId(long[] id) {
        String[] ids = new String[id.length];

        for (int i = 0; i < id.length; i++)
            ids[i] = String.valueOf(id[i]);

        this.ids = "id = (" + String.join(",", ids) + ")";
        return this;
    }

    /**
     * Add a bunch of IDs as filter
     *
     * @param id
     * @return Parameters object
     */
    public Parameters addId(List id) {
        return this.addId(long[].class.cast(id.toArray()));
    }

    /**
     * Select the field to show in object
     *
     * @param fields
     * @return Parameters object
     */
    public Parameters addFields(String fields) {
        this.fields = "fields " + fields.replace(" ", ",").toLowerCase();
        return this;
    }

    /**
     * Select the fields to show in objects
     *
     * @param fields
     * @return Parameters object
     */
    public Parameters addFields(String[] fields) {
        this.fields = "fields " + String.join(",", fields).toLowerCase();
        return this;
    }

    /**
     * Select the fields to show in objects
     *
     * @param fields
     * @return Parameters object
     */
    public Parameters addFields(List fields) {
        return addFields(fields.toArray(new String[fields.size()]));
    }

    /**
     * @param offset
     * @return Parameters object
     */
    public Parameters addOffset(int offset) {
        if (offset < 1)
            this.offset = "";
        else if (offset > 5000)
            this.offset = "offset 5000";
        else
            this.offset = "offset " + String.valueOf(offset);

        return this;
    }

    /**
     * Maximal size of objects in response
     * max value: 500, min value: 1
     *
     * @param limit
     * @return Parameters object
     */
    public Parameters addLimit(int limit) {
        if (limit < 1)
            this.limit = "";
        else if (limit > 500)
            this.limit = "limit 500";
        else
            this.limit = "limit " + String.valueOf(limit);

        return this;
    }

    /**
     * sort response list by given field
     *
     * @param field
     * @param descending
     * @return Parameters object
     */
    public Parameters addOrder(String field, boolean descending) {
        if (descending)
            this.order = "sort " + field + " desc";
        else
            this.order = "sort " + field + " asc";

        return this;
    }

    /**
     * search for given string in name field; sort by similarity
     * only for endpoints Character, Collection, Game, Platform, People Theme
     *
     * @param endpoint
     * @param search
     * @return Parameters object
     */
    public Parameters addSearch(Endpoint endpoint, String search) {
        if (
                endpoint == EndpointPublic.Character ||
                        endpoint == EndpointPublic.Collection ||
                        endpoint == EndpointPublic.Game ||
                        endpoint == EndpointPublic.Platform ||
                        endpoint == EndpointPrivate.People ||
                        endpoint == EndpointPublic.Theme
        )
            this.search = "search \"" + search.replace(" ", "-").toLowerCase() + "\"";

        return this;
    }

    /**
     * exclude a field in response objects
     *
     * @param field
     * @return Parameters object
     */
    public Parameters addExclude(String field) {
        this.exclude = "exclude " + field;
        return this;
    }

    /**
     * set comparising filters
     *
     * @param field
     * @param comparator
     * @param n
     * @return Parameters object
     */
    public Parameters addFilter(String field, Postfixes comparator, Number n) {
        if (
                (comparator.isRequireComparator() && comparator.isOnlyNumeric()) ||
                        (comparator.isRequireComparator() && comparator == Postfixes.Equal_Case_Sensitive)
        )
            this.filters.add(field + comparator.getPostfix() + String.valueOf(n));

        return this;
    }

    /**
     * set comparising filters
     *
     * @param field
     * @param comparator
     * @param s
     * @return Parameters object
     */
    public Parameters addFilter(String field, Postfixes comparator, String s) {
        if (
                !comparator.isOnlyNumeric() &&
                        s != null &&
                        comparator.isRequireComparator()
        )
            this.filters.add(field + comparator.getPostfix() + s);

        return this;
    }

    /**
     * set comparising filters (only null checks)
     *
     * @param field
     * @param comparator
     * @return Parameters object
     */
    public Parameters addFilterNull(String field, Postfixes comparator) {
        if (comparator == Postfixes.Is_Null || comparator == Postfixes.Not_Null)
            this.filters.add(field + comparator.getPostfix());

        return this;
    }

    /**
     * set comparising filters
     *
     * @param values
     * @param comparator
     * @return Parameters object
     */
    public Parameters addFilter(String[] values, Postfixes comparator) {
        if (
                !comparator.isRequireComparator() &&
                        comparator != Postfixes.Is_Null &&
                        comparator != Postfixes.Not_Null
        )
            this.filters.add(comparator.getPostfix().replace(Postfixes.PLACEHOLDER, String.join(",", values)));

        return this;
    }

    /**
     * set comparising filters
     *
     * @param values
     * @param comparator
     * @return Parameters object
     */
    public Parameters addFilter(List values, Postfixes comparator) {
        return this.addFilter(values.toArray(new String[values.size()]), comparator);
    }

    /**
     * delete all parameters
     *
     * @return Parameters object
     */
    public Parameters resetFilterAll() {
        this.filters = new ArrayList();
        this.ids = "";
        this.fields = "fields *";
        this.order = "";
        this.offset = "";
        this.limit = "";
        this.search = "";
        this.exclude = "";

        return this;
    }

    /**
     * delete parameters for ID
     *
     * @return Parameters object
     */
    public Parameters resetFilterIds() {
        this.ids = "";
        return this;
    }

    /**
     * delete filter parameters
     *
     * @return Parameters object
     */
    public Parameters resetFilterFilters() {
        this.filters = new ArrayList<>();
        return this;
    }

    /**
     * delete parameters for fields
     *
     * @return Parameters object
     */
    public Parameters resetFilterFields() {
        this.fields = "fields *";
        return this;
    }

    /**
     * delete parameters for ordering
     *
     * @return Parameters object
     */
    public Parameters resetFilterOrder() {
        this.order = "";
        return this;
    }

    /**
     * delete parameters for offset
     *
     * @return Parameters object
     */
    public Parameters resetFilterOffset() {
        this.offset = "";
        return this;
    }

    /**
     * delete parameters for limit
     *
     * @return Parameters object
     */
    public Parameters resetFilterLimit() {
        this.limit = "";
        return this;
    }

    /**
     * delete parameters for searching
     *
     * @return Parameters object
     */
    public Parameters resetFilterSearch() {
        this.search = "";
        return this;
    }

    /**
     * delete parameters for exluding fields
     *
     * @return Parameters object
     */
    public Parameters resetFilterExclude() {
        this.exclude = "";
        return this;
    }

    /**
     * build query string for request
     *
     * @return parameterized query string
     */
    public String buildQuery() {
        String query = fields + ";";

        if (!ids.isEmpty())
            query += ids + ";";
        if (!search.isEmpty())
            query += search + ";";
        if (filters.size() > 0)
            query += "where " + String.join(" & ", filters.toArray(new String[filters.size()])) + ";";
        if (!order.isEmpty())
            query += order + ";";
        if (!limit.isEmpty())
            query += limit + ";";
        if (!offset.isEmpty() && !limit.isEmpty())
            query += offset + ";";
        if (!exclude.isEmpty())
            query += exclude + ";";

        return query;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy