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

com.bq.oss.lib.queries.builder.QueryParametersBuilder Maven / Gradle / Ivy

package com.bq.oss.lib.queries.builder;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import com.bq.oss.lib.queries.exception.InvalidParameterException;
import com.bq.oss.lib.queries.exception.MalformedJsonQueryException;
import com.bq.oss.lib.queries.jaxrs.QueryParameters;
import com.bq.oss.lib.queries.parser.AggregationParser;
import com.bq.oss.lib.queries.parser.PaginationParser;
import com.bq.oss.lib.queries.parser.QueryParser;
import com.bq.oss.lib.queries.parser.SearchParser;
import com.bq.oss.lib.queries.parser.SortParser;
import com.bq.oss.lib.queries.request.Aggregation;
import com.bq.oss.lib.queries.request.Pagination;
import com.bq.oss.lib.queries.request.ResourceQuery;
import com.bq.oss.lib.queries.request.Search;
import com.bq.oss.lib.queries.request.Sort;

/**
 * @author Francisco Sanchez on 28/05/15.
 */
public class QueryParametersBuilder {

    private final QueryParser queryParser;
    private final AggregationParser aggregationParser;
    private final SortParser sortParser;
    private final PaginationParser paginationParser;
    private final SearchParser searchParser;

    public QueryParametersBuilder(QueryParser queryParser, AggregationParser aggregationParser, SortParser sortParser,
            PaginationParser paginationParser, SearchParser searchParser) {
        this.queryParser = queryParser;
        this.aggregationParser = aggregationParser;
        this.sortParser = sortParser;
        this.paginationParser = paginationParser;
        this.searchParser = searchParser;
    }

    public QueryParameters createQueryParameters(int page, int pageSize, int maxPageSize, Optional sort,
            Optional> queries, Optional> conditions, Optional aggregation, Optional search) {
        return new QueryParameters(buildPagination(page, pageSize, maxPageSize), buildSort(sort), buildResourceQueries(queries),
                buildResourceQueries(conditions), buildAggregation(aggregation), buildSearch(search));
    }

    private Pagination buildPagination(int page, int pageSize, int maxPageSize) {
        return paginationParser.parse(page, pageSize, maxPageSize);
    }

    private Optional buildSort(Optional sort) {
        try {
            return sort.isPresent() ? Optional.of(sortParser.parse(sort.get())) : Optional.empty();
        } catch (MalformedJsonQueryException | IllegalArgumentException e) {
            throw new InvalidParameterException(InvalidParameterException.Parameter.SORT, sort, e.getMessage(), e);
        }
    }

    private Optional> buildResourceQueries(Optional> optionalQueries) {
        return optionalQueries.map(queries -> {
            return queries.stream().map(stringQuery -> buildQuery(stringQuery, queryParser)).collect(Collectors.toList());
        });
    }

    private ResourceQuery buildQuery(String query, QueryParser queryParser) {
        try {
            return queryParser.parse(query);
        } catch (MalformedJsonQueryException e) {
            throw new InvalidParameterException(InvalidParameterException.Parameter.QUERY, query, e.getMessage(), e);
        }
    }

    private Optional buildAggregation(Optional aggregation) {
        if (aggregation.isPresent()) {
            try {
                return Optional.of(aggregationParser.parse(aggregation.get()));
            } catch (MalformedJsonQueryException e) {
                throw new InvalidParameterException(InvalidParameterException.Parameter.AGGREGATION, aggregation, e.getMessage(), e);
            }
        }
        return Optional.empty();
    }

    private Optional buildSearch(Optional optionalSearch) {
        if (optionalSearch.isPresent()) {
            try {
                return Optional.of(searchParser.parse(optionalSearch.get()));
            } catch (MalformedJsonQueryException e) {
                throw new InvalidParameterException(InvalidParameterException.Parameter.SEARCH, optionalSearch, e.getMessage(), e);
            }
        }
        return Optional.empty();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy