blob: 193c89b0ecd1d9ee9b281bed42ab2c7216e0d34b [file] [log] [blame]
/*
* 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.
*/
package org.apache.solr.response;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.DocList;
import org.apache.solr.search.DocSlice;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrException;
/**
* This class is used by the Velocity response writer to provide a consistent paging tool for use by templates.
*
* TODO: add more details
*/
public class PageTool {
private long start;
private int results_per_page = 10;
private long results_found;
private int page_count;
private int current_page_number;
public PageTool(SolrQueryRequest request, SolrQueryResponse response) {
String rows = request.getParams().get("rows");
if (rows != null) {
results_per_page = Integer.parseInt(rows);
}
//TODO: Handle group by results
Object docs = response.getResponse();
if (docs != null) {
if (docs instanceof DocSlice) {
results_found = ((DocSlice) docs).matches();
start = ((DocSlice) docs).offset();
} else if(docs instanceof ResultContext) {
DocList dl = ((ResultContext) docs).getDocList();
results_found = dl.matches();
start = dl.offset();
} else if(docs instanceof SolrDocumentList) {
SolrDocumentList doc_list = (SolrDocumentList) docs;
results_found = doc_list.getNumFound();
start = doc_list.getStart();
} else {
throw new SolrException(SolrException.ErrorCode.UNKNOWN, "Unknown response type "+docs+". Expected one of DocSlice, ResultContext or SolrDocumentList");
}
}
page_count = (int) Math.ceil(results_found / (double) results_per_page);
current_page_number = (int) Math.ceil(start / (double) results_per_page) + (page_count > 0 ? 1 : 0);
}
public long getStart() {
return start;
}
public int getResults_per_page() {
return results_per_page;
}
public long getResults_found() {
return results_found;
}
public int getPage_count() {
return page_count;
}
public int getCurrent_page_number() {
return current_page_number;
}
@Override
public String toString() {
return "Found " + results_found +
" Page " + current_page_number + " of " + page_count +
" Starting at " + start + " per page " + results_per_page;
}
}