blob: 92613a9c367c1d1f2809d3bc98976cfb297d4017 [file] [log] [blame]
package org.apache.solr.search.grouping.distributed.command;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.*;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.DocSet;
import org.apache.solr.search.QParser;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.search.grouping.Command;
import org.apache.solr.search.grouping.collector.FilterCollector;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
*
*/
public class QueryCommand implements Command<QueryCommandResult> {
public static class Builder {
private Sort sort;
private String queryString;
private Query query;
private DocSet docSet;
private Integer docsToCollect;
private boolean needScores;
public Builder setSort(Sort sort) {
this.sort = sort;
return this;
}
public Builder setQuery(Query query) {
this.query = query;
return this;
}
/**
* Sets the group query from the specified groupQueryString.
* The groupQueryString is parsed into a query.
*
* @param groupQueryString The group query string to parse
* @param request The current request
* @return this
* @throws ParseException If parsing the groupQueryString failed
*/
public Builder setQuery(String groupQueryString, SolrQueryRequest request) throws ParseException {
QParser parser = QParser.getParser(groupQueryString, null, request);
this.queryString = groupQueryString;
return setQuery(parser.getQuery());
}
public Builder setDocSet(DocSet docSet) {
this.docSet = docSet;
return this;
}
/**
* Sets the docSet based on the created {@link DocSet}
*
* @param searcher The searcher executing the
* @return
* @throws IOException
*/
public Builder setDocSet(SolrIndexSearcher searcher) throws IOException {
return setDocSet(searcher.getDocSet(query));
}
public Builder setDocsToCollect(int docsToCollect) {
this.docsToCollect = docsToCollect;
return this;
}
public Builder setNeedScores(boolean needScores) {
this.needScores = needScores;
return this;
}
public QueryCommand build() {
if (sort == null || query == null || docSet == null || docsToCollect == null) {
throw new IllegalStateException("All fields must be set");
}
return new QueryCommand(sort, query, docsToCollect, needScores, docSet, queryString);
}
}
private final Sort sort;
private final Query query;
private final DocSet docSet;
private final int docsToCollect;
private final boolean needScores;
private final String queryString;
private TopDocsCollector collector;
private FilterCollector filterCollector;
private QueryCommand(Sort sort, Query query, int docsToCollect, boolean needScores, DocSet docSet, String queryString) {
this.sort = sort;
this.query = query;
this.docsToCollect = docsToCollect;
this.needScores = needScores;
this.docSet = docSet;
this.queryString = queryString;
}
public List<Collector> create() throws IOException {
if (sort == null || sort == Sort.RELEVANCE) {
collector = TopScoreDocCollector.create(docsToCollect, true);
} else {
collector = TopFieldCollector.create(sort, docsToCollect, true, needScores, needScores, true);
}
filterCollector = new FilterCollector(docSet, collector);
return Arrays.asList((Collector) filterCollector);
}
public QueryCommandResult result() {
return new QueryCommandResult(collector.topDocs(), filterCollector.getMatches());
}
public String getKey() {
return queryString != null ? queryString : query.toString();
}
public Sort getGroupSort() {
return sort;
}
public Sort getSortWithinGroup() {
return null;
}
}