/*
*
* Copyright (c) 2004 SourceTap - www.sourcetap.com
*
* The contents of this file are subject to the SourceTap Public License
* ("License"); You may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.sourcetap.com/license.htm
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
*/
package com.sourcetap.sfa.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.condition.EntityComparisonOperator;
import org.ofbiz.entity.condition.EntityCondition;
import org.ofbiz.entity.condition.EntityConditionList;
import org.ofbiz.entity.condition.EntityExpr;
import org.ofbiz.entity.condition.EntityOperator;
import org.ofbiz.entity.model.DynamicViewEntity;
import org.ofbiz.entity.model.ModelKeyMap;
import org.ofbiz.entity.model.ModelViewEntity.ModelMemberEntity;
import org.ofbiz.entity.util.EntityFindOptions;
import org.ofbiz.entity.util.EntityListIterator;
/**
* @author Steve Fowler
*
*
*
*/
public class QueryInfo
{
protected String primaryEntityName;
protected Map secondaryEntityNames = new HashMap();
protected Map secondaryAttributes = new HashMap();
protected DynamicViewEntity dve = null;
protected List entityConditions = new ArrayList();
protected List orderBy = null;
protected GenericDelegator delegator;
protected List selectFields = null;
protected String saveResultListId = "";
public QueryInfo( GenericDelegator delegatorIn, String primaryEntity )
{
primaryEntityName = primaryEntity;
delegator = delegatorIn;
}
public void addCondition( EntityCondition newCondition )
{
entityConditions.add( newCondition );
}
public void addJoin( String firstEntity, String secondEntity, Boolean relOptional, String firstField, String secondField )
{
addJoin(firstEntity, firstEntity, secondEntity, secondEntity, relOptional, firstField, secondField);
}
public void addJoin( String firstEntity, String secondEntity, String secondEntityAlias, Boolean relOptional, String firstField, String secondField )
{
addJoin(firstEntity, firstEntity, secondEntity, secondEntityAlias, relOptional, firstField, secondField);
}
public void addJoin( String firstEntity, String firstEntityAlias, String secondEntity, String secondEntityAlias, Boolean relOptional, String firstField, String secondField )
{
addJoin(firstEntity, firstEntity, secondEntity, secondEntityAlias, relOptional, firstField, firstField, secondField, secondField);
}
public void addJoin( String firstEntity, String firstEntityAlias, String secondEntity, String secondEntityAlias, Boolean relOptional, String firstField, String firstFieldAlias, String secondField, String secondFieldAlias )
{
checkEntity( firstEntity, firstEntityAlias );
checkEntity( secondEntity, secondEntityAlias );
if ( !firstField.equals(firstFieldAlias))
addAlias(firstEntityAlias, firstField, firstFieldAlias);
if ( !secondField.equals(secondFieldAlias))
addAlias(secondEntityAlias, secondField, secondFieldAlias );
dve.addViewLink(firstEntityAlias, secondEntityAlias, relOptional, UtilMisc.toList(new ModelKeyMap(firstFieldAlias, secondFieldAlias)));
}
public void addJoin( String firstEntity, String secondEntity, Boolean relOptional, List keyMaps)
{
addJoin( firstEntity, firstEntity, secondEntity, secondEntity, relOptional, keyMaps);
}
public void addJoin( String firstEntity, String firstEntityAlias, String secondEntity, String secondEntityAlias, Boolean relOptional, List keyMaps )
{
checkEntity( firstEntity, firstEntityAlias );
checkEntity( secondEntity, secondEntityAlias );
dve.addViewLink(firstEntityAlias, secondEntityAlias, relOptional, keyMaps);
}
public void checkEntity( String entityName, String entityAlias )
{
if ( !entityName.equals(primaryEntityName) && !secondaryEntityNames.containsKey(entityAlias) )
{
if ( dve == null )
{
dve = EntityHelper.createDynamicViewEntity( delegator, primaryEntityName );
}
dve.addMemberEntity( entityAlias, entityName);
secondaryEntityNames.put( entityAlias, entityName );
}
}
public void checkAttribute( String entityAlias, String attributeName)
{
checkAttribute( entityAlias, attributeName, attributeName);
}
public void checkAttribute( String entityAlias, String attributeName, String attributeAlias )
{
checkEntity( entityAlias, entityAlias );
if ( !entityAlias.equals(primaryEntityName ) && !secondaryAttributes.containsKey(entityAlias + "." + attributeAlias))
{
dve.addAlias(entityAlias, attributeAlias, attributeName, null, null, null, null);
secondaryAttributes.put(entityAlias + "." + attributeAlias, attributeName);
}
}
public void addCondition( String entityAlias, String attributeAlias, EntityComparisonOperator operator, Object value )
{
addCondition(entityAlias, attributeAlias, attributeAlias, operator, value);
}
public void addCondition( String entityAlias, String attributeAlias, String attributeName, EntityComparisonOperator operator, Object value )
{
checkAttribute( entityAlias, attributeName, attributeAlias);
entityConditions.add( new EntityExpr( attributeAlias, operator, value));
}
public void addAlias( String entityAlias, String attributeName, String aliasName)
{
checkEntity( entityAlias, entityAlias );
dve.addAlias(entityAlias, aliasName, attributeName, null, null, null, null);
secondaryAttributes.put(entityAlias + "." + aliasName, attributeName);
}
public List executeQuery()
throws GenericEntityException
{
if ( isDynamic() )
{
return EntityHelper.findByCondition( delegator, dve, new EntityConditionList( entityConditions, EntityOperator.AND), orderBy);
}
else
{
return delegator.findByCondition( primaryEntityName, new EntityConditionList (entityConditions, EntityOperator.AND), null, orderBy);
}
}
public EntityListIterator getQueryIterator()
throws GenericEntityException
{
if ( isDynamic() )
{
return EntityHelper.findIteratorByCondition( delegator, dve, new EntityConditionList( entityConditions, EntityOperator.AND), selectFields, orderBy);
}
else
{
return delegator.findListIteratorByCondition( primaryEntityName, new EntityConditionList (entityConditions, EntityOperator.AND), null, selectFields, orderBy,
new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE , EntityFindOptions.CONCUR_READ_ONLY, true));
}
}
public EntityConditionList getEntityConditions()
{
return new EntityConditionList( entityConditions, EntityOperator.AND);
}
public boolean isDynamic()
{
return ( dve != null );
}
public DynamicViewEntity getDynamicViewEntity()
{
return dve;
}
public String getPrimaryEntity()
{
return primaryEntityName;
}
public GenericDelegator getDelegator()
{
return delegator;
}
public void setOrderBy( List orderBy_)
{
orderBy = orderBy_;
}
public List getOrderBy()
{
return orderBy;
}
public List getEntities()
{
if ( dve == null)
return UtilMisc.toList(primaryEntityName);
ArrayList entityList = new ArrayList();
Iterator listIter = dve.getModelMemberEntitiesEntryIter();
while ( listIter.hasNext())
{
Map.Entry entry = (Map.Entry) listIter.next();
ModelMemberEntity modelMemberEntity = (ModelMemberEntity) entry.getValue();
entityList.add(modelMemberEntity.getEntityName());
}
return entityList;
}
public List getSelectFields()
{
return selectFields;
}
public void setSelectFields( List fieldsToSelect)
{
selectFields = fieldsToSelect;
}
public void addSelectFields( String fieldName )
{
if ( selectFields == null )
selectFields = new ArrayList();
selectFields.add(fieldName);
}
/**
* @return Returns the saveResultListId.
*/
public String getSaveResultListId() {
return saveResultListId;
}
/**
* @param saveResultListName The saveResultListId to set.
*/
public void setSaveResultListId(String saveResultListId) {
this.saveResultListId = saveResultListId;
}
}