On Mar 30, 2006, at 6:08 PM, Tobias SCHOESSLER wrote:
Maybe someone finds it usefull. See source attached.
(See attached file: ExpressionUtil.java)
Looks like Apache list is setup to strip attachments. Posting your
sources inline. We may post it on Wiki as well.
Andrus
----------------------
package org.unodc.proj.ddb.util;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import org.objectstyle.cayenne.DataObject;
import org.objectstyle.cayenne.access.DataContext;
import org.objectstyle.cayenne.exp.Expression;
import org.objectstyle.cayenne.exp.ExpressionFactory;
import org.objectstyle.cayenne.map.Entity;
import org.objectstyle.cayenne.map.ObjAttribute;
import org.objectstyle.cayenne.map.ObjEntity;
import org.objectstyle.cayenne.map.Relationship;
public class ExpressionUtil {
Logger log = Logger.getLogger(ExpressionUtil.class);
DataContext ctxt;
public ExpressionUtil(DataContext ctxt ) {
this.ctxt = ctxt;
}
private void generateExpression(Expression[] searchExp, DataObject
dataObject, Set avoid, String path, List excludeClasses) {
avoid.add(dataObject);
ObjEntity objEntity = ctxt.getEntityResolver().lookupObjEntity
(dataObject);
Iterator relationshipsIt =
objEntity.getRelationships().iterator();
log.debug(objEntity.getName() + ">>>");
// attributes
Iterator attributesIt = objEntity.getAttributes().iterator();
while (attributesIt.hasNext()) {
ObjAttribute objAttribute = (ObjAttribute)
attributesIt.next();
String attr = objAttribute.getName();
Object value =
dataObject.readProperty(objAttribute.getName());
log.debug(" " + objAttribute.getName() + ":" + value);
if (dataObject.readProperty(objAttribute.getName()) != null && !
excludeClasses.contains(dataObject.getClass())) {
log.debug(" adding expression for " + path
+ attr);
Expression exp = null;
if (objAttribute.getDbAttribute().getType() ==
java.sql.Types.LONGVARCHAR) {
exp = ExpressionFactory.likeExp(path +
attr, value);
} else {
exp = ExpressionFactory.matchExp(path +
attr, value);
}
if (searchExp[0] == null) {
searchExp[0] = exp;
} else {
searchExp[0] = searchExp[0].andExp(exp);
}
}
}
// dive into relationships
while (relationshipsIt.hasNext()) {
Relationship relationship = (Relationship)
relationshipsIt.next();
Entity targetEntity = relationship.getTargetEntity();
String relName = relationship.getName();
log.debug(" <" + relName + ">");
if (relationship.isToMany()) {
log.debug(" => " +
relationship.getTargetEntityName());
List list = (List)
dataObject.readProperty(relName);
Iterator depDataObjectsIt = list.iterator();
while (depDataObjectsIt.hasNext()) {
DataObject depDataObject = (DataObject)
depDataObjectsIt.next();
if (!avoid.contains(depDataObject)) {
// prevent loops
generateExpression(searchExp, depDataObject, avoid, path +
relName + ".", excludeClasses);
}
}
} else {
log.debug(" -> " +
relationship.getTargetEntityName());
DataObject depDataObject = (DataObject) dataObject.readProperty
(relName);
if (depDataObject != null) {
if (!avoid.contains(depDataObject)) {
// prevent loops
generateExpression(searchExp, depDataObject, avoid, path +
relName + ".", excludeClasses);
}
}
}
// addExpressions(searchExp, )
}
log.debug("<<<" + objEntity.getName());
}
/**
* Generates an Expression matching all the non null attribute
values of a given DataObject graph.
* @param dataObject root of the graph, expressions are generated
relative to this node
* @param exclude a list of classes to exclude from the generation
*/
public Expression expressionFromDataObject(DataObject dataObject,
List exclude) {
Expression[] searchExp = new Expression[1];
generateExpression(searchExp, dataObject, new HashSet(), "",
exclude);
return searchExp[0];
}
}