brj 2005/11/12 09:23:33
Modified: src/java/org/apache/ojb/broker/accesslayer/sql Tag:
OJB_1_0_RELEASE SqlQueryStatement.java
Log:
fix for ojb-50.
path class hints are part of the key when looking for an alias
Revision Changes Path
No revision
No revision
1.75.2.15 +54 -20
db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlQueryStatement.java
Index: SqlQueryStatement.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlQueryStatement.java,v
retrieving revision 1.75.2.14
retrieving revision 1.75.2.15
diff -u -r1.75.2.14 -r1.75.2.15
--- SqlQueryStatement.java 3 Nov 2005 19:59:51 -0000 1.75.2.14
+++ SqlQueryStatement.java 12 Nov 2005 17:23:33 -0000 1.75.2.15
@@ -72,7 +72,7 @@
private TableAlias m_search;
/** the query */
private QueryByCriteria m_query;
- /** the mapping of paths to TableAliases */
+ /** the mapping of paths to TableAliases. the key is built using the
path and the path class hints. */
private HashMap m_pathToAlias = new HashMap();
/** the mapping of ClassDescriptor to TableAliases */
private HashMap m_cldToAlias = new HashMap();
@@ -132,7 +132,7 @@
{
MtoNQuery mnQuery = (MtoNQuery)m_query;
TableAlias mnAlias = new
TableAlias(mnQuery.getIndirectionTable(), M_N_ALIAS);
- m_pathToAlias.put(mnQuery.getIndirectionTable(), mnAlias);
+ setTableAliasForPath(mnQuery.getIndirectionTable(), null,
mnAlias);
}
if (m_searchCld == m_baseCld)
@@ -1019,8 +1019,9 @@
boolean outer = useOuterJoins;
int pathLength;
+ List hintClasses = (List) pathClasses.get(aPath);
String pathAlias = aUserAlias == null ? null :
aUserAlias.getAlias(aPath);
- curr = getTableAliasForPath(aPath, pathAlias);
+ curr = getTableAliasForPath(aPath, pathAlias, hintClasses);
if (curr != null)
{
@@ -1084,7 +1085,7 @@
{
String mnAttrPath = attrPath + "*";
String mnUserAlias = (aUserAlias ==
null ? null : aUserAlias + "*");
- indirect =
getTableAliasForPath(mnAttrPath, mnUserAlias);
+ indirect =
getTableAliasForPath(mnAttrPath, mnUserAlias, null);
if (indirect == null)
{
indirect =
createTableAlias(cod.getIndirectionTable(), mnAttrPath, mnUserAlias);
@@ -1141,11 +1142,10 @@
}
pathAlias = aUserAlias == null ? null :
aUserAlias.getAlias(attrPath);
- curr = getTableAliasForPath(attrPath, pathAlias);
+ curr = getTableAliasForPath(attrPath, pathAlias,
hintClasses);
if (curr == null)
{
- List hintClasses = (List)
pathClasses.get(aPath);
curr = createTableAlias(cld, attrPath,
pathAlias, hintClasses);
outer = outer || (curr.cld == prev.cld) ||
curr.hasExtents() || useOuterJoins;
@@ -1157,7 +1157,6 @@
prev = curr;
}
- // PAW
m_logger.debug("Result of getTableAlias(): " + curr);
return curr;
}
@@ -1295,8 +1294,7 @@
String aliasName = String.valueOf(getAliasChar()) + m_aliasCount++;
// m_pathToAlias.size();
alias = new TableAlias(cld, aliasName, lookForExtents, hints);
- m_pathToAlias.put(path, alias);
-
+ setTableAliasForPath(path, hints, alias);
return alias;
}
@@ -1335,8 +1333,8 @@
String aliasName = String.valueOf(getAliasChar()) + m_aliasCount++;
// + m_pathToAlias.size();
alias = new TableAlias(table, aliasName);
- m_pathToAlias.put(path, alias);
- m_logger.debug("createTableAlias2: path: " + path + "
tableAlias: " + alias);
+ setTableAliasForPath(path, null, alias);
+ m_logger.debug("createTableAlias2: path: " + path + " tableAlias: "
+ alias);
return alias;
}
@@ -1344,11 +1342,46 @@
/**
* Answer the TableAlias for aPath
* @param aPath
+ * @param hintClasses
* @return TableAlias, null if none
*/
- private TableAlias getTableAliasForPath(String aPath)
+ private TableAlias getTableAliasForPath(String aPath, List hintClasses)
+ {
+ return (TableAlias) m_pathToAlias.get(buildAliasKey(aPath,
hintClasses));
+ }
+
+ /**
+ * Set the TableAlias for aPath
+ * @param aPath
+ * @param hintClasses
+ * @param TableAlias
+ */
+ private void setTableAliasForPath(String aPath, List hintClasses,
TableAlias anAlias)
+ {
+ m_pathToAlias.put(buildAliasKey(aPath, hintClasses), anAlias);
+ }
+
+ /**
+ * Build the key for the TableAlias based on the path and the hints
+ * @param aPath
+ * @param hintClasses
+ * @return the key for the TableAlias
+ */
+ private String buildAliasKey(String aPath, List hintClasses)
{
- return (TableAlias) m_pathToAlias.get(aPath);
+ if (hintClasses == null || hintClasses.isEmpty())
+ {
+ return aPath;
+ }
+
+ StringBuffer buf = new StringBuffer(aPath);
+ for (Iterator iter = hintClasses.iterator(); iter.hasNext();)
+ {
+ Class hint = (Class) iter.next();
+ buf.append(" ");
+ buf.append(hint.getName());
+ }
+ return buf.toString();
}
/**
@@ -1374,17 +1407,18 @@
* Answer the TableAlias for aPath or aUserAlias
* @param aPath
* @param aUserAlias
+ * @param hintClasses
* @return TableAlias, null if none
*/
- private TableAlias getTableAliasForPath(String aPath, String aUserAlias)
+ private TableAlias getTableAliasForPath(String aPath, String aUserAlias,
List hintClasses)
{
if (aUserAlias == null)
{
- return getTableAliasForPath(aPath);
+ return getTableAliasForPath(aPath, hintClasses);
}
else
{
- return getTableAliasForPath(aUserAlias +
ALIAS_SEPARATOR + aPath);
+ return getTableAliasForPath(aUserAlias +
ALIAS_SEPARATOR + aPath, hintClasses);
}
}
@@ -1506,7 +1540,7 @@
if (getQuery() instanceof MtoNQuery)
{
MtoNQuery mnQuery = (MtoNQuery)m_query;
-
buf.append(getTableAliasForPath(mnQuery.getIndirectionTable()).getTableAndAlias());
+
buf.append(getTableAliasForPath(mnQuery.getIndirectionTable(),
null).getTableAndAlias());
buf.append(", ");
}
buf.append(alias.getTableAndAlias());
@@ -1681,7 +1715,7 @@
{
SuperReferenceDescriptor superRef = cld.getSuperReference();
FieldDescriptor[] leftFields =
superRef.getForeignKeyFieldDescriptors(cld);
- TableAlias base_alias = getTableAliasForPath(name, null);
+ TableAlias base_alias = getTableAliasForPath(name, null, null);
String aliasName = String.valueOf(getAliasChar()) +
m_aliasCount++;
TableAlias right = new TableAlias(superCld, aliasName,
useOuterJoin, null);
@@ -1712,7 +1746,7 @@
{
FieldDescriptor[] leftFields = subCld.getPkFields();
FieldDescriptor[] rightFields =
srd.getForeignKeyFieldDescriptors(subCld);
- TableAlias base_alias = getTableAliasForPath(name, null);
+ TableAlias base_alias = getTableAliasForPath(name, null,
null);
String aliasName = String.valueOf(getAliasChar()) +
m_aliasCount++;
TableAlias right = new TableAlias(subCld, aliasName, false,
null);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]