int[] fieldNumbers;
StatementExpressionIndex[] statementExpressionIndex;
Set columnsInThisType = new HashSet();
AbstractMemberMetaData[] fmds = new AbstractMemberMetaData[columnNames.length];
Map fieldColumns = new HashMap();
DatastoreClass dc = storeMgr.getDatastoreClass(persistentTypes[i].getClassName(),om.getClassLoaderResolver());
AbstractClassMetaData acmd = om.getMetaDataManager().getMetaDataForClass(persistentTypes[i].getClassName(), om.getClassLoaderResolver());
Object id = null;
for (int j=startColumnIndex;j<columnNames.length;j++)
{
if( columnsInThisType.contains(columnNames[j]) )
{
//already added this column, so must be another persistent type
startColumnIndex = j;
break;
}
boolean found = false;
if (acmd.getIdentityType() == IdentityType.DATASTORE)
{
DatastoreField df = dc.getDataStoreObjectIdMapping().getDataStoreMapping(0).getDatastoreField();
if( df.getIdentifier().getIdentifier().equals(columnNames[j]))
{
//add +1 because result sets in jdbc starts with 1
int datastoreIdentityExpressionIndex = j+1;
//get object id if datastore identifier
if( dc.getDataStoreObjectIdMapping() != null )
{
id = dc.getDataStoreObjectIdMapping().getObject(om, rs, new int[] {datastoreIdentityExpressionIndex});
}
found=true;
}
}
for(int k=0; k<acmd.getNoOfManagedMembers()+acmd.getNoOfInheritedManagedMembers() && !found; k++)
{
AbstractMemberMetaData apmd = acmd.getMetaDataForManagedMemberAtAbsolutePosition(k);
if( persistentTypes[i].getColumnForField(apmd.getName())!=null )
{
if(persistentTypes[i].getColumnForField(apmd.getName()).equals(columnNames[j]))
{
fieldColumns.put(columnNames[j], apmd);
columnsInThisType.add(columnNames[j]);
fmds[j] = apmd;
found = true;
}
}
else
{
JavaTypeMapping mapping = dc.getFieldMapping(apmd);
for(int l=0; l<mapping.getDataStoreMappings().length && !found; l++)
{
DatastoreField df = mapping.getDataStoreMapping(l).getDatastoreField();
if( df.getIdentifier().getIdentifier().equals(columnNames[j]))
{
fieldColumns.put(columnNames[j], apmd);
columnsInThisType.add(columnNames[j]);
fmds[j] = apmd;
found = true;
}
}
}
}
if( !columnsInThisType.contains(columnNames[j]) )
{
//column not found in this type, so must be another persistent type
startColumnIndex = j;
break;
}
}
//build StatementExpressionIndex
Set fields = new HashSet();
fields.addAll(fieldColumns.values());
statementExpressionIndex = new StatementExpressionIndex[acmd.getNoOfManagedMembers() + acmd.getNoOfInheritedManagedMembers()];
fieldNumbers = new int[fields.size()];
Iterator it = fields.iterator();
int j=0;
while (it.hasNext())
{
AbstractMemberMetaData apmd = (AbstractMemberMetaData)it.next();
fieldNumbers[j] = apmd.getAbsoluteFieldNumber();
statementExpressionIndex[fieldNumbers[j]] = new StatementExpressionIndex();
List indexes = new ArrayList();
for( int k=0; k<fmds.length; k++)
{
if( fmds != null && fmds[k] == apmd)
{
indexes.add(new Integer(k));
}
}
int[] indxs = new int[indexes.size()];
for( int k=0; k<indxs.length; k++)
{
//add +1 because result sets in jdbc starts with 1
indxs[k] = ((Integer)indexes.get(k)).intValue()+1;
}
statementExpressionIndex[fieldNumbers[j]].setExpressionIndex(indxs);
statementExpressionIndex[fieldNumbers[j]].setMapping(dc.getFieldMapping(apmd));
j++;
}
Object obj = null;
Class type = om.getClassLoaderResolver().classForName(persistentTypes[i].getClassName());