/****************************************************************************
**
** Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team.
** All rights reserved.
**
** Portion Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
****************************************************************************/

#ifndef QSEARCHABLE_P_H
#define QSEARCHABLE_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of the help generator tools. This header file may change from version
// to version without notice, or even be removed.
//
// We mean it.
//

#include "qhits_p.h"
#include "qsort_p.h"
#include "qquery_p.h"
#include "qfilter_p.h"
#include "qdocument_p.h"
#include "qindexreader_p.h"
#include "qclucene_global_p.h"

#include <QtCore/QList>
#include <QtCore/QString>
#include <QtCore/QSharedDataPointer>
#include <QtCore/QSharedData>

CL_NS_DEF(search)
    class Searcher;
CL_NS_END
CL_NS_USE(search)

QT_BEGIN_NAMESPACE

class QCLuceneHits;
class QCLuceneSearcher;
class QCLuceneIndexSearcher;
class QCLuceneMultiSearcher;

class QHELP_EXPORT QCLuceneSearchablePrivate : public QSharedData
{
public:
    QCLuceneSearchablePrivate();
    QCLuceneSearchablePrivate(const QCLuceneSearchablePrivate &other);

    ~QCLuceneSearchablePrivate();

    Searcher *searchable;
    bool deleteCLuceneSearchable;

private:
    QCLuceneSearchablePrivate &operator=(const QCLuceneSearchablePrivate &other);
};

class QHELP_EXPORT QCLuceneSearchable
{
public:
    virtual ~QCLuceneSearchable();

protected:
    friend class QCLuceneSearcher;
    friend class QCLuceneIndexSearcher;
    friend class QCLuceneMultiSearcher;
    QSharedDataPointer<QCLuceneSearchablePrivate> d;

private:
    QCLuceneSearchable();
};

class QHELP_EXPORT QCLuceneSearcher : public QCLuceneSearchable
{
public:
    QCLuceneSearcher();
    virtual ~QCLuceneSearcher();

    QCLuceneHits search(const QCLuceneQuery &query);
    QCLuceneHits search(const QCLuceneQuery &query, const QCLuceneFilter &filter);
    QCLuceneHits search(const QCLuceneQuery &query, const QCLuceneSort &sort);
    QCLuceneHits search(const QCLuceneQuery &query, const QCLuceneFilter &filter, 
        const QCLuceneSort &sort);

protected:
    friend class QCLuceneHits;
};

class QHELP_EXPORT QCLuceneIndexSearcher : public QCLuceneSearcher
{
public:
    QCLuceneIndexSearcher(const QString &path);
    QCLuceneIndexSearcher(const QCLuceneIndexReader &reader);
    ~QCLuceneIndexSearcher();

    void close();
    qint32 maxDoc() const;
    QCLuceneIndexReader getReader();
    bool doc(qint32 i, QCLuceneDocument &document);

private:
    QCLuceneIndexReader reader;
};

class QHELP_EXPORT QCLuceneMultiSearcher : public QCLuceneSearcher
{
public:
    QCLuceneMultiSearcher(const QList<QCLuceneSearchable> searchables);
    ~QCLuceneMultiSearcher();

    void close();
    qint32 maxDoc() const;
    qint32 subDoc(qint32 index) const;
    qint32 subSearcher(qint32 index) const;
    qint32 searcherIndex(qint32 index) const;
    bool doc(qint32 i, QCLuceneDocument &document);
};

QT_END_NAMESPACE

#endif  // QSEARCHABLE_P_H
