queryHints = props.getProperty(propName + ".hints");
    protected void parseOptions(Vector cnst, Properties props) {        String loading = props.getProperty(propName + ".loadmode");        aggressiveLoading = (loading != null) &&                            "aggressive".equalsIgnoreCase(loading.trim());        String caching = props.getProperty(propName + ".cachemode");        aggressiveCaching = (caching != null) &&                            "aggressive".equalsIgnoreCase(caching.trim());        // get order property        order = props.getProperty(propName + ".order");        if ((order != null) && (order.trim().length() == 0)) {            order = null;        }        // get additional filter property        filter = props.getProperty(propName + ".filter");        if (filter != null) {            if (filter.trim().length() == 0) {                filter = null;                filterFragments = filterPropertyRefs = null;            } else {                // parenthesise filter                Vector fragments = new Vector();                Vector propertyRefs = new Vector();                parsePropertyString(filter, fragments, propertyRefs);                // if no references where found, just use the filter string                // otherwise use the filter fragments and proeprty refs instead                if (propertyRefs.size() > 0) {                    filterFragments = fragments;                    filterPropertyRefs = propertyRefs;                } else {                    filterFragments = filterPropertyRefs = null;                }            }        }        // get additional tables        additionalTables = props.getProperty(propName + ".filter.additionalTables");        if (additionalTables != null && additionalTables.trim().length() == 0) {                additionalTables = null;        }        // get max size of collection        String max = props.getProperty(propName + ".maxSize");        if (max != null) {            try {                maxSize = Integer.parseInt(max);            } catch (NumberFormatException nfe) {                maxSize = 0;            }        } else {            maxSize = 0;        }        // get group by property        groupby = props.getProperty(propName + ".group");        if ((groupby != null) && (groupby.trim().length() == 0)) {            groupby = null;        }        if (groupby != null) {            groupbyOrder = props.getProperty(propName + ".group.order");            if ((groupbyOrder != null) && (groupbyOrder.trim().length() == 0)) {                groupbyOrder = null;            }            groupbyPrototype = props.getProperty(propName + ".group.prototype");            if ((groupbyPrototype != null) && (groupbyPrototype.trim().length() == 0)) {                groupbyPrototype = null;            }            // aggressive loading and caching is not supported for groupby-nodes            // aggressiveLoading = aggressiveCaching = false;        }        // check if subnode condition should be applied for property relations        accessName = props.getProperty(propName + ".accessname");        // parse contstraints        String local = props.getProperty(propName + ".local");        String foreign = props.getProperty(propName + ".foreign");        if ((local != null) && (foreign != null)) {            cnst.addElement(new Constraint(local, foreign, false));            columnName = local;        }        // parse additional contstraints from *.1 to *.9        for (int i=1; i<10; i++) {            local = props.getProperty(propName + ".local."+i);            foreign = props.getProperty(propName + ".foreign."+i);            if ((local != null) && (foreign != null)) {                cnst.addElement(new Constraint(local, foreign, false));            }        }        // parse constraints logic        if (cnst.size() > 1) {            String logic = props.getProperty(propName + ".logicalOperator");            if ("and".equalsIgnoreCase(logic)) {                logicalOperator = AND;            } else if ("or".equalsIgnoreCase(logic)) {                logicalOperator = OR;            } else if ("xor".equalsIgnoreCase(logic)) {                logicalOperator = XOR;            } else {                logicalOperator = AND;            }        } else {            logicalOperator = AND;        }    }