* @return The Query Statement.
**/
protected QueryExpression getIteratorStatement(StateManager ownerSM)
{
QueryExpression stmt = null;
final ClassLoaderResolver clr = ownerSM.getObjectManager().getClassLoaderResolver();
if (elementsAreEmbedded || elementsAreSerialised)
{
// Element = Non-PC
stmt = dba.newQueryStatement(containerTable, clr);
stmt.select(elementMapping);
}
else if (elementMapping instanceof ReferenceMapping)
{
// Element = Reference type (interface/Object)
// Just select the join table since we're going to return the implementation id columns only
stmt = dba.newQueryStatement(containerTable, clr);
}
else if (elementInfo != null)
{
// Element = PC
// Join to the element table(s)
for (int i=0;i<elementInfo.length;i++)
{
// TODO This will only work if all element types have a discriminator
final int elementNo = i;
final Class elementCls = clr.classForName(elementInfo[elementNo].getClassName());
QueryExpression elementStmt = null;
if (elementInfo[elementNo].getDiscriminatorStrategy() != null &&
elementInfo[elementNo].getDiscriminatorStrategy() != DiscriminatorStrategy.NONE)
{
// The element uses a discriminator so just use that in the SELECT
if (storeMgr.getOMFContext().getTypeManager().isReferenceType(clr.classForName(ownerMemberMetaData.getCollection().getElementType())))
{
// Take the metadata for the first implementation of the reference type
String[] clsNames = storeMgr.getOMFContext().getMetaDataManager().getClassesImplementingInterface(ownerMemberMetaData.getCollection().getElementType(), clr);
Class[] cls = new Class[clsNames.length];
for( int j=0; j<clsNames.length; j++)
{
cls[j] = clr.classForName(clsNames[j]);
}
elementStmt = new DiscriminatorIteratorStatement(clr, cls,
true, this.storeMgr, true, allowsNull,
containerTable, elementMapping, elmIdentifier).getQueryStatement(null);
}