nl.knaw.huygens.alexandria.endpoint.search.SearchResult.java Source code

Java tutorial

Introduction

Here is the source code for nl.knaw.huygens.alexandria.endpoint.search.SearchResult.java

Source

package nl.knaw.huygens.alexandria.endpoint.search;

/*
 * #%L
 * alexandria-main
 * =======
 * Copyright (C) 2015 - 2016 Huygens ING (KNAW)
 * =======
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/gpl-3.0.html>.
 * #L%
 */

import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.inject.Inject;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.google.common.collect.Lists;

import nl.knaw.huygens.alexandria.api.model.PropertyPrefix;
import nl.knaw.huygens.alexandria.endpoint.LocationBuilder;
import nl.knaw.huygens.alexandria.model.Identifiable;
import nl.knaw.huygens.alexandria.model.search.AlexandriaQuery;

@JsonInclude(Include.NON_NULL)
public class SearchResult implements Identifiable {
    private UUID id;
    private AlexandriaQuery query;
    private List<Map<String, Object>> results = Lists.newArrayList();
    private Long searchDurationInMs;

    @JsonIgnore
    private LocationBuilder locationBuilder;

    @Inject
    public SearchResult(LocationBuilder locationBuilder) {
        this.locationBuilder = locationBuilder;
    }

    public SearchResult setId(UUID id) {
        this.id = id;
        return this;
    }

    @Override
    public UUID getId() {
        return id;
    }

    @JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY)
    public AlexandriaQuery getQuery() {
        return query;
    }

    public SearchResult setQuery(AlexandriaQuery query) {
        this.query = query;
        return this;
    }

    public int getTotalResults() {
        return results.size();
    }

    public int getTotalPages() {
        return (int) Math.ceil(getTotalResults() / (double) query.getPageSize());
    }

    @JsonIgnore
    public List<Map<String, Object>> getResults() {
        return results;
    }

    public SearchResult setResults(List<Map<String, Object>> results) {
        this.results = results;
        return this;
    }

    @JsonProperty(PropertyPrefix.LINK + "firstPage")
    public URI getFirstResultPage() {
        return getTotalResults() > 0 ? locationBuilder.locationOf(this, SearchEndpoint.RESULTPAGES, "1") : null;
    }

    @JsonIgnore
    public List<Map<String, Object>> getRecordsForPage(int pageNumber) {
        if (pageNumber < 1 || pageNumber > getTotalPages()) {
            return Lists.newArrayList();
        }
        int fromIndex = (pageNumber - 1) * getPageSize();
        int toIndex = Math.min(fromIndex + getPageSize(), getTotalResults());
        return results.subList(fromIndex, toIndex);
    }

    public int getPageSize() {
        return query.getPageSize();
    }

    public Long getSearchDurationInMs() {
        return searchDurationInMs;
    }

    public SearchResult setSearchDurationInMilliseconds(Long searchDurationInMs) {
        this.searchDurationInMs = searchDurationInMs;
        return this;
    }

}