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

io.sphere.internal.request.SearchRequestImpl Maven / Gradle / Ivy

There is a newer version: 0.72.1
Show newest version
package io.sphere.internal.request;

import com.google.common.base.Function;
import com.google.common.util.concurrent.Futures;
import io.sphere.internal.util.Log;
import io.sphere.internal.util.SearchResultUtil;
import io.sphere.internal.util.SearchUtil;
import io.sphere.internal.util.Util;
import io.sphere.client.*;
import io.sphere.client.facets.expressions.FacetExpression;
import io.sphere.client.filters.expressions.FilterExpression;
import io.sphere.client.model.SearchResult;
import static io.sphere.internal.util.ListUtil.list;

import com.google.common.util.concurrent.ListenableFuture;
import org.codehaus.jackson.type.TypeReference;

import javax.annotation.Nullable;
import java.util.List;
import java.util.Locale;


// dates:
// date     yyyy-MM-dd                  ISODateTimeFormat.date().print(ld)
// time     HH:mm:ss.SSS                ISODateTimeFormat.time().print(lt)
// datetime yyyy-MM-ddTHH:mm:ss.SSSZZ   ISODateTimeFormat.dateTime().print(dt.withZone(DateTimeZone.UTC))

public class SearchRequestImpl implements SearchRequest, TestableRequest {
    private Iterable filters;
    private RequestHolder> requestHolder;
    private TypeReference> jsonParserTypeRef;
    private int pageSize = 25;
    private int page = 0;
    private Locale locale;

    public SearchRequestImpl(RequestHolder> requestHolder, TypeReference> jsonParserTypeRef, Locale locale) {
        this.requestHolder = requestHolder;
        this.jsonParserTypeRef = jsonParserTypeRef;
        this.locale = locale;
    }

    @Override public SearchRequest page(int page) {
        // added to the query parameters in fetchAsync()
        this.page = page;
        return this;
    }

    @Override public SearchRequest pageSize(int pageSize) {
        // added to the query parameters in fetchAsync()
        this.pageSize = pageSize;
        return this;
    }

    private void addQueryParam(QueryParam qp) {
        if (qp != null) {
            requestHolder.addQueryParameter(qp.getName(), qp.getValue());
        }
    }

    @Override public SearchRequest filter(FilterExpression filter, FilterExpression... filters) {
        return filter(list(filter, filters));
    }

    @Override public SearchRequest filter(Iterable filters) {
        for (FilterExpression filter: filters) {
            if (filter == null) {
                Log.warn("Null filter passed to SearchRequest.filter(), ignoring.");
                continue;  // be tolerant in what we accept
            }
            for (QueryParam qp: filter.createQueryParams()) {
                addQueryParam(qp);
            }
        }
        return this;
    }

    @Override public SearchRequest facet(FacetExpression facet, FacetExpression... facets) {
        return facet(list(facet, facets));
    }

    @Override public SearchRequest facet(Iterable facets) {
        for (FacetExpression facet: facets) {
            if (facet == null) {
                Log.warn("Null facet passed to SearchRequest.faceted(), ignoring.");
                continue;  // be tolerant in what we accept
            }
            List queryParams = facet.createQueryParams();
            for (QueryParam qp: queryParams) {
                addQueryParam(qp);
            }
        }
        return this;
    }

    @Override public SearchRequest sort(ProductSort sort) {
        return fluidAddQueryParam(SearchUtil.createSortParam(sort));
    }

    @Override
    public SearchRequest sort(final String sort) {
        return fluidAddQueryParam(new QueryParam("sort", sort));
    }

    protected final SearchRequest fluidAddQueryParam(final QueryParam queryParam) {
        addQueryParam(queryParam);
        return this;
    }

    @Override public SearchResult fetch() {
        return Util.sync(fetchAsync());
    }

    @Override public ListenableFuture> fetchAsync() {
        requestHolder.addQueryParameter("limit", Integer.toString(this.pageSize));
        requestHolder.addQueryParameter("offset", Integer.toString(this.page * this.pageSize));
        requestHolder.addQueryParameter("lang", Util.toLanguageTag(this.locale));
        return Futures.transform(RequestExecutor.executeAndThrowOnError(requestHolder, jsonParserTypeRef), new Function, SearchResult>() {
            @Override public SearchResult apply(@Nullable SearchResult res) {
                if (res == null) return null;
                // fill in page size, keep results intact
                return SearchResultUtil.transform(res, res.getResults(), SearchRequestImpl.this.pageSize);
            }
        });
    }

    // testing purposes
    @Override public TestableRequestHolder getRequestHolder() {
        return requestHolder;
    }

    // logging and debugging purposes
    @Override public String toString() {
        return getRequestHolder().toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy