package info.ephyra.answerselection.filters;

import info.ephyra.search.Result;

import java.util.ArrayList;

/**
 * <p>A filter that cuts off results if the total length of non-whitespace
 * characters exceeds a threshold.</p>
 *
 * <p>This class extends the class <code>Filter</code>.</p>
 *
 * @author Guido Sautter, Nico Schlaefer
 * @version 2006-07-15
 */
public class ResultLengthFilter extends Filter {
    /**
     * Maximum number of non-whitespace characters per question.
     */
    private static final int MAX_NON_WHITESPACE = 7000;

    private int cutoffLength = MAX_NON_WHITESPACE;

    /**
     */
    public ResultLengthFilter() {
    }

    /**
     * @param cutoffLength
     */
    public ResultLengthFilter(int cutoffLength) {
        this.cutoffLength = ((cutoffLength < MAX_NON_WHITESPACE) ? cutoffLength : MAX_NON_WHITESPACE);
    }

    /**
     * Ensures that the total number of non-whitespace characters in all answer
     * strings does not exceed <code>cutoffLength</code>.
     *
     * @param results array of <code>Result</code> objects
     * @return filtered array of <code>Result</code> objects
     */
    public Result[] apply(Result[] results) {
        ArrayList<Result> filtered = new ArrayList<Result>();

        int length = 0;
        for (Result r : results) {
            length += r.getAnswer().replaceAll("\\s", "").length();
            if (length <= this.cutoffLength)
                filtered.add(r);
            else
                break;
        }

        return filtered.toArray(new Result[filtered.size()]);
    }
}
