You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by br...@apache.org on 2003/08/15 16:13:07 UTC
cvs commit: db-ojb/src/test/org/apache/ojb/broker QueryTest.java
brj 2003/08/15 07:13:07
Modified: src/java/org/apache/ojb/broker/accesslayer/sql
SqlQueryStatement.java SqlSelectStatement.java
src/test/org/apache/ojb/broker QueryTest.java
Log:
subqueries referencing attribute of enclosing query
Revision Changes Path
1.49 +59 -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.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- SqlQueryStatement.java 2 Aug 2003 09:24:00 -0000 1.48
+++ SqlQueryStatement.java 15 Aug 2003 14:13:07 -0000 1.49
@@ -80,11 +80,12 @@
/**
* Model a Statement based on Query.
*
- * @author <a href="mailto:jbraeuchi@hotmail.com">Jakob Braeuchi</a>
+ * @author <a href="mailto:jbraeuchi@gmx.ch">Jakob Braeuchi</a>
* @version $Id$
*/
public abstract class SqlQueryStatement implements SqlStatement, JoinSyntaxTypes
{
+ private SqlQueryStatement m_parentStatement;
/** the logger */
Logger m_logger = LoggerFactory.getLogger(SqlQueryStatement.class);
/** the target table of the query */
@@ -110,12 +111,20 @@
*/
public SqlQueryStatement(Platform pf, ClassDescriptor cld, String[] columns, Query query, Logger logger)
{
+ this (null, pf, cld, columns, query, logger);
+ }
+
+ /**
+ * Constructor for SqlCriteriaStatement.
+ */
+ public SqlQueryStatement(SqlQueryStatement parent, Platform pf, ClassDescriptor cld, String[] columns, Query query, Logger logger)
+ {
+ this.m_parentStatement = parent;
this.m_query = (QueryByCriteria) query;
this.m_columns = columns;
this.pf = pf;
this.m_searchCld = cld;
- if ((m_query == null)
- || (m_query.getBaseClass() == m_query.getSearchClass()))
+ if ((m_query == null) || (m_query.getBaseClass() == m_query.getSearchClass()))
{
this.m_baseCld = m_searchCld;
}
@@ -123,15 +132,14 @@
{
this.m_baseCld = cld.getRepository().getDescriptorFor(query.getBaseClass());
}
- this.m_root = createTableAlias(m_baseCld, null,"");
+ this.m_root = createTableAlias(m_baseCld, null, "");
if (m_searchCld == m_baseCld)
{
this.m_search = m_root;
}
else
{
- this.m_search = getTableAlias(m_query.getObjectProjectionAttribute(),
- false, null, null);
+ this.m_search = getTableAlias(m_query.getObjectProjectionAttribute(), false, null, null);
}
// In some cases it is necessary to split the query criteria
@@ -166,19 +174,18 @@
protected AttributeInfo getAttributeInfo(String attr, boolean useOuterJoins, String aUserAlias)
{
AttributeInfo result = new AttributeInfo();
- TableAlias tableAlias;
+ TableAlias tableAlias = null;
SqlHelper.PathInfo pathInfo = SqlHelper.splitPath(attr);
String colName = pathInfo.column;
int sp;
-
sp = colName.lastIndexOf(".");
if (sp == -1)
{
- // BRJ : ignore alias for simple attributes ??
tableAlias = getRoot();
-/*
+ // BRJ : ignore alias for simple attributes ??
+ /*
if (aUserAlias == null)
{
tableAlias = getRoot();
@@ -191,16 +198,20 @@
tableAlias = getRoot();
}
}
-*/
+ */
}
else
{
String pathName = colName.substring(0, sp);
- String[] fieldNameRef = {colName.substring(sp + 1)};
+ String[] fieldNameRef = { colName.substring(sp + 1)};
- tableAlias = getTableAlias(pathName, useOuterJoins, aUserAlias,
- fieldNameRef);
+ // check if we refer to an attribute in the parent query
+ if (pathName.equals("super") && m_parentStatement != null)
+ {
+ return m_parentStatement.getAttributeInfo(fieldNameRef[0], useOuterJoins, aUserAlias);
+ }
+ tableAlias = getTableAlias(pathName, useOuterJoins, aUserAlias, fieldNameRef);
/**
* if we have not found an alias by the pathName or
* aliasName (if given), try again because pathName
@@ -208,7 +219,7 @@
* a path, which means there may be no path separators (,)
* in the pathName.
*/
- if ((tableAlias==null) && (colName.lastIndexOf(".")==-1))
+ if ((tableAlias == null) && (colName.lastIndexOf(".") == -1))
{
/**
* pathName might be an alias, so check this first
@@ -740,10 +751,24 @@
private void appendSubQuery(Query subQuery, StringBuffer buf)
{
ClassDescriptor cld = getRoot().cld.getRepository().getDescriptorFor(subQuery.getSearchClass());
- String subSql = SqlGeneratorFactory.getInstance().createSqlGenerator(pf).getPreparedSelectStatement(subQuery, cld);
+ String sql;
+ if (subQuery instanceof QueryBySQL)
+ {
+ sql = ((QueryBySQL) subQuery).getSql();
+ }
+ else
+ {
+ String[] columns = null;
+ if (subQuery instanceof ReportQuery)
+ {
+ columns = ((ReportQuery) subQuery).getColumns();
+ }
+ sql = new SqlSelectStatement(this ,pf, cld, columns, subQuery, m_logger).getStatement();
+ }
+
buf.append(" (");
- buf.append(subSql);
+ buf.append(sql);
buf.append(") ");
}
@@ -944,6 +969,18 @@
}
+ private char getAliasChar()
+ {
+ char result = 'A';
+
+ if (m_parentStatement != null)
+ {
+ result = (char)(m_parentStatement.getAliasChar() + 1);
+ }
+
+ return result;
+ }
+
/**
* Create a TableAlias for path or userAlias
* @param aCld
@@ -982,7 +1019,8 @@
lookForExtents = true;
}
- alias = new TableAlias(cld, "A" + m_pathToAlias.size(), lookForExtents,hints);
+ String aliasName = String.valueOf(getAliasChar()) + m_pathToAlias.size();
+ alias = new TableAlias(cld, aliasName, lookForExtents,hints);
m_pathToAlias.put(path, alias);
return alias;
}
@@ -1021,7 +1059,8 @@
getLogger().warn("Creating TableAlias without table for path: " + path);
}
- alias = new TableAlias(table, "A" + m_pathToAlias.size());
+ String aliasName = String.valueOf(getAliasChar()) + m_pathToAlias.size();
+ alias = new TableAlias(table, aliasName);
m_pathToAlias.put(path, alias);
return alias;
1.15 +25 -7 db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java
Index: SqlSelectStatement.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- SqlSelectStatement.java 2 Aug 2003 09:24:00 -0000 1.14
+++ SqlSelectStatement.java 15 Aug 2003 14:13:07 -0000 1.15
@@ -75,16 +75,34 @@
public class SqlSelectStatement extends SqlQueryStatement
{
- /**
- * Constructor for SqlSelectStatement.
- * @param cld
- * @param columns
- * @param query
- */
+ /**
+ * Constructor for SqlSelectStatement.
+ *
+ * @param pf
+ * @param cld
+ * @param columns
+ * @param query
+ * @param logger
+ */
public SqlSelectStatement(Platform pf, ClassDescriptor cld, String[] columns, Query query, Logger logger)
{
super(pf, cld, columns, query, logger);
}
+
+ /**
+ * Constructor for SqlSelectStatement.
+ *
+ * @param parent
+ * @param pf
+ * @param cld
+ * @param columns
+ * @param query
+ * @param logger
+ */
+ public SqlSelectStatement(SqlQueryStatement parent, Platform pf, ClassDescriptor cld, String[] columns, Query query, Logger logger)
+ {
+ super(parent, pf, cld, columns, query, logger);
+ }
/**
* Appends to the statement a comma separated list of column names.
1.34 +25 -0 db-ojb/src/test/org/apache/ojb/broker/QueryTest.java
Index: QueryTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/QueryTest.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- QueryTest.java 23 May 2003 16:45:40 -0000 1.33
+++ QueryTest.java 15 Aug 2003 14:13:07 -0000 1.34
@@ -146,6 +146,31 @@
}
+ /**
+ * test Subquery
+ * get all product groups with more than 10 articles
+ *
+ * test may fail if db does not support sub queries
+ */
+ public void testSubQuery3()
+ {
+
+ ReportQueryByCriteria subQuery;
+ Criteria subCrit = new Criteria();
+ Criteria crit = new Criteria();
+
+ subCrit.addEqualToField("productGroupId","super.groupId");
+ subQuery = QueryFactory.newReportQuery(Article.class, subCrit);
+ subQuery.setColumns(new String[]{"count(productGroupId)"});
+
+ crit.addLessThan("10", subQuery); // MORE than 10 articles
+ Query q = QueryFactory.newQuery(ProductGroup.class, crit);
+
+ Collection results = broker.getCollectionByQuery(q);
+ assertNotNull(results);
+ assertTrue(results.size() == 4);
+
+ }
/**
* test Like Criteria
*/
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org