/*------------------------------------------------------------------------------
* 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.
*
* Changes are Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
------------------------------------------------------------------------------*/
#ifndef _lucene_search_BooleanScorer_
#define _lucene_search_BooleanScorer_

#if defined(_LUCENE_PRAGMA_ONCE)
# pragma once
#endif

#include "Scorer.h"

CL_NS_DEF(search)

class BooleanScorer : public Scorer {
public:
    class Bucket : LUCENE_BASE {
    public:
        int32_t	doc;				  // tells if bucket is valid
        qreal	score;				  // incremental score
        int32_t	bits;				  // used for bool constraints
        int32_t	coord;				  // count of terms in score
        Bucket*	next;				  // next valid bucket

        Bucket();
        ~Bucket();
    };

    class SubScorer: LUCENE_BASE {
    public:
        bool done;
        Scorer* scorer;
        bool required;
        bool prohibited;
        HitCollector* collector;
        SubScorer* next;
        SubScorer(Scorer* scr, const bool r, const bool p, HitCollector* c, SubScorer* nxt);
        ~SubScorer();
    };

    class BucketTable:LUCENE_BASE {		
    private:
        BooleanScorer* scorer;
    public:
        Bucket* buckets;
        Bucket* first;			  // head of valid list

        BucketTable(BooleanScorer* scr);
        int32_t size() const;
        HitCollector* newCollector(const int32_t mask);
        void clear();
        ~BucketTable();

    };

    class Collector: public HitCollector {
    private:
        BucketTable* bucketTable;
        int32_t mask;
    public:
        Collector(const int32_t mask, BucketTable* bucketTable);

        void collect(const int32_t doc, const qreal score);
    };

    SubScorer* scorers;
    BucketTable* bucketTable;

    int32_t maxCoord;
    int32_t nextMask;

    int32_t end;
    Bucket* current;

public:
    LUCENE_STATIC_CONSTANT(int32_t,BucketTable_SIZE=1024);
    int32_t requiredMask;
    int32_t prohibitedMask;
    qreal* coordFactors;

    BooleanScorer(Similarity* similarity);
    ~BooleanScorer();
    void add(Scorer* scorer, const bool required, const bool prohibited);
    int32_t doc() const { return current->doc; }
    bool next();
    qreal score();
    bool skipTo(int32_t target);
    void explain(int32_t doc, Explanation* ret);
    TCHAR* toString();
    void computeCoordFactors();
};

CL_NS_END
#endif
