package gamma;

import PrologDB.Tuple;
import gammaSupport.BMap;
import gammaSupport.Connector;
import gammaSupport.GammaDebug;
import static gammaSupport.GammaDebug.filter4Connector;
import static gammaSupport.GammaDebug.tupleFiltered;
import gammaSupport.ReadEnd;
import gammaSupport.ThreadList;
import gammaSupport.WriteEnd;

/** create a BFilter */
public class BFilter extends Thread implements gammaSupport.GammaConstants {

    ReadEnd in;
    ReadEnd m;
    WriteEnd out;
    BMap map;
    String joinkey;

    /** create a BFilter with input in, output out, and bitmap output m 
 over hashkey
     * 
     * @param in -- input connector
     * @param out -- output connector
     * @param m -- output connector for bitmap
     * @param hashkey -- hashkey on which bitmap is created
     */
    BFilter(Connector in, Connector out, Connector m, String hashkey) {
        this.in = in.getReadEnd();
        this.out = out.getWriteEnd();
        this.m = m.getReadEnd();
        this.joinkey = hashkey;
        out.setTableSchema(in.getTableSchema());
        m.setTableSchema(dummy);
        
        in.verifyField(hashkey,"BFilter");
        ThreadList.add(this);
    }

    /** code for BFilter */
    @Override
    public void run() {
        // Step 1: read bit map
        map = m.getNextBMap();
        GammaDebug.report(filter4Connector,m.getName(),map);

        // Step 2: drain input stream and filter tuples
        while (true) {
            Tuple t = in.getNextTuple();
            if (t == null) {
                out.close();
                break;
            }
            if (map.getBit(t.get(joinkey))) {
                out.putNextTuple(t);
            } else 
                GammaDebug.report(tupleFiltered,t.toString(), 
                    m.getName() ,t.get(joinkey),BMap.myhash(t.get(joinkey)));
        }
    }
}
