/** * License Agreement for OpenSearchServer * * Copyright (C) 2012-2014 Emmanuel Keller / Jaeksoft * * http://www.open-search-server.com * * This file is part of OpenSearchServer. * * OpenSearchServer 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. * * OpenSearchServer 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 OpenSearchServer. * If not, see <http://www.gnu.org/licenses/>. **/ package com.jaeksoft.searchlib.result; import java.io.IOException; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import com.jaeksoft.searchlib.SearchLibException; import com.jaeksoft.searchlib.filter.FilterAbstract; import com.jaeksoft.searchlib.function.expression.SyntaxError; import com.jaeksoft.searchlib.index.DocSetHits; import com.jaeksoft.searchlib.index.ReaderAbstract; import com.jaeksoft.searchlib.index.ReaderInterface; import com.jaeksoft.searchlib.query.ParseException; import com.jaeksoft.searchlib.render.Render; import com.jaeksoft.searchlib.render.RenderMoreLikeThisJson; import com.jaeksoft.searchlib.render.RenderMoreLikeThisXml; import com.jaeksoft.searchlib.request.AbstractLocalSearchRequest; import com.jaeksoft.searchlib.request.MoreLikeThisRequest; import com.jaeksoft.searchlib.request.SearchPatternRequest; import com.jaeksoft.searchlib.result.collector.DocIdInterface; import com.jaeksoft.searchlib.result.collector.ScoreInterface; import com.jaeksoft.searchlib.sort.DescScoreSorter; import com.jaeksoft.searchlib.util.Timer; import com.jaeksoft.searchlib.webservice.query.document.IndexDocumentResult; public class ResultMoreLikeThis extends AbstractResult<MoreLikeThisRequest> implements ResultDocumentsInterface<MoreLikeThisRequest> { final private ReaderInterface reader; final private DocIdInterface docs; final private ScoreInterface scores; final private LinkedHashSet<String> fieldNameSet; public ResultMoreLikeThis(ReaderAbstract reader, MoreLikeThisRequest request) throws SearchLibException, IOException, ParseException, SyntaxError, InstantiationException, IllegalAccessException, ClassNotFoundException { super(request); this.reader = reader; AbstractLocalSearchRequest searchRequest = new SearchPatternRequest(request.getConfig()); for (FilterAbstract<?> filter : request.getFilterList()) searchRequest.getFilterList().add(filter); searchRequest.setBoostedComplexQuery(request.getQuery()); DocSetHits dsh = reader.searchDocSet(searchRequest, timer); if (dsh == null) { fieldNameSet = null; docs = null; scores = null; return; } docs = dsh.getCollector(DocIdInterface.class); new DescScoreSorter(docs).quickSort(timer); scores = dsh.getCollector(ScoreInterface.class); fieldNameSet = new LinkedHashSet<String>(); request.getReturnFieldList().populate(fieldNameSet); } @Override public ResultDocument getDocument(int pos, Timer timer) throws SearchLibException { if (docs == null) return null; if (pos < 0 || pos >= docs.getSize()) return null; try { float score = scores != null ? scores.getScores()[pos] : 0; return new ResultDocument(fieldNameSet, docs.getIds()[pos], reader, score, null, timer); } catch (IOException e) { throw new SearchLibException(e); } catch (ParseException e) { throw new SearchLibException(e); } catch (SyntaxError e) { throw new SearchLibException(e); } } @Override public float getScore(int pos) { if (scores == null) return 0; return scores.getScores()[pos]; } @Override public Float getDistance(int pos) { return null; } @Override public int getCollapseCount(int pos) { return ResultDocument.getCollapseCount(docs, pos); } @Override public int getNumFound() { if (docs == null) return 0; return docs.getSize(); } @Override protected Render getRenderXml() { return new RenderMoreLikeThisXml(this); } @Override protected Render getRenderCsv() { // TODO Auto-generated method stub return null; } @Override protected Render getRenderJson(boolean indent) { return new RenderMoreLikeThisJson(this, indent); } @Override public Iterator<ResultDocument> iterator() { return new ResultDocumentIterator(this, null); } @Override public int getDocumentCount() { int end = request.getEnd(); int len = getNumFound(); if (end > len) end = len; return end - request.getStart(); } @Override public int getRequestStart() { return request.getStart(); } @Override public int getRequestRows() { return request.getRows(); } @Override public DocIdInterface getDocs() { return docs; } @Override public float getMaxScore() { if (scores == null) return 0; return scores.getMaxScore(); } @Override public int getCollapsedDocCount() { return 0; } @Override public void populate(List<IndexDocumentResult> indexDocuments) throws IOException, SearchLibException { throw new SearchLibException("Method not available"); } }