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

com.box.sdk.MetadataQuery Maven / Gradle / Ivy

There is a newer version: 4.12.0
Show newest version
package com.box.sdk;

import static java.util.stream.Collectors.toList;

import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Represents Metadata Query.
 */
public class MetadataQuery {
    static final String FROM = "from";
    static final String LIMIT = "limit";
    static final String QUERY = "query";
    static final String ANCESTOR_FOLDER_ID = "ancestor_folder_id";
    static final String MARKER = "marker";
    static final String ORDER_BY = "order_by";
    static final String FIELDS = "fields";
    static final String QUERY_PARAMS = "query_params";
    private final String from;
    private final int limit;
    private String query;
    private JsonObject queryParameters = new JsonObject();
    private String ancestorFolderId = "0";
    private List orderBy = new ArrayList<>();
    private String marker;
    private List fields = new ArrayList<>();

    /**
     * Creates Metadata Query
     *
     * @param from  The template used in the query. Must be in the form scope_enterpriseID.templateKey
     * @param limit Max results to return for a single request (0-100 inclusive)
     */
    public MetadataQuery(String from, int limit) {
        this.from = from;
        this.limit = limit;
    }

    /**
     * Creates Metadata Query
     *
     * @param from The template used in the query. Must be in the form scope.templateKey
     */
    public MetadataQuery(String from) {
        this(from, 100);
    }

    /**
     * The logical expression of the query
     *
     * @param query Query string
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery setQuery(String query) {
        this.query = query;
        return this;
    }

    /**
     * Sets the folder_id to which to restrain the query.
     * If not set query starts at root level.
     *
     * @param ancestorFolderId The folder id
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery setAncestorFolderId(String ancestorFolderId) {
        this.ancestorFolderId = ancestorFolderId;
        return this;
    }

    /**
     * The marker to use for requesting the next page
     *
     * @param marker Marker string.
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery setMarker(String marker) {
        this.marker = marker;
        return this;
    }

    /**
     * The field_key(s) to order on and the corresponding direction(s)
     *
     * @param fields Fields with sort order
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery setOrderBy(OrderBy... fields) {
        this.orderBy = new ArrayList<>();
        this.orderBy.addAll(Arrays.asList(fields));
        return this;
    }

    MetadataQuery setOrderBy(JsonArray orderBy) {
        if (orderBy != null) {
            this.orderBy = orderBy.values().stream().map(OrderBy::fromJson).collect(toList());
        }
        return this;
    }

    /**
     * The fields to retrieve.
     *
     * @param fields Field names
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery setFields(String... fields) {
        this.fields = new ArrayList<>();
        this.fields.addAll(Arrays.asList(fields));
        return this;
    }

    /**
     * Adds parameter to query
     *
     * @param name  Parameter name
     * @param value Parameter value
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery addParameter(String name, String value) {
        this.queryParameters.add(name, value);
        return this;
    }

    /**
     * Adds parameter to query
     *
     * @param name  Parameter name
     * @param value Parameter value
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery addParameter(String name, int value) {
        this.queryParameters.add(name, value);
        return this;
    }

    /**
     * Adds parameter to query
     *
     * @param name  Parameter name
     * @param value Parameter value
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery addParameter(String name, boolean value) {
        this.queryParameters.add(name, value);
        return this;
    }

    /**
     * Adds parameter to query
     *
     * @param name  Parameter name
     * @param value Parameter value
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery addParameter(String name, float value) {
        this.queryParameters.add(name, value);
        return this;
    }

    /**
     * Adds parameter to query
     *
     * @param name  Parameter name
     * @param value Parameter value
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery addParameter(String name, long value) {
        this.queryParameters.add(name, value);
        return this;
    }

    /**
     * Adds parameter to query
     *
     * @param name  Parameter name
     * @param value Parameter value
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery addParameter(String name, double value) {
        this.queryParameters.add(name, value);
        return this;
    }

    /**
     * Adds parameter to query
     *
     * @param name  Parameter name
     * @param value Parameter value
     * @return Returns current MetadataQuery object
     */
    public MetadataQuery addParameter(String name, JsonValue value) {
        this.queryParameters.add(name, Json.parse(value.toString()));
        return this;
    }

    MetadataQuery setQueryParams(JsonObject queryParameters) {
        this.queryParameters = new JsonObject(queryParameters);
        return this;
    }

    JsonObject toJsonObject() {
        JsonObject jsonObject = new JsonObject()
            .add(FROM, from)
            .add(LIMIT, limit);
        if (query != null) {
            jsonObject.add(QUERY, query);
        }
        if (ancestorFolderId != null) {
            jsonObject.add(ANCESTOR_FOLDER_ID, ancestorFolderId);
        }
        if (marker != null) {
            jsonObject.add(MARKER, marker);
        }
        if (!orderBy.isEmpty()) {
            JsonArray orderByJson = new JsonArray();
            orderBy.stream().map(OrderBy::toJsonObject).forEach(orderByJson::add);
            jsonObject.add(ORDER_BY, orderByJson);
        }
        if (!fields.isEmpty()) {
            JsonArray fieldsJson = new JsonArray();
            fields.forEach(fieldsJson::add);
            jsonObject.add(FIELDS, fieldsJson);
        }
        if (queryParameters.iterator().hasNext()) {
            jsonObject.add(QUERY_PARAMS, new JsonObject(queryParameters));
        }
        return jsonObject;
    }

    int getLimit() {
        return limit;
    }

    String getMarker() {
        return marker;
    }

    public static final class OrderBy {

        static final String FIELD_KEY = "field_key";
        static final String DIRECTION = "direction";
        static final String DIRECTION_ASCENDING = "asc";
        static final String DIRECTION_DESCENDING = "desc";
        private final String fieldName;
        private final String direction;

        private OrderBy(String fieldName, String direction) {
            this.fieldName = fieldName;
            this.direction = direction;
        }

        JsonObject toJsonObject() {
            return new JsonObject().add(FIELD_KEY, fieldName).add(DIRECTION, direction);
        }

        /**
         * Creates OrderBy for ascending sort with a specified field.
         * @param fieldName Name of a field
         * @return OrderBy instance
         */
        public static OrderBy ascending(String fieldName) {
            return new OrderBy(fieldName, DIRECTION_ASCENDING);
        }

        /**
         * Creates OrderBy for descending sort with a specified field.
         * @param fieldName Name of a field
         * @return OrderBy instance
         */
        public static OrderBy descending(String fieldName) {
            return new OrderBy(fieldName, DIRECTION_DESCENDING);
        }

        static OrderBy fromJson(JsonValue jsonValue) {
            if (jsonValue.isObject()) {
                JsonObject object = jsonValue.asObject();
                String fieldName = object.get(FIELD_KEY).asString();
                String direction = object.get(DIRECTION).asString().toLowerCase();
                if (!DIRECTION_ASCENDING.equals(direction) && !DIRECTION_DESCENDING.equals(direction)) {
                    throw new RuntimeException(
                        String.format("Unsupported sort direction [%s] for field [%s]", direction, fieldName)
                    );
                }
                return object.getString(DIRECTION, "").equals(DIRECTION_ASCENDING)
                    ? ascending(fieldName)
                    : descending(fieldName);
            }
            throw new RuntimeException("Unsupported json " + jsonValue);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy