/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_FieldDocSortedHitQueue_ #define _lucene_search_FieldDocSortedHitQueue_ #if defined(_LUCENE_PRAGMA_ONCE) # pragma once #endif #include "Sort.h" #include "CLucene/util/PriorityQueue.h" CL_NS_DEF(search) /** * Expert: A ScoreDoc which also contains information about * how to sort the referenced document. In addition to the * document number and score, this object contains an array * of values for the document from the field(s) used to sort. * For example, if the sort criteria was to sort by fields * "a", "b" then "c", the fields object array * will have three elements, corresponding respectively to * the term values for the document in fields "a", "b" and "c". * The class of each element in the array will be either * Integer, Float or String depending on the type of values * in the terms of each field. * * @see ScoreDoc * @see TopFieldDocs */ class FieldDoc: LUCENE_BASE { public: //FieldDoc did inherit from ScoreDoc, but now we make the scoredoc a member struct ScoreDoc scoreDoc; /** Expert: The values which are used to sort the referenced document. * The order of these will match the original sort criteria given by a * Sort object. Each Object will be either an Integer, Float or String, * depending on the type of values in the terms of the original field. * @see Sort * @see Searchable#search(Query,Filter,int32_t,Sort) */ CL_NS(util)::Comparable** fields; /** Expert: Creates one of these objects with empty sort information. */ FieldDoc (int32_t doc, float_t score); /** Expert: Creates one of these objects with the given sort information. */ FieldDoc (int32_t doc, float_t score, CL_NS(util)::Comparable** fields); ~FieldDoc(); }; /** * Expert: Collects sorted results from Searchable's and collates them. * The elements put into this queue must be of type FieldDoc. */ class FieldDocSortedHitQueue: public CL_NS(util)::PriorityQueue > { private: DEFINE_MUTEX(THIS_LOCK) // this cannot contain AUTO fields - any AUTO fields should // have been resolved by the time this class is used. SortField** fields; int32_t fieldsLen; void _countsize(){ fieldsLen=0; while(fields[fieldsLen]!=NULL) fieldsLen++; } // used in the case where the fields are sorted by locale // based strings //todo: not implemented in clucene because locales has not been implemented //Collator[] collators; //volatile public: /** * Creates a hit queue sorted by the given list of fields. * @param fields Field names, in priority order (highest priority first). * @param size The number of hits to retain. Must be greater than zero. */ FieldDocSortedHitQueue (SortField** fields, int32_t size); ~FieldDocSortedHitQueue(); /** * Allows redefinition of sort fields if they are NULL. * This is to handle the case using ParallelMultiSearcher where the * original list contains AUTO and we don't know the actual sort * type until the values come back. The fields can only be set once. * This method is thread safe. * @param fields */ void setFields (SortField** fields); /** Returns the fields being used to sort. */ SortField** getFields() { return fields; } /** Returns an array of collators, possibly NULL. The collators * correspond to any SortFields which were given a specific locale. * @param fields Array of sort fields. * @return Array, possibly NULL. private Collator[] hasCollators (SortField[] fields) { if (fields == NULL) return NULL; Collator[] ret = new Collator[fields.length]; for (int32_t i=0; ia is less relevant than b. * @param a FieldDoc * @param b FieldDoc * @return true if document a should be sorted after document b. */ bool lessThan (FieldDoc* docA, FieldDoc* docB); }; /** * Expert: Returned by low-level sorted search implementations. * * @see Searchable#search(Query,Filter,int32_t,Sort) */ class TopFieldDocs: public TopDocs { public: /// The fields which were used to sort results by. SortField** fields; FieldDoc** fieldDocs; /** Creates one of these objects. * @param totalHits Total number of hits for the query. * @param fieldDocs The top hits for the query. * @param scoreDocs The top hits for the query. * @param scoreDocsLen Length of fieldDocs and scoreDocs * @param fields The sort criteria used to find the top hits. */ TopFieldDocs (int32_t totalHits, FieldDoc** fieldDocs, int32_t scoreDocsLen, SortField** fields); ~TopFieldDocs(); }; CL_NS_END #endif