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];
        }

}



Reply via email to