"Table: " + columnAttr[col.intValue()].getName()
"Table("+getColumnNames()+"): " + columnAttr[col.intValue()].getName()
	protected Result internalExecute(SessionContents sc, int sequence) {		IConsequence.Result conseq = new IConsequence.Result();		// identify all columns (attributes) assigned		// ignoring columns which have been set by this table		int noOfMatchingRows = 0;		Set<String>[] valueRanges = new Set[columnAttr.length];		List<Integer> assignedIndices = new LinkedList<Integer>();		List<Integer> unassignedIndices = new LinkedList<Integer>();		for (int i = 0; i < columnAttr.length; i++) {			AbstractAttribute attr = columnAttr[i];			if (attr.isAssigned() && attr.getSequence() < sequence) {				assignedIndices.add(new Integer(i));			} else {				unassignedIndices.add(new Integer(i));			}			valueRanges[i] = new HashSet<String>();		}		// iterate over rows and find included values per column		for (int i = 0; i < values.length; i++) {			boolean matchingRow = true;			for (Integer col : assignedIndices) {				if (columnAttr[col.intValue()].equalsTo(sc,						values[i][col.intValue()]).equals(FuzzyBoolEnum.FALSE)) {					matchingRow = false;					break;				}			}			if (matchingRow) {				noOfMatchingRows++;				for (int j = 0; j < values[0].length; j++) {					valueRanges[j].add(values[i][j]);				}			}		}		if (noOfMatchingRows == 0) {			conseq					.setViolation("Invalid value combination "							+ getColumnNames());		} else {			// for Enumerations include values			for (Integer col : unassignedIndices) {				// ignore the currently set attribute				if (columnAttr[col.intValue()].getSequence() == 1)					continue;				String[] applicableVals = (String[]) valueRanges[col.intValue()]						.toArray(new String[valueRanges[col.intValue()].size()]);				if (columnAttr[col.intValue()] instanceof Enumeration) {					Logger.getInstance().debug(							"Table: " + columnAttr[col.intValue()].getName()									+ " includes: "									+ Logger.arrayToString(applicableVals));					if (applicableVals.length == 0) {						conseq.setViolation("Invalid value combination "								+ getColumnNames());					}					IConsequence.Result res = ((Enumeration) columnAttr[col							.intValue()]).include(sc, applicableVals, sequence);					conseq.merge(res);				}				// TODO else { // for identified arbits set value			}		}		AbstractRule.Result result = new AbstractRule.Result(conseq);		// if only one row or none matches we have a result		result.setHasFired(noOfMatchingRows < 2);		return result;	}