/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.vfs.search;
import com.google.common.base.Optional;
import java.util.List;
import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.toList;
/**
* Result of executing {@link Searcher#search(QueryExpression)}.
*/
public class SearchResult {
public static SearchResultBuilder aSearchResult() {
return new SearchResultBuilder();
}
private final List<SearchResultEntry> results;
private final Optional<QueryExpression> nextPageQueryExpression;
private final int totalHits;
private final long elapsedTimeMillis;
private SearchResult(List<SearchResultEntry> results,
Optional<QueryExpression> nextPageQueryExpression,
int totalHits,
long elapsedTimeMillis) {
this.results = results;
this.nextPageQueryExpression = nextPageQueryExpression;
this.totalHits = totalHits;
this.elapsedTimeMillis = elapsedTimeMillis;
}
/** Paths of files that match the search criteria. This method is shortcut for:
* <pre>
* {@code
* SearchResult result = ...;
* List<String> paths = new ArrayList<>();
* for (SearchResultEntry e : result.getResults()) {
* paths.add(e.getFilePath());
* }
* }
* </pre>
*/
public List<String> getFilePaths() {
return results.stream().map(SearchResultEntry::getFilePath).collect(toList());
}
/** Get all results that match the search criteria. */
public List<SearchResultEntry> getResults() {
return results;
}
/** Total number of files that match the search criteria. */
public int getTotalHits() {
return totalHits;
}
/** Time spent on execution the query. */
public long getElapsedTimeMillis() {
return elapsedTimeMillis;
}
/** Optional query expression for retrieving next page. */
public Optional<QueryExpression> getNextPageQueryExpression() {
return nextPageQueryExpression;
}
public static class SearchResultBuilder {
private QueryExpression nextPageQueryExpression;
private List<SearchResultEntry> results;
private int totalHits;
private long elapsedTimeMillis;
private SearchResultBuilder() {
}
public SearchResultBuilder withNextPageQueryExpression(QueryExpression nextPageQueryExpression) {
this.nextPageQueryExpression = nextPageQueryExpression;
return this;
}
public SearchResultBuilder withResults(List<SearchResultEntry> results) {
this.results = results;
return this;
}
public SearchResultBuilder withTotalHits(int totalHits) {
this.totalHits = totalHits;
return this;
}
public SearchResultBuilder withElapsedTimeMillis(long elapsedTimeMillis) {
this.elapsedTimeMillis = elapsedTimeMillis;
return this;
}
public SearchResult build() {
Optional<QueryExpression> optionalPageNexQueryExpression;
if (nextPageQueryExpression == null) {
optionalPageNexQueryExpression = Optional.absent();
} else {
optionalPageNexQueryExpression = Optional.of(nextPageQueryExpression);
}
if (results == null) {
results = emptyList();
}
return new SearchResult(results, optionalPageNexQueryExpression, totalHits, elapsedTimeMillis);
}
}
}