Constraints-linkmode patch from Daniel Ruthardt
<http://grazia.helma.at/pipermail/helma-dev/2003-August/000272.html> Changes to patch: * Changed type.properties option name from "linkmode" to "logic" * Added support for XOR * Some internal code reorganization
This commit is contained in:
parent
a73d52d184
commit
4466c58864
1 changed files with 42 additions and 0 deletions
|
@ -47,6 +47,13 @@ public final class Relation {
|
||||||
// this is managed differently than REFERENCE, hence the separate type.
|
// this is managed differently than REFERENCE, hence the separate type.
|
||||||
public final static int COMPLEX_REFERENCE = 3;
|
public final static int COMPLEX_REFERENCE = 3;
|
||||||
|
|
||||||
|
// constraints linked together by OR or AND if applicable?
|
||||||
|
private int constraintsLogic;
|
||||||
|
public final static int CONSTRAINTS_AND = 0;
|
||||||
|
public final static int CONSTRAINTS_OR = 1;
|
||||||
|
public final static int CONSTRAINTS_XOR = 2;
|
||||||
|
public final String[] logicalOperators = {" AND ", " OR ", " XOR "};
|
||||||
|
|
||||||
// direct mapping is a very powerful feature: objects of some types can be directly accessed
|
// direct mapping is a very powerful feature: objects of some types can be directly accessed
|
||||||
// by one of their properties/db fields.
|
// by one of their properties/db fields.
|
||||||
// public final static int DIRECT = 3;
|
// public final static int DIRECT = 3;
|
||||||
|
@ -93,6 +100,7 @@ public final class Relation {
|
||||||
this.constraints = rel.constraints;
|
this.constraints = rel.constraints;
|
||||||
this.accessName = rel.accessName;
|
this.accessName = rel.accessName;
|
||||||
this.maxSize = rel.maxSize;
|
this.maxSize = rel.maxSize;
|
||||||
|
this.constraintsLogic = rel.constraintsLogic;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -304,10 +312,33 @@ public final class Relation {
|
||||||
cnst.addElement(new Constraint(local, foreign, false));
|
cnst.addElement(new Constraint(local, foreign, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parse constraints logic
|
||||||
|
if (cnst.size() > 1) {
|
||||||
|
String logic = props.getProperty(propName + ".logic");
|
||||||
|
if ("and".equalsIgnoreCase(logic))
|
||||||
|
constraintsLogic = CONSTRAINTS_AND;
|
||||||
|
else if ("or".equalsIgnoreCase(logic))
|
||||||
|
constraintsLogic = CONSTRAINTS_OR;
|
||||||
|
else if ("xor".equalsIgnoreCase(logic))
|
||||||
|
constraintsLogic = CONSTRAINTS_XOR;
|
||||||
|
else
|
||||||
|
throw new RuntimeException("Unrecognized logical operator: "+logic);
|
||||||
|
} else
|
||||||
|
constraintsLogic = CONSTRAINTS_AND;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constraints linked by AND or OR?
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getConstraintsOperator() {
|
||||||
|
return logicalOperators[constraintsLogic];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does this relation describe a virtual (collection) node?
|
* Does this relation describe a virtual (collection) node?
|
||||||
*/
|
*/
|
||||||
|
@ -647,9 +678,20 @@ public final class Relation {
|
||||||
prefix = " AND ";
|
prefix = " AND ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (constraints.length > 1 && constraintsLogic != CONSTRAINTS_AND) {
|
||||||
|
q.append(prefix);
|
||||||
|
q.append("(");
|
||||||
|
prefix = "";
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < constraints.length; i++) {
|
for (int i = 0; i < constraints.length; i++) {
|
||||||
q.append(prefix);
|
q.append(prefix);
|
||||||
constraints[i].addToQuery(q, home, nonvirtual);
|
constraints[i].addToQuery(q, home, nonvirtual);
|
||||||
|
prefix = getConstraintsOperator();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (constraints.length > 1 && constraintsLogic != CONSTRAINTS_AND) {
|
||||||
|
q.append(")");
|
||||||
prefix = " AND ";
|
prefix = " AND ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue