/*
 * $Id: ClassifyResultFilter.java,v 1.6 2006/07/17 13:04:01 lawern Exp $
 * 
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: ClassifyResultFilter.java,v $
 * Revision 1.6  2006/07/17 13:04:01  lawern
 * Neuer typografiegewichteter Index und k-NN-Klassifikation aus meiner Diss.
 *
 * Revision 1.5  2004/07/20 08:37:47  jonyp
 * added copyright info + cvs log
 *
 * Revision 1.4  2004/03/30 13:25:07  lawern
 * Anpassung an veränderte getCategoryIds-Methode der Klasse CategoryUtils.
 *
 * Revision 1.3  2004/03/13 19:15:13  marbobo
 * Unbenutze lokale Variablen projektweit entsorgt
 *
 * Revision 1.2  2003/12/24 10:12:13  bigmac
 * Projektweite Import-Optimierung
 *
 * Revision 1.1  2003/06/10 13:41:31  lawern
 * initiale Version
 *
 *
 */
package vkc.search;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.BitSet;
import java.util.Collection;

import org.apache.lucene.index.IndexReader;


/**
 * Klasse filtert die Suchergebnisse für eine Anfrage
 * 
 * <p></p>
 *
 * @author lawern
 */
public final class ClassifyResultFilter extends org.apache.lucene.search.Filter {
    public static PrintWriter out = null;
    Collection validCategories = null;
    String documentId = null;

    /**
     * Konstruktor
     *
     * @param validCategories Zeigt nur Kategorien aus dem übergebenen Set
     * 
     */
    public ClassifyResultFilter(Collection validCategories, Integer documentId) {
        this.validCategories = validCategories;
        if (documentId != null) {
            this.documentId = documentId.toString();
        }
    }

    /**
     * Methode liefert ein BitSet zurück, das angibt welche Dokumente im
     * Ergebnis auftauchen sollen. d.h., falls das i-te Bit gesetzt ist, wird
     * das i-te Dokument im Index für die Suche zugelassen.
     *
     * @param reader - Reader für den Lesezugriff auf den aktuellen Index von
     *        Lucene
     */
    final public BitSet bits(IndexReader reader) throws IOException {
        int indexSize = reader.maxDoc();
        BitSet bits = new BitSet(indexSize);
        org.apache.lucene.document.Document doc = null;

        for (int i = 0; i < indexSize; i++) {
            try {
                doc = reader.document(i);

                if ((validCategories != null) && (!validCategories.contains(new Integer(doc.get("categoryId"))))) {
                    // prüfen ob das Dokument dem Benutzer angezeigt werden darf
                    continue;
                }
                
                if (doc.get("documentId").equals(documentId)) {
                    // nicht das Query-Dokument zurückliefern
                    continue;
                }

                bits.set(i);
            } catch (Exception ex) {
                continue;
            }
        }

        return bits;
    }
}
