001
002package com.commercetools.api.client;
003
004import java.util.Collection;
005import java.util.List;
006import java.util.Map;
007import java.util.function.Function;
008
009import com.commercetools.api.predicates.query.QueryPredicate;
010
011import io.vrap.rmf.base.client.ApiMethod;
012import io.vrap.rmf.base.client.ClientRequestCommand;
013import io.vrap.rmf.base.client.RequestCommand;
014
015/**
016 * Interface with common methods for query endpoints
017 * @param <T> the type of the underlying request
018 * @param <TResult> the type of the underlying result model, like category or product.
019 */
020public interface PagedQueryResourceRequest<T extends PagedQueryResourceRequest<T, TResult, TQuery>, TResult, TQuery>
021        extends RequestCommand<TResult>, ClientRequestCommand<TResult>,
022        com.commercetools.api.models.PagedQueryResourceRequest<T, TResult> {
023    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> withLimit(final TValue limit);
024
025    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> addLimit(final TValue limit);
026
027    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> withOffset(final TValue offset);
028
029    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> addOffset(final TValue offset);
030
031    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> withSort(final TValue sort);
032
033    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> addSort(final TValue sort);
034
035    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> withWhere(final TValue where);
036
037    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> addWhere(final TValue where);
038
039    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> withExpand(final TValue expand);
040
041    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> addExpand(final TValue expand);
042
043    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> withWithTotal(final TValue withTotal);
044
045    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> addWithTotal(final TValue withTotal);
046
047    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> withPredicateVar(final String varName,
048            final TValue predicateVar);
049
050    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> addPredicateVar(final String varName,
051            final TValue predicateVar);
052
053    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> withPredicateVar(final String varName,
054            final Collection<TValue> predicateVar);
055
056    <TValue> PagedQueryResourceRequest<T, TResult, TQuery> addPredicateVar(final String varName,
057            final Collection<TValue> predicateVar);
058
059    List<ApiMethod.ParamEntry<String, String>> getQueryParams();
060
061    List<String> getQueryParam(final String key);
062
063    String getFirstQueryParam(final String key);
064
065    default PagedQueryResourceRequest<T, TResult, TQuery> asPagedQueryResourceRequest() {
066        return this;
067    }
068
069    TQuery queryDsl();
070
071    @SuppressWarnings("unchecked")
072    default T withQuery(Function<TQuery, QueryPredicate> fn) {
073        return (T) withWhere(fn.apply(queryDsl()).render());
074    }
075
076    @SuppressWarnings("unchecked")
077    default T addQuery(Function<TQuery, QueryPredicate> fn) {
078        return (T) addWhere(fn.apply(queryDsl()).render());
079    }
080
081    @SuppressWarnings("unchecked")
082    default T withQuery(Function<TQuery, QueryPredicate> fn, final String predicateVar,
083            final String predicateVarValue) {
084        return (T) withWhere(fn.apply(queryDsl()).render()).withPredicateVar(predicateVar, predicateVarValue);
085    }
086
087    @SuppressWarnings("unchecked")
088    default T addQuery(Function<TQuery, QueryPredicate> fn, final String predicateVar, final String predicateVarValue) {
089        return (T) addWhere(fn.apply(queryDsl()).render()).withPredicateVar(predicateVar, predicateVarValue);
090    }
091
092    @SuppressWarnings("unchecked")
093    default T withQuery(Function<TQuery, QueryPredicate> fn, final Map<String, Collection<String>> predicateVar) {
094        PagedQueryResourceRequest<T, TResult, TQuery> request = withWhere(fn.apply(queryDsl()).render());
095        predicateVar.forEach(request::withPredicateVar);
096        return (T) request;
097    }
098
099    @SuppressWarnings("unchecked")
100    default T addQuery(Function<TQuery, QueryPredicate> fn, final Map<String, Collection<String>> predicateVar) {
101        PagedQueryResourceRequest<T, TResult, TQuery> request = addWhere(fn.apply(queryDsl()).render());
102        predicateVar.forEach(request::withPredicateVar);
103        return (T) request;
104    }
105
106    @SuppressWarnings("unchecked")
107    default T withQuery(Function<TQuery, QueryPredicate> fn, Collection<Map.Entry<String, String>> predicateVar) {
108        PagedQueryResourceRequest<T, TResult, TQuery> request = withWhere(fn.apply(queryDsl()).render());
109        predicateVar.forEach(pair -> request.withPredicateVar(pair.getKey(), pair.getValue()));
110        return (T) request;
111    }
112
113    @SuppressWarnings("unchecked")
114    default T addQuery(Function<TQuery, QueryPredicate> fn, Collection<Map.Entry<String, String>> predicateVar) {
115        PagedQueryResourceRequest<T, TResult, TQuery> request = addWhere(fn.apply(queryDsl()).render());
116        predicateVar.forEach(pair -> request.withPredicateVar(pair.getKey(), pair.getValue()));
117        return (T) request;
118    }
119
120    @SuppressWarnings("unchecked")
121    default T withWhere(final String where, final String predicateVar, final String predicateVarValue) {
122        return (T) withWhere(where).withPredicateVar(predicateVar, predicateVarValue);
123    }
124
125    @SuppressWarnings("unchecked")
126    default T addWhere(final String where, final String predicateVar, final String predicateVarValue) {
127        return (T) addWhere(where).withPredicateVar(predicateVar, predicateVarValue);
128    }
129
130    @SuppressWarnings("unchecked")
131    default T withWhere(final String where, final Map<String, Collection<String>> predicateVar) {
132        PagedQueryResourceRequest<T, TResult, TQuery> request = withWhere(where);
133        predicateVar.forEach(request::withPredicateVar);
134        return (T) request;
135    }
136
137    @SuppressWarnings("unchecked")
138    default T addWhere(final String where, final Map<String, Collection<String>> predicateVar) {
139        PagedQueryResourceRequest<T, TResult, TQuery> request = addWhere(where);
140        predicateVar.forEach(request::withPredicateVar);
141        return (T) request;
142    }
143
144    @SuppressWarnings("unchecked")
145    default T withWhere(final String where, final Collection<Map.Entry<String, String>> predicateVar) {
146        PagedQueryResourceRequest<T, TResult, TQuery> request = withWhere(where);
147        predicateVar.forEach(pair -> request.withPredicateVar(pair.getKey(), pair.getValue()));
148        return (T) request;
149    }
150
151    @SuppressWarnings("unchecked")
152    default T addWhere(final String where, final Collection<Map.Entry<String, String>> predicateVar) {
153        PagedQueryResourceRequest<T, TResult, TQuery> request = addWhere(where);
154        predicateVar.forEach(pair -> request.withPredicateVar(pair.getKey(), pair.getValue()));
155        return (T) request;
156    }
157
158    @SuppressWarnings("unchecked")
159    default T asPagedQueryResourceRequestToBaseType() {
160        return (T) this;
161    }
162}