*/
private String getContainsStmt(AbstractCollectionStore acs)
{
if (containsStmt == null)
{
JavaTypeMapping ownerMapping = acs.getOwnerMapping();
DatastoreContainerObject containerTable = acs.getContainerTable();
boolean elementsAreSerialised = acs.isElementsAreSerialised();
JavaTypeMapping elementMapping = acs.getElementMapping();
ElementContainerStore.ElementInfo[] elementInfo = acs.getElementInfo();
StringBuffer stmt = new StringBuffer();
String containerAlias = "THIS";
String joinedElementAlias = "ELEM";
stmt.append("SELECT ");
for (int i = 0; i < ownerMapping.getNumberOfDatastoreMappings(); i++)
{
if (i > 0)
{
stmt.append(",");
}
stmt.append(ownerMapping.getDatastoreMapping(i).getDatastoreField().getIdentifier().toString());
}
stmt.append(" FROM ");
stmt.append(acs.getContainerTable().toString()).append(" ").append(containerAlias);
// Add join to element table if required (only allows for 1 element table currently)
boolean joinedDiscrim = false;
// TODO Enable this code applying the discrim restriction to JoinTable cases
/*if (elementInfo != null && elementInfo[0].getTable() != containerTable && elementInfo[0].getDiscriminatorMapping() != null)
{
// Need join to the element table to restrict the discriminator
joinedDiscrim = true;
JavaTypeMapping elemIdMapping = elementInfo[0].getTable().getIdMapping();
stmt.append(" INNER JOIN ");
stmt.append(elementInfo[0].getTable().toString()).append(" ").append(joinedElementAlias).append(" ON ");
for (int i=0;i<elementMapping.getNumberOfDatastoreFields();i++)
{
if (i > 0)
{
stmt.append(" AND ");
}
stmt.append(containerAlias).append(".").append(elementMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier());
stmt.append("=");
stmt.append(joinedElementAlias).append(".").append(elemIdMapping.getDataStoreMapping(0).getDatastoreField().getIdentifier());
}
}*/
stmt.append(" WHERE ");
for (int i = 0; i < ownerMapping.getNumberOfDatastoreMappings(); i++)
{
if (i > 0)
{
stmt.append(" AND ");
}
stmt.append(containerAlias).append(".")
.append(ownerMapping.getDatastoreMapping(i).getDatastoreField().getIdentifier().toString());
stmt.append(" = ");
stmt.append(((RDBMSMapping) ownerMapping.getDatastoreMapping(i)).getUpdateInputParameter());
}
for (int i = 0; i < elementMapping.getNumberOfDatastoreMappings(); i++)
{
// TODO Need to allow for the element datastore mapping being a BLOB field in which case this should
// be "AND ELEMENTCOLX LIKE ?"
stmt.append(" AND ");
stmt.append(containerAlias).append(".")
.append(elementMapping.getDatastoreMapping(i).getDatastoreField().getIdentifier().toString());
if (elementsAreSerialised)
{
// Can't directly compare serialised element fields
stmt.append(" LIKE ");
}
else
{
stmt.append(" = ");
}
stmt.append(((RDBMSMapping) elementMapping.getDatastoreMapping(i)).getUpdateInputParameter());
}
// TODO Remove the "containerTable == " clause and make discriminator restriction part of the JoinTable statement too
// Needs to pass TCK M-M relationship test. see contains(StateManager, Object) method also
if (elementInfo != null && containerTable == elementInfo[0].getDatastoreClass() &&
elementInfo[0].getDiscriminatorMapping() != null)
{
// Element table has discriminator so restrict to the element-type and subclasses
stmt.append(" AND (");
// Add WHERE for the element and each subclass type so we restrict to valid element types
HashSet subclasses = storeMgr.getSubClassesForClass(elementInfo[0].getClassName(), true, clr);
for (int i = 0; i < subclasses.size() + 1; i++)
{
JavaTypeMapping discrimMapping = elementInfo[0].getDiscriminatorMapping();
for (int j = 0; j < discrimMapping.getNumberOfDatastoreMappings(); j++)
{
if (joinedDiscrim)
{
stmt.append(joinedElementAlias);
}
else
{
stmt.append(containerAlias);
}
stmt.append(".").append(discrimMapping.getDatastoreMapping(j).getDatastoreField().getIdentifier().toString());
stmt.append(" = ");
stmt.append(((RDBMSMapping) discrimMapping.getDatastoreMapping(j)).getUpdateInputParameter());
if (j != discrimMapping.getNumberOfDatastoreMappings() - 1 || i != subclasses.size())
{
stmt.append(" OR ");
}
}
}
stmt.append(")");
}
JavaTypeMapping relationDiscriminatorMapping = acs.getRelationDiscriminatorMapping();
if (relationDiscriminatorMapping != null)
{
// Relation uses shared resource (FK, JoinTable) so restrict to this particular relation
for (int i = 0; i < relationDiscriminatorMapping.getNumberOfDatastoreMappings(); i++)
{
stmt.append(" AND ");
stmt.append(containerAlias).append(".")
.append(relationDiscriminatorMapping.getDatastoreMapping(i).getDatastoreField().getIdentifier().toString());
stmt.append(" = ");
stmt.append(((RDBMSMapping) relationDiscriminatorMapping.getDatastoreMapping(i)).getUpdateInputParameter());
}
}
containsStmt = stmt.toString();
}