You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2008/12/08 18:00:36 UTC

svn commit: r724402 - in /openjpa/trunk: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/...

Author: ppoddar
Date: Mon Dec  8 09:00:34 2008
New Revision: 724402

URL: http://svn.apache.org/viewvc?rev=724402&view=rev
Log:
OPENJPA-806: Interface changes (merge Selectable to Visitable) + String Functions (Concat etc) + Detect recursion

Added:
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractVisitable.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ArrayExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConcatExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UpperExpression.java
      - copied, changed from r723553, openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ToUpperExpression.java
Removed:
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/Selectable.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ToUpperExpression.java
Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractDomainObject.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractPath.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AliasContext.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryExpressionPredicate.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryFunctionalOperator.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryOperatorExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConstantExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ElseExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExistsExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExpressionImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/FetchPath.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/InExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JPQLHelper.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JoinPath.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LikeExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LocateExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LogicalPredicate.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/NewInstance.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OperatorPath.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OrderableItem.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ParameterExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryBuilderImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryDefinitionImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/RootPath.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/SubStringExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/TrimExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryExpressionPredicate.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryFunctionalOperator.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryOperatorExpression.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/Visitable.java

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java Mon Dec  8 09:00:34 2008
@@ -19,12 +19,15 @@
 
 package org.apache.openjpa.persistence.criteria;
 
+import javax.persistence.CaseExpression;
 import javax.persistence.DomainObject;
+import javax.persistence.Expression;
 import javax.persistence.QueryBuilder;
 import javax.persistence.QueryDefinition;
 import javax.persistence.SelectItem;
 
 import org.apache.openjpa.persistence.query.AbstractDomainObject;
+import org.apache.openjpa.persistence.query.QueryBuilderImpl;
 import org.apache.openjpa.persistence.query.QueryDefinitionImpl;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
 
@@ -45,7 +48,7 @@
  *
  */
 public class TestCriteria extends SingleEMFTestCase {
-	protected QueryBuilder qb; 
+	protected QueryBuilderImpl qb; 
 	protected StringComparison comparator = new StringComparison();
 	
 	public void setUp() {
@@ -53,7 +56,7 @@
 			Department.class, Employee.class, Exempt.class, Item.class,
 			Manager.class, Person.class, VideoStore.class, Order.class, 
 			Customer.class);
-		qb = emf.getQueryBuilder();
+		qb = (QueryBuilderImpl)emf.getQueryBuilder();
 	}
 	
 	public void tearDown() {
@@ -61,19 +64,12 @@
 	}
 	
 	void compare(String s, QueryDefinition q) {
-		String actual = ((QueryDefinitionImpl)q).toJPQL();
+		String actual = qb.toJPQL(q);
 		if (!comparator.compare(s,actual)) {
 			fail("\r\nExpected: [" + s + "]\r\nActual  : [" + actual + "]");
 		}
 	}
 	
-	void compare(String s, DomainObject q) {
-		String actual = ((AbstractDomainObject)q).getOwner().toJPQL();
-		if (!comparator.compare(s,actual)) {
-			fail("\r\nExpected: [" + s + "]\r\nActual  : [" + actual + "]");
-		}
-	}
-
 	public void testMultipleDomainOfSameClass() {
 		DomainObject o1 = qb.createQueryDefinition(Order.class);
 		DomainObject o2 = o1.addRoot(Order.class);
@@ -353,11 +349,11 @@
 	DomainObject address = customer.join("address");
 	q.where(address.get("state").equal("CA"))
 	.select(order.get("quantity"), address.get("zipcode"))
-	.orderBy(order.get("quantity"), address.get("zipcode"));
+	.orderBy(order.get("quantity").desc(), address.get("zipcode"));
 	String jpql = "SELECT o.quantity, a.zipcode"
 				+ " FROM Customer c JOIN c.orders o JOIN c.address a"
 				+ " WHERE a.state = 'CA'"
-				+ " ORDER BY o.quantity, a.zipcode";
+				+ " ORDER BY o.quantity DESC, a.zipcode";
 	compare(jpql, q);
 	}
 	
@@ -370,10 +366,10 @@
 	.and(a.get("county").equal("Santa Clara")))
 	.orderBy(o.get("quantity"), taxedCost, a.get("zipcode"));
 	
-	String jpql = "SELECT o.quantity, o.cost*1.08, a.zipcode" 
+	String jpql = "SELECT o.quantity, o.cost*1.08 as o2, a.zipcode" 
 				+ " FROM Order o JOIN o.customer c JOIN c.address a"
 				+ " WHERE a.state = 'CA' AND a.county = 'Santa Clara'"
-				+ " ORDER BY o.quantity, o.cost*1.08, a.zipcode";
+				+ " ORDER BY o.quantity, o2, a.zipcode";
 	
 	compare(jpql, o);
 	}
@@ -410,4 +406,54 @@
 		compare(jpql, customer);
 	}
 	
+	public void testTypeList() {
+		DomainObject q = qb.createQueryDefinition(Employee.class);
+		q.where(q.type().in(Exempt.class, Contractor.class));
+		
+		String jpql = "SELECT e "
+			+ " FROM Employee e"
+			+ " WHERE TYPE(e) IN (Exempt, Contractor)";
+		compare(jpql, q);
+	}
+	
+	public void testStringList() {
+		DomainObject q = qb.createQueryDefinition(Employee.class);
+		q.where(q.get("country").in("USA", "UK", "France"));
+		
+		String jpql = "SELECT e "
+			+ " FROM Employee e"
+			+ " WHERE e.country IN ('USA', 'UK', 'France')";
+		compare(jpql, q);
+	}
+	
+	public void testConcat() {
+		DomainObject e = qb.createQueryDefinition(Employee.class);
+		DomainObject f = e.join("frequentFlierPlan");
+		Expression c = 
+		e.generalCase().when(f.get("annualMiles").greaterThan(50000)).then("Platinum")
+		               .when(f.get("annualMiles").greaterThan(25000)).then("Gold")
+		               .elseCase("");
+		e.select(e.get("name"), f.get("name"), e.concat(c,e.literal("Frequent Flyer")));
+		
+		String jpql = "SELECT e.name, f.name, CONCAT(" 
+			+ " CASE WHEN f.annualMiles > 50000 THEN 'Platinum'" 
+			+ "      WHEN f.annualMiles > 25000 THEN 'Gold'" 
+			+ " ELSE '' END, 'Frequent Flyer')" 
+			+ "FROM Employee e JOIN e.frequentFlierPlan f";
+			
+		compare(jpql, e);
+	}
+	
+	public void testRecursiveDefinitionIsNotAllowed() {
+		DomainObject q = qb.createQueryDefinition(Customer.class);
+		q.where(q.exists().and(q.get("name").equal("wrong")));
+		
+		try {
+			compare("?", q);
+			fail();
+		} catch (RuntimeException e) {
+			// good
+		}
+	}
+	
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java Mon Dec  8 09:00:34 2008
@@ -343,7 +343,7 @@
     }
 
     public QueryBuilder getQueryBuilder() {
-    	return new QueryBuilderImpl();
+    	return new QueryBuilderImpl(this);
     }
 
     public Set<String> getSupportedProperties() {

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java Mon Dec  8 09:00:34 2008
@@ -66,6 +66,7 @@
 import org.apache.openjpa.meta.FieldMetaData;
 import org.apache.openjpa.meta.QueryMetaData;
 import org.apache.openjpa.meta.SequenceMetaData;
+import org.apache.openjpa.persistence.query.QueryBuilderImpl;
 import org.apache.openjpa.util.Exceptions;
 import org.apache.openjpa.util.ImplHelper;
 import org.apache.openjpa.util.RuntimeExceptionTranslator;
@@ -1395,12 +1396,14 @@
             "JPA 2.0 - Method not yet implemented");
     }
 
-    public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode) {
+    public <T> T find(Class<T> entityClass, Object primaryKey, 
+    	LockModeType lockMode) {
         throw new UnsupportedOperationException(
             "JPA 2.0 - Method not yet implemented");
     }
 
-    public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode, Map<String, Object> properties) {
+    public <T> T find(Class<T> entityClass, Object primaryKey, 
+    	LockModeType lockMode, Map<String, Object> properties) {
         throw new UnsupportedOperationException(
             "JPA 2.0 - Method not yet implemented");
     }
@@ -1411,8 +1414,7 @@
     }
 
     public QueryBuilder getQueryBuilder() {
-        throw new UnsupportedOperationException(
-            "JPA 2.0 - Method not yet implemented");
+        return new QueryBuilderImpl(_emf);
     }
 
     public Set<String> getSupportedProperties() {
@@ -1420,7 +1422,8 @@
             "JPA 2.0 - Method not yet implemented");
     }
 
-    public void lock(Object entity, LockModeType lockMode, Map<String, Object> properties) {
+    public void lock(Object entity, LockModeType lockMode, Map<String, 
+    	Object> properties) {
         throw new UnsupportedOperationException(
             "JPA 2.0 - Method not yet implemented");
     }
@@ -1430,7 +1433,8 @@
             "JPA 2.0 - Method not yet implemented");
     }
 
-    public void refresh(Object entity, LockModeType lockMode, Map<String, Object> properties) {
+    public void refresh(Object entity, LockModeType lockMode, Map<String, 
+    	Object> properties) {
         throw new UnsupportedOperationException(
             "JPA 2.0 - Method not yet implemented");
     }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractDomainObject.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractDomainObject.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractDomainObject.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractDomainObject.java Mon Dec  8 09:00:34 2008
@@ -390,6 +390,5 @@
 				join.setAlias(ctx);
 	}
 	
-	abstract public String asJoinable(AliasContext ctx);
 
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractPath.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractPath.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractPath.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractPath.java Mon Dec  8 09:00:34 2008
@@ -20,7 +20,6 @@
 
 import javax.persistence.Aggregate;
 import javax.persistence.Expression;
-import javax.persistence.OrderByItem;
 import javax.persistence.PathExpression;
 import javax.persistence.Predicate;
 
@@ -113,12 +112,4 @@
 	public Expression type() {
 		return new TypeExpression(this);
 	}
-	
-	public OrderByItem asc() {
-		return new OrderableItem(this, Boolean.TRUE);
-	}
-
-	public OrderByItem desc() {
-		return new OrderableItem(this, Boolean.FALSE);
-	}
 }

Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractVisitable.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractVisitable.java?rev=724402&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractVisitable.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AbstractVisitable.java Mon Dec  8 09:00:34 2008
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.query;
+
+/**
+ * An abstract implementation that throws UnsupportedOperationException on
+ * every method.
+ * 
+ * @author Pinaki Poddar
+ *
+ */
+abstract class AbstractVisitable implements Visitable {
+
+	public String asExpression(AliasContext ctx) {
+		throw new UnsupportedOperationException(this.getClass().getName());
+	}
+
+	public String asProjection(AliasContext ctx) {
+		throw new UnsupportedOperationException(this.getClass().getName());
+	}
+
+	public String getAliasHint(AliasContext ctx) {
+		throw new UnsupportedOperationException(this.getClass().getName());
+	}
+
+	public void setAlias(AliasContext ctx) {
+		throw new UnsupportedOperationException(this.getClass().getName());
+	}
+	
+	public String asJoinable(AliasContext ctx) {
+		throw new UnsupportedOperationException(this.getClass().getName());
+	}
+
+}

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AliasContext.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AliasContext.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AliasContext.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/AliasContext.java Mon Dec  8 09:00:34 2008
@@ -20,12 +20,21 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Stack;
 
 import javax.persistence.Expression;
 
+import org.apache.openjpa.meta.MetaDataRepository;
+
 class AliasContext {
+	private Stack<Object> _operating = new Stack<Object>();
 	private Map<ExpressionImpl, String> _aliases = 
 		new HashMap<ExpressionImpl, String>();
+	private final MetaDataRepository _repos;
+	
+	public AliasContext(MetaDataRepository repos) {
+		_repos = repos;
+	}
 	
 	/**
 	 * Sets alias for the given Expression or gets the alias if the given
@@ -40,10 +49,10 @@
 		String alias = _aliases.get(path);
 		if (alias != null)
 			return alias;
-		alias = path.getAliasHint().substring(0,1).toLowerCase();
+		alias = path.getAliasHint(this).substring(0,1).toLowerCase();
 		int i = 2;
 		while (_aliases.containsValue(alias)) {
-			alias = alias + i;
+			alias = alias.substring(0,1) + i;
 			i++;
 		}
 		_aliases.put(path, alias);
@@ -57,4 +66,16 @@
 	public boolean hasAlias(Expression path) {
 		return _aliases.containsKey(path);
 	}
+	
+	public AliasContext push(Object e) {
+		if (_operating.contains(e))
+			throw new RuntimeException(e + " is already in this ctx");
+		_operating.add(e);
+		return this;
+	}
+	
+	public String getEntityName(Class cls) {
+		return cls.getSimpleName();
+//		return _repos.getMetaData(cls, null, true).getTypeAlias();
+	}
 }

Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ArrayExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ArrayExpression.java?rev=724402&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ArrayExpression.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ArrayExpression.java Mon Dec  8 09:00:34 2008
@@ -0,0 +1,28 @@
+package org.apache.openjpa.persistence.query;
+
+import java.util.Arrays;
+
+public class ArrayExpression extends ExpressionImpl {
+	private final Object[] _values;
+	
+	public ArrayExpression(Object[] values) {
+		_values = values;
+	}
+
+	@Override
+	public String asExpression(AliasContext ctx) {
+		StringBuffer tmp = new StringBuffer("(");
+		for (int i = 0; i < _values.length; i++) {
+			tmp.append(JPQLHelper.toJPQL(ctx, _values[i]))
+			   .append(i == _values.length-1 ? "" : ", ");
+		}
+		tmp.append(")");
+		return tmp.toString();
+	}
+
+	@Override
+	public String asProjection(AliasContext ctx) {
+		return asExpression(ctx);
+	}
+
+}

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryExpressionPredicate.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryExpressionPredicate.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryExpressionPredicate.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryExpressionPredicate.java Mon Dec  8 09:00:34 2008
@@ -27,7 +27,8 @@
  * @author Pinaki Poddar
  *
  */
-class BinaryExpressionPredicate implements Predicate, Visitable {
+class BinaryExpressionPredicate extends AbstractVisitable 
+    implements Predicate, Visitable {
 	protected final Expression _e1;
 	protected final Expression _e2;
 	protected final BinaryConditionalOperator   _op;

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryFunctionalOperator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryFunctionalOperator.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryFunctionalOperator.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryFunctionalOperator.java Mon Dec  8 09:00:34 2008
@@ -34,9 +34,7 @@
 	MOD("MOD"),
 	PLUS("+"),
 	RANGE(","),
-	SUBSTR("SUBSTR"),
-	TIMES("*"),
-	TRIM("TRIM");
+	TIMES("*");
 	
 	private final String _symbol;
 	

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryOperatorExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryOperatorExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryOperatorExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/BinaryOperatorExpression.java Mon Dec  8 09:00:34 2008
@@ -56,7 +56,9 @@
 	}
 	
 	public String asProjection(AliasContext ctx) {
-		return ((Selectable)_e1).asProjection(ctx) + _op 
-		     + ((Selectable)_e2).asProjection(ctx);
+		return ((Visitable)_e1).asProjection(ctx) + _op 
+		     + ((Visitable)_e2).asProjection(ctx) 
+		     + (ctx.hasAlias(this) ? " as " + ctx.getAlias(this) : "");
+
 	}
 }

Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConcatExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConcatExpression.java?rev=724402&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConcatExpression.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConcatExpression.java Mon Dec  8 09:00:34 2008
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.query;
+
+
+/**
+ * Denotes CONCAT(e1,e2,..) Expression.
+ * 
+ * @author Pinaki Poddar
+ *
+ */
+public class ConcatExpression extends UnaryOperatorExpression {
+	public ConcatExpression(ArrayExpression op) {
+		super(op, UnaryFunctionalOperator.CONCAT);
+	}
+}

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConstantExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConstantExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConstantExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ConstantExpression.java Mon Dec  8 09:00:34 2008
@@ -33,28 +33,13 @@
 		_value = value;
 	}
 	
-	public Object getValue() {
-		return _value;
-	}
-	
 	@Override
 	public String asExpression(AliasContext ctx) {
-		if (_value.getClass().isArray()) {
-			return Arrays.asList((Object[])_value).toString();
-		}
-		return quoted(_value);
+		return JPQLHelper.toJPQL(ctx, _value);
 	}
 	
 	@Override
 	public String asProjection(AliasContext ctx) {
 		return asExpression(ctx);
 	}
-	
-	String quoted(Object o) {
-		if (o instanceof String)
-			return "'" + o + "'";
-		if (o instanceof Class)
-			return ((Class)o).getSimpleName();
-		return o.toString();
-	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ElseExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ElseExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ElseExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ElseExpression.java Mon Dec  8 09:00:34 2008
@@ -36,28 +36,14 @@
 	@Override
 	public String asExpression(AliasContext ctx) {
 		return _caseClause.toJPQL(ctx) 
-		    + " ELSE " + toJPQL(ctx, _elseClause) 
+		    + " ELSE " + JPQLHelper.toJPQL(ctx, _elseClause) 
 		    + " END ";
 	}
 	
 	@Override
 	public String asProjection(AliasContext ctx) {
 		return _caseClause.toJPQL(ctx) 
-		     + " ELSE " + toJPQL(ctx, _elseClause) 
+		     + " ELSE " + JPQLHelper.toJPQL(ctx, _elseClause) 
 		     + " END ";
 	}
-		
-	String toJPQL(AliasContext ctx, Object o) {
-		if (o instanceof Visitable) {
-			return ((Visitable)o).asExpression(ctx);
-		}
-		return o.toString();
-	}
-	
-	String asProjection(AliasContext ctx, Object o) {
-		if (o instanceof Selectable) {
-			return ((Selectable)o).asProjection(ctx);
-		}
-		return o.toString();
-	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExistsExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExistsExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExistsExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExistsExpression.java Mon Dec  8 09:00:34 2008
@@ -26,7 +26,8 @@
  */
 public class ExistsExpression extends UnaryExpressionPredicate {
 	public ExistsExpression(QueryDefinitionImpl op) {
-		super(op, UnaryConditionalOperator.EXISTS, UnaryConditionalOperator.EXISTS_NOT);
+		super(op, UnaryConditionalOperator.EXISTS, 
+			UnaryConditionalOperator.EXISTS_NOT);
 	}
 
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExpressionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExpressionImpl.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExpressionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ExpressionImpl.java Mon Dec  8 09:00:34 2008
@@ -18,6 +18,7 @@
  */
 package org.apache.openjpa.persistence.query;
 
+import java.io.Serializable;
 import java.util.Calendar;
 import java.util.Date;
 
@@ -36,18 +37,19 @@
  * @author Pinaki Poddar
  *
  */
-abstract class ExpressionImpl implements Expression, Selectable, Visitable {
+abstract class ExpressionImpl extends AbstractVisitable 
+   implements Expression, Visitable {
 	
 	public Expression abs() {
 		return new AbsExpression(this);
 	}
 
 	public Expression concat(String... str) {
-		throw new UnsupportedOperationException();
+		return new ConcatExpression(new ArrayExpression(str));
 	}
 
 	public Expression concat(Expression... str) {
-		throw new UnsupportedOperationException();
+		return new ConcatExpression(new ArrayExpression(str));
 	}
 
 	public Expression dividedBy(Number num) {
@@ -59,27 +61,23 @@
 	}
 
 	public Predicate in(String... strings) {
-		return new InExpression(this, new ConstantExpression(strings));
+		return new InExpression(this, new ArrayExpression(strings));
 	}
 
 	public Predicate in(Number... nums) {
-		return new InExpression(this, 
-				new ConstantExpression(nums));
+		return new InExpression(this, new ArrayExpression(nums));
 	}
 
 	public Predicate in(Enum<?>... enums) {
-		return new InExpression(this, 
-				new ConstantExpression(enums));
+		return new InExpression(this, new ArrayExpression(enums));
 	}
 
 	public Predicate in(Class... classes) {
-		return new InExpression(this, 
-				new ConstantExpression(classes));
+		return new InExpression(this, new ArrayExpression(classes));
 	}
 
 	public Predicate in(Expression... params) {
-		return new InExpression(this, 
-				new ConstantExpression(params));
+		return new InExpression(this, new ArrayExpression(params));
 	}
 
 	public Predicate in(Subquery subquery) {
@@ -95,7 +93,7 @@
 	}
 
 	public Expression locate(String str) {
-		return locate(str, 0);
+		return new LocateExpression(this, str, 0);
 	}
 
 	public Expression locate(Expression expr) {
@@ -103,11 +101,11 @@
 	}
 
 	public Expression locate(String str, int position) {
-		return new LocateExpression(this, new ConstantExpression(str), position);
+		return new LocateExpression(this, str, position);
 	}
 
 	public Expression locate(String str, Expression position) {
-		return new LocateExpression(this, new ConstantExpression(str), position);
+		return new LocateExpression(this, str, position);
 	}
 
 	public Expression locate(Expression str, int position) {
@@ -215,15 +213,15 @@
 	}
 
 	public Expression upper() {
-		return new ToUpperExpression(this);
+		return new UpperExpression(this);
 	}
 
 	public OrderByItem asc() {
-		throw new UnsupportedOperationException(this.toString());
+		return new OrderableItem(this, true);
 	}
 
 	public OrderByItem desc() {
-		throw new UnsupportedOperationException(this.toString());
+		return new OrderableItem(this, false);
 	}
 
 	public Predicate between(PredicateOperand arg1, PredicateOperand arg2) {
@@ -404,7 +402,7 @@
 	}
 
 	public Predicate like(PredicateOperand pattern) {
-		return new LikeExpression(this, (Expression)pattern, null);
+		return new LikeExpression(this, (Expression)pattern);
 	}
 
 	public Predicate like(PredicateOperand pattern, PredicateOperand escChar) {
@@ -416,7 +414,7 @@
 	}
 
 	public Predicate like(String pattern) {
-		return new LikeExpression(this, new ConstantExpression(pattern), null);
+		return new LikeExpression(this, new ConstantExpression(pattern));
 	}
 
 	public Predicate like(String pattern, PredicateOperand escapeChar) {
@@ -468,7 +466,7 @@
 		ctx.getAlias(this);
 	}
 	
-	public String getAliasHint() {
+	public String getAliasHint(AliasContext ctx) {
 		return "o";
 	}
 	

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/FetchPath.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/FetchPath.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/FetchPath.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/FetchPath.java Mon Dec  8 09:00:34 2008
@@ -26,7 +26,8 @@
  * @author Pinaki Poddar
  *
  */
-public class FetchPath implements FetchJoinObject, Visitable {
+public class FetchPath extends AbstractVisitable 
+    implements FetchJoinObject, Visitable {
 	private NavigationPath _path;
 	private PathOperator _joinType;
 	

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/InExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/InExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/InExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/InExpression.java Mon Dec  8 09:00:34 2008
@@ -1,6 +1,7 @@
 package org.apache.openjpa.persistence.query;
 
 import javax.persistence.Expression;
+import javax.persistence.Subquery;
 
 /**
  * Denotes e1 IN (e2) Expression.
@@ -9,7 +10,13 @@
  *
  */
 public class InExpression extends BinaryExpressionPredicate  {
-	public InExpression(Expression op, Expression op2) {
-		super(op, BinaryConditionalOperator.IN, BinaryConditionalOperator.IN_NOT, op2);
+	public InExpression(Expression op, ArrayExpression op2) {
+		super(op, BinaryConditionalOperator.IN, 
+			BinaryConditionalOperator.IN_NOT, op2);
+	}
+	
+	public InExpression(Expression op, Expression subquery) {
+		super(op, BinaryConditionalOperator.IN, 
+			BinaryConditionalOperator.IN_NOT, subquery);
 	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JPQLHelper.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JPQLHelper.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JPQLHelper.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JPQLHelper.java Mon Dec  8 09:00:34 2008
@@ -25,9 +25,17 @@
  *
  */
 public class JPQLHelper {
+	private static final String SINGLE_QUOTE = "'";
+	
 	static String toJPQL(AliasContext ctx, Object o) {
+		if (o == null)
+			return "NULL";
 		if (o instanceof Visitable)
 			return ((Visitable)o).asExpression(ctx);
+		if (o instanceof Class)
+			return ctx.getEntityName((Class)o);
+		if (o instanceof String)
+			return SINGLE_QUOTE + (String)o + SINGLE_QUOTE;
 		return o.toString();
 	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JoinPath.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JoinPath.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JoinPath.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/JoinPath.java Mon Dec  8 09:00:34 2008
@@ -33,7 +33,7 @@
 	}
 	
 	@Override
-	public String getAliasHint() {
+	public String getAliasHint(AliasContext ctx) {
 		return getLastSegment();
 	}
 	
@@ -47,7 +47,7 @@
 		return (AbstractDomainObject)super.getParent();
 	}
 		
-//	@Override
+	@Override
 	public String asJoinable(AliasContext ctx) {
 		StringBuffer tmp = new StringBuffer(getOperator().toString());
 		tmp.append(getParent().asProjection(ctx))

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LikeExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LikeExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LikeExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LikeExpression.java Mon Dec  8 09:00:34 2008
@@ -27,18 +27,28 @@
  *
  */
 public class LikeExpression extends BinaryExpressionPredicate {
-	public LikeExpression(Expression op1, Expression op2, Object echar) {
-		super(escape(op1, echar), BinaryConditionalOperator.LIKE, 
-			BinaryConditionalOperator.LIKE_NOT, escape(op2, echar));
+	private final Object  _echar;
+	private final boolean _escaped;
+	
+	public LikeExpression(Expression e, Expression pattern, Object echar) {
+		super(e, BinaryConditionalOperator.LIKE, 
+			BinaryConditionalOperator.LIKE_NOT, pattern);
+		_echar = echar;
+		_escaped = true;
+	}
+	
+	public LikeExpression(Expression e, Expression pattern) {
+		super(e, BinaryConditionalOperator.LIKE, 
+			BinaryConditionalOperator.LIKE_NOT, pattern);
+		
+		_echar = null;
+		_escaped = false;
 	}
 	
-	static Expression escape(Expression o, Object echar) {
-		if (echar != null && o instanceof ConstantExpression 
-				&& ((ConstantExpression)o).getValue() instanceof String) {
-			String escapeChar = echar.toString();
-			return new ConstantExpression(escapeChar + o.toString() + escapeChar);
-		}
-		return o;
+	@Override
+	public String asExpression(AliasContext ctx) {
+		return super.asExpression(ctx) 
+		    + (_escaped ? "ESCAPE " + JPQLHelper.toJPQL(ctx, _echar) : "");
 	}
 
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LocateExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LocateExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LocateExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LocateExpression.java Mon Dec  8 09:00:34 2008
@@ -21,13 +21,42 @@
 import javax.persistence.Expression;
 
 /**
- * Denotes LOCATE(e)
+ * Denotes LOCATE(e1, e2, n) Expression.
+ * e1 : string to be located
+ * e2 : string to be searched
+ * n  : starting poistion in e2, default is 1
  * 
  * @author Pinaki Poddar
  *
  */
 public class LocateExpression extends BinaryOperatorExpression  {
-	public LocateExpression(Expression op, Expression op2, Object pos) {
-		super(op, BinaryFunctionalOperator.LOCATE, op2);
+	private final Expression _start;
+
+	public LocateExpression(Expression key, String str, int start) {
+		super(key, BinaryFunctionalOperator.LOCATE, new ConstantExpression(str));
+		_start = new ConstantExpression(start);
+	}
+	
+	public LocateExpression(Expression key, Expression str, int start) {
+		super(key, BinaryFunctionalOperator.LOCATE, str);
+		_start = new ConstantExpression(start);
+	}
+	
+	public LocateExpression(Expression key, String str, Expression start) {
+		super(key, BinaryFunctionalOperator.LOCATE, new ConstantExpression(str));
+		_start = start;
 	}
+	
+	public LocateExpression(Expression key, Expression str, Expression start) {
+		super(key, BinaryFunctionalOperator.LOCATE, str);
+		_start = start;
+	}
+	
+	public String asExpression(AliasContext ctx) {
+		return _op + "(" + ((Visitable)_e1).asExpression(ctx) + "," 
+		    + ((Visitable)_e2).asExpression(ctx) 
+		    + (_start == null ? "" : "," + ((Visitable)_start).asExpression(ctx))
+		    + ")";
+	}
+
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LogicalPredicate.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LogicalPredicate.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LogicalPredicate.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/LogicalPredicate.java Mon Dec  8 09:00:34 2008
@@ -26,7 +26,8 @@
  * @author Pinaki Poddar
  *
  */
-public class LogicalPredicate implements Predicate, Visitable {
+public class LogicalPredicate extends AbstractVisitable 
+    implements Predicate, Visitable {
 	private final Predicate _p1;
 	private final Predicate _p2;
 	private final ConditionalOperator _op;

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/NewInstance.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/NewInstance.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/NewInstance.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/NewInstance.java Mon Dec  8 09:00:34 2008
@@ -18,7 +18,6 @@
  */
 package org.apache.openjpa.persistence.query;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -31,7 +30,8 @@
  * @author Pinaki Poddar
  *
  */
-public class NewInstance implements Selectable {
+public class NewInstance extends AbstractVisitable 
+	implements SelectItem, Visitable {
 	private final Class _cls;
 	private List<SelectItem> _args;
 	NewInstance(Class cls, SelectItem...args) {
@@ -59,12 +59,9 @@
 		int N = _args.size();
 		for (SelectItem arg : _args) {
 			i++;
-			tmp.append(((Selectable)arg).asProjection(ctx))
+			tmp.append(((Visitable)arg).asProjection(ctx))
 			   .append(i == N ? ")" : ",");
 		}
 		return tmp.toString();
 	}
-	
-	public void setAlias(AliasContext ctx) {
-	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OperatorPath.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OperatorPath.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OperatorPath.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OperatorPath.java Mon Dec  8 09:00:34 2008
@@ -37,8 +37,8 @@
 	}
 
 	@Override
-	public String getAliasHint() {
-		return getParent().getAliasHint();
+	public String getAliasHint(AliasContext ctx) {
+		return getParent().getAliasHint(ctx);
 	}
 	
 	@Override

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OrderableItem.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OrderableItem.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OrderableItem.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/OrderableItem.java Mon Dec  8 09:00:34 2008
@@ -26,22 +26,27 @@
  * @author Pinaki Poddar
  *
  */
-public class OrderableItem implements OrderByItem {
+public class OrderableItem extends AbstractVisitable 
+    implements OrderByItem, Visitable {
 	private final Boolean _asc;
-	private final ExpressionImpl path;
+	private final ExpressionImpl _e;
 	
 	OrderableItem(ExpressionImpl path) {
 		this(path, null);
 	}
 	
+	public ExpressionImpl getExpression() {
+		return _e;
+	}
+	
 	OrderableItem(ExpressionImpl path, Boolean asc) {
 		super();
 		this._asc = asc;
-		this.path = path;
+		this._e = path;
 	}
 	
-	public String toJPQL(AliasContext ctx) {
-		return path.asExpression(ctx) + " " 
-		    + (_asc == null ? "" : (_asc ? " ASC " : "DESC"));
+	public String asExpression(AliasContext ctx) {
+		return (ctx.hasAlias(_e) ? ctx.getAlias(_e) : _e.asExpression(ctx)) 
+		    + (_asc == null ? "" : (_asc ? " ASC " : " DESC"));
 	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ParameterExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ParameterExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ParameterExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ParameterExpression.java Mon Dec  8 09:00:34 2008
@@ -24,13 +24,19 @@
  * @author Pinaki Poddar
  *
  */
-public class ParameterExpression extends ConstantExpression {
+public class ParameterExpression extends ExpressionImpl {
+	private final String _name;
 	public ParameterExpression(String name) {
-		super(name);
+		_name = ":" + name;
 	}
 	
 	@Override
 	public String asExpression(AliasContext ctx) {
-		return ":" + getValue();
+		return _name;
+	}
+	
+	@Override
+	public String asProjection(AliasContext ctx) {
+		return _name;
 	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryBuilderImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryBuilderImpl.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryBuilderImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryBuilderImpl.java Mon Dec  8 09:00:34 2008
@@ -18,11 +18,19 @@
  */
 package org.apache.openjpa.persistence.query;
 
+import java.io.Serializable;
+
 import javax.persistence.DomainObject;
 import javax.persistence.PathExpression;
 import javax.persistence.QueryBuilder;
 import javax.persistence.QueryDefinition;
 
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.meta.MetaDataRepository;
+import org.apache.openjpa.persistence.EntityManagerFactoryImpl;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
+
 /**
  * The factory for QueryDefinition.
  * 
@@ -31,25 +39,39 @@
  *
  */
 public class QueryBuilderImpl implements QueryBuilder {
+	private final OpenJPAEntityManagerFactorySPI _emf;
+	
+	public QueryBuilderImpl(OpenJPAEntityManagerFactorySPI emf) {
+		_emf = emf;
+	}
+	
 	/**
-	 * Creates a QueryDefinition without a domain root.
+	 * Creates a QueryDefinition without a domain.
 	 */
 	public QueryDefinition createQueryDefinition() {
 		return new QueryDefinitionImpl(this);
 	}
 
 	/**
-	 * Creates a QueryDefinition with given class as domain root.
+	 * Creates a QueryDefinition with given class as domain.
 	 */
 	public DomainObject createQueryDefinition(Class root) {
 		return new QueryDefinitionImpl(this).addRoot(root);
 	}
 
 	/**
-	 * Creates a QueryDefinition that can be used as a subquery to some
-	 * other query.
+	 * Creates a QueryDefinition that can be used a correlated subquery 
+	 * with the given path as domain.
 	 */
 	public DomainObject createSubqueryDefinition(PathExpression path) {
 		return new QueryDefinitionImpl(this).addSubqueryRoot(path);
 	}
+	
+	public String toJPQL(QueryDefinition query) {
+		MetaDataRepository repos = null;//_emf.getConfiguration().getMetaDataRepositoryInstance()
+		AliasContext ctx = new AliasContext(repos);
+		if (query instanceof AbstractDomainObject)
+			return ((AbstractDomainObject)query).getOwner().asExpression(ctx);
+		return ((QueryDefinitionImpl)query).asExpression(ctx);
+	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryDefinitionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryDefinitionImpl.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryDefinitionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/QueryDefinitionImpl.java Mon Dec  8 09:00:34 2008
@@ -49,16 +49,21 @@
 	private final QueryBuilderImpl _builder;
 	private List<AbstractDomainObject> _domains;
 	private List<PathExpression> _groupBys;
-	private List<Subquery> _subqueries;
 	private List<OrderableItem> _orderBys;
-	private List<Selectable>  _projections;
+	private List<SelectItem>  _projections;
 	private boolean  _distinct;
 	private Predicate _where;
 	private Predicate _having;
 	
+	private static enum Visit {PROJECTION, EXPRESSION, JOINABLE};
+	
 	protected static Localizer _loc = 
 		Localizer.forPackage(QueryDefinitionImpl.class);
 	
+	/**
+	 * 
+	 * @param builder
+	 */
 	protected QueryDefinitionImpl(QueryBuilderImpl builder) {
 		_builder = builder;
 	}
@@ -73,14 +78,9 @@
 	}
 	
 	public DomainObject addSubqueryRoot(PathExpression path) {
-		if (_domains != null && _domains.contains(path))
-			throw new IllegalArgumentException(_loc.get("query-subroot-clash", 
-					path).toString());
 		AbstractPath impl = (AbstractPath)path;
-		if (_subqueries == null) 
-			_subqueries = new ArrayList<Subquery>();
-		AbstractDomainObject newRoot = new NavigationPath(this, impl.getParent(), 
-				impl.getLastSegment().toString());
+		AbstractDomainObject newRoot = new NavigationPath(this,  
+				impl.getParent(), impl.getLastSegment().toString());
 		addDomain(newRoot);
 		return newRoot;
 	}
@@ -229,11 +229,13 @@
 	public QueryDefinition orderBy(OrderByItem... orderByItems) {
 		if (_orderBys == null)
 			_orderBys = new ArrayList<OrderableItem>();
+		else
+			_orderBys.clear();
 		for (OrderByItem i : orderByItems) {
 			if (i instanceof OrderableItem)
 				_orderBys.add((OrderableItem)i);
 			else
-				_orderBys.add(new OrderableItem((ExpressionImpl)i, null));
+				_orderBys.add(new OrderableItem((ExpressionImpl)i));
 		}
 		return this;
 	}
@@ -241,6 +243,8 @@
 	public QueryDefinition orderBy(List<OrderByItem> orderByItemList) {
 		if (_orderBys == null)
 			_orderBys = new ArrayList<OrderableItem>();
+		else
+			_orderBys.clear();
 		for (OrderByItem i : orderByItemList) {
 			if (i instanceof OrderableItem)
 				_orderBys.add((OrderableItem)i);
@@ -276,13 +280,13 @@
 	
 	private QueryDefinition select(List<SelectItem> items, boolean isDistinct) {
 		if (_projections == null) {
-			_projections = new ArrayList<Selectable>();
+			_projections = new ArrayList<SelectItem>();
 		} else {
 			_projections.clear();
 		}
 		_distinct = isDistinct;
 		for (SelectItem item : items)
-			_projections.add((Selectable)item);
+			_projections.add(item);
 		return this;
 	}
 
@@ -323,78 +327,48 @@
 		return this;
 	}
 	
-	private List<Selectable> getProjections() {
+	private List<SelectItem> getProjections() {
 		if (_projections == null) {
-			List<Selectable> defaultProjection = new ArrayList<Selectable>();
+			List<SelectItem> defaultProjection = new ArrayList<SelectItem>();
 			defaultProjection.add(_domains.get(0));
 			return defaultProjection;
 		}
 		return _projections;
 	}
 
-	public String toJPQL() {
-		return asExpression(new AliasContext());
-	}
-	
 	/**
 	 * 
 	 */
 	@Override
 	public String asExpression(AliasContext ctx) {
+		ctx.push(this);
 		StringBuffer buffer = new StringBuffer();
 		registerDomains(ctx);
-		buffer.append("SELECT ");
-		if (_distinct) 
-			buffer.append("DISTINCT ");
-		List<Selectable> projs = getProjections();
-		for (int i=0; i < projs.size(); i++) {
-			projs.get(i).setAlias(ctx);
-			buffer.append(projs.get(i).asProjection(ctx));
-			if (i != projs.size()-1)
-				buffer.append(",");
-		}
+
+		fillBuffer(_distinct ? "SELECT DISTINCT " : "SELECT ", buffer, ctx, 
+			getProjections(), Visit.PROJECTION);
 		buffer.append(" FROM ");
 		for (int i=0; _domains != null && i < _domains.size(); i++) {
 			buffer.append(_domains.get(i).asJoinable(ctx));
-			List<JoinPath> joins = _domains.get(i).getJoins();
-			if (joins != null) {
-				for (int j = 0; j < joins.size(); j++) {
-					buffer.append(joins.get(j).asJoinable(ctx));
-				}
-			}
-			List<FetchPath> fetchJoins = _domains.get(i).getFetchJoins();
-			if (fetchJoins != null) {
-				for (int j = 0; j < fetchJoins.size(); j++) {
-					buffer.append(fetchJoins.get(j).asExpression(ctx));
-				}
-			}
-			
+			fillBuffer(" ", buffer, ctx, _domains.get(i).getJoins(), 
+					Visit.JOINABLE);
+			fillBuffer(" ", buffer, ctx, _domains.get(i).getFetchJoins(), 
+					Visit.EXPRESSION);
 			if (i != _domains.size()-1)
 				buffer.append(",");
 		}
 		if (_where != null) {
-			buffer.append(" WHERE ").append(((Visitable)_where).asExpression(ctx));
+			buffer.append(" WHERE ")
+			      .append(((Visitable)_where).asExpression(ctx));
 		}
 		
-		if (_groupBys != null) {
-			buffer.append(" GROUP BY ");
-			for (int i = 0; i<_groupBys.size(); i++) {
-				buffer.append(((ExpressionImpl)_groupBys.get(i)).asExpression(ctx));
-				if (i != _groupBys.size()-1)
-					buffer.append(",");
-			}
-		}
+		fillBuffer(" GROUP BY ", buffer, ctx, _groupBys, Visit.EXPRESSION);
+		
 		if (_having != null) {
-			buffer.append(" HAVING ").append(((Visitable)_having).asExpression(ctx));
-		}
-		if (_orderBys != null) {
-			buffer.append(" ORDER BY ");
-			for (int i = 0; i<_orderBys.size(); i++) {
-				buffer.append(((OrderableItem)_orderBys.get(i)).toJPQL(ctx));
-				if (i != _orderBys.size()-1)
-					buffer.append(",");
-			}
+			buffer.append(" HAVING ")
+			      .append(((Visitable)_having).asExpression(ctx));
 		}
+		fillBuffer(" ORDER BY ", buffer, ctx, _orderBys, Visit.EXPRESSION);
 		
 		return buffer.toString();
 	}
@@ -403,6 +377,26 @@
 		return asExpression(ctx);
 	}
 	
+	public void fillBuffer(String header, StringBuffer buffer, AliasContext ctx, 
+		List list, Visit visit) {
+		if (list == null || list.isEmpty())
+			return;
+		buffer.append(header);
+		for (int i = 0; i < list.size(); i++) {
+			Visitable v = (Visitable)list.get(i);
+			switch(visit) {
+			case PROJECTION : buffer.append(v.asProjection(ctx))
+				                    .append(i != list.size()-1 ? ", " : " ");
+				break;
+			case EXPRESSION : buffer.append(v.asExpression(ctx))
+				                    .append(i != list.size()-1 ? ", " : " ");
+				break;
+			case JOINABLE   : buffer.append(v.asJoinable(ctx)); 
+				break;
+			}
+		}
+	}
+	
 	/**
 	 * Registers each domain with an alias.
 	 * @param ctx
@@ -413,12 +407,11 @@
 				domain.setAlias(ctx);
 			}
 		}
-		if (_subqueries != null) {
-			for (Subquery sub : _subqueries) {
-				if (sub instanceof QueryDefinitionImpl)
-					((QueryDefinitionImpl)sub).registerDomains(ctx);
-				else
-					((AbstractDomainObject)sub).setAlias(ctx);
+		if (_orderBys != null) {
+			for (OrderableItem o : _orderBys) {
+				ExpressionImpl e = o.getExpression();
+				if (_projections != null && _projections.contains(e))
+					e.setAlias(ctx);
 			}
 		}
 	}

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/RootPath.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/RootPath.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/RootPath.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/RootPath.java Mon Dec  8 09:00:34 2008
@@ -20,8 +20,8 @@
 	}
 	
 	@Override
-	public String getAliasHint() {
-		return getLastSegment().getSimpleName();
+	public String getAliasHint(AliasContext ctx) {
+		return ctx.getEntityName(getLastSegment());
 	}
 
 	@Override
@@ -31,7 +31,7 @@
 	
 	@Override
 	public String asJoinable(AliasContext ctx) {
-		return getLastSegment().getSimpleName() + " " + ctx.getAlias(this);
+		return ctx.getEntityName(getLastSegment()) + " " + ctx.getAlias(this);
 	}
 	
 	@Override

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/SubStringExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/SubStringExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/SubStringExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/SubStringExpression.java Mon Dec  8 09:00:34 2008
@@ -26,20 +26,37 @@
  * @author Pinaki Poddar
  *
  */
-public class SubStringExpression extends BinaryOperatorExpression {
-	public SubStringExpression(Expression op, Expression op2) {
-		this(op, op2, new ConstantExpression(0));
+public class SubStringExpression extends UnaryOperatorExpression {
+	private final Expression _start;
+	private final Expression _length;
+	public SubStringExpression(Expression op, Expression start) {
+		super(op, UnaryFunctionalOperator.SUBSTR);
+		_start  = start;
+		_length = null;
 	}
 	
 	public SubStringExpression(Expression op, int start) {
-		this(op, start, 0);
+		super(op, UnaryFunctionalOperator.SUBSTR);
+		_start  = new ConstantExpression(start);
+		_length = null;
 	}
 	
 	public SubStringExpression(Expression op, int start, int len) {
-		this(op, new ConstantExpression(start), new ConstantExpression(len));
+		super(op, UnaryFunctionalOperator.SUBSTR);
+		_start  = new ConstantExpression(start);
+		_length = new ConstantExpression(len);
 	}
 	
-	public SubStringExpression(Expression op, Expression op2, Expression pos) {
-		super(op, BinaryFunctionalOperator.SUBSTR, op2);
+	public SubStringExpression(Expression op, Expression start, Expression l) {
+		super(op, UnaryFunctionalOperator.SUBSTR);
+		_start  = start;
+		_length = new ConstantExpression(l);
+	}
+	
+	public String asExpression(AliasContext ctx) {
+		return _op + "(" + ((Visitable)_e).asExpression(ctx)  
+			 + "," + ((Visitable)_start).asExpression(ctx)
+			 + (_length == null ? "" : "," + ((Visitable)_length).asExpression(ctx))
+			 + ")";
 	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/TrimExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/TrimExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/TrimExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/TrimExpression.java Mon Dec  8 09:00:34 2008
@@ -27,15 +27,29 @@
  * @author Pinaki Poddar
  *
  */
-public class TrimExpression extends BinaryOperatorExpression {
-	TrimSpec _spec;
-	public TrimExpression(Expression op1, char ch, TrimSpec spec) {
-		super(op1, BinaryFunctionalOperator.TRIM, new ConstantExpression(ch));
-		_spec = spec;
+public class TrimExpression extends UnaryOperatorExpression {
+	private final Expression _trimChar;
+	private final TrimSpec _spec;
+	private static final String BLANK = "' '";
+	
+	public TrimExpression(Expression op, char ch, TrimSpec spec) {
+		super(op, UnaryFunctionalOperator.TRIM);
+		_trimChar = new ConstantExpression(ch);
+		_spec     = spec;
 	}
 	
-	public TrimExpression(Expression op, Expression op1, TrimSpec spec) {
-		super(op, BinaryFunctionalOperator.TRIM, op1);
+	public TrimExpression(Expression op, Expression ch, TrimSpec spec) {
+		super(op, UnaryFunctionalOperator.TRIM);
+		_trimChar = ch;
 		_spec = spec;
 	}
+	
+	public String asExpression(AliasContext ctx) {
+		String trim = _trimChar == null ? BLANK 
+			: ((Visitable)_trimChar).asExpression(ctx);
+		String spec = _spec == null ? "" : _spec.toString();
+		return _op + "(" + spec + " " + trim + " FROM " 
+			+ ((Visitable)_e).asExpression(ctx) + ")";
+	}
+
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryExpressionPredicate.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryExpressionPredicate.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryExpressionPredicate.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryExpressionPredicate.java Mon Dec  8 09:00:34 2008
@@ -27,7 +27,8 @@
  * @author Pinaki Poddar
  *
  */
-class UnaryExpressionPredicate implements Predicate, Visitable {
+class UnaryExpressionPredicate extends AbstractVisitable 
+	implements Predicate, Visitable {
 	protected final Expression _e;
 	protected final UnaryConditionalOperator _op;
 	private final UnaryConditionalOperator _nop;

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryFunctionalOperator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryFunctionalOperator.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryFunctionalOperator.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryFunctionalOperator.java Mon Dec  8 09:00:34 2008
@@ -32,22 +32,25 @@
 	ALL("ALL"),
 	ANY("ANY"),
 	AVG("AVG"),
+	CONCAT("CONCAT"),
 	COUNT("COUNT"),
 	DISTINCT("DISTINCT"),
 	EXISTS("EXISTS"),
 	INDEX("INDEX"),
 	LENGTH("LENGTH"),
 	LOCATE("LOCATE"),
-	LOWER("TOLOWER"),
+	LOWER("LOWER"),
 	MAX("MAX"),
 	MIN("MIN"),
 	MINUS("-"),
 	SIZE("SIZE"),
 	SOME("SOME"),
 	SQRT("SQRT"),
+	SUBSTR("SUBSTRING"),
 	SUM("SUM"),
+	TRIM("TRIM"),
 	TYPE("TYPE"),
-	UPPER("TOUPPER");
+	UPPER("UPPER");
 	
 	private final String _symbol;
 	

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryOperatorExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryOperatorExpression.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryOperatorExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UnaryOperatorExpression.java Mon Dec  8 09:00:34 2008
@@ -47,6 +47,7 @@
 	}
 	
 	public String asProjection(AliasContext ctx) {
-		return _op + "(" + ((Selectable)_e).asProjection(ctx) + ")";
+		return _op + "(" + ((Visitable)_e).asProjection(ctx) + ")" +
+		    (ctx.hasAlias(this) ? " " + ctx.getAlias(this) : "");
 	}
 }

Copied: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UpperExpression.java (from r723553, openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ToUpperExpression.java)
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UpperExpression.java?p2=openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UpperExpression.java&p1=openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ToUpperExpression.java&r1=723553&r2=724402&rev=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/ToUpperExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/UpperExpression.java Mon Dec  8 09:00:34 2008
@@ -26,8 +26,8 @@
  * @author Pinaki Poddar
  *
  */
-public class ToUpperExpression extends UnaryOperatorExpression {
-	public ToUpperExpression(Expression op) {
+public class UpperExpression extends UnaryOperatorExpression {
+	public UpperExpression(Expression op) {
 		super(op, UnaryFunctionalOperator.UPPER);
 	}
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/Visitable.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/Visitable.java?rev=724402&r1=724401&r2=724402&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/Visitable.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/query/Visitable.java Mon Dec  8 09:00:34 2008
@@ -18,6 +18,8 @@
  */
 package org.apache.openjpa.persistence.query;
 
+import java.io.Serializable;
+
 /**
  * An element of query that is convertible to a JPQL String given a aliasing 
  * scheme. QueryDefinition visits each of its element and translates them.
@@ -25,9 +27,26 @@
  * @author Pinaki Poddar
  *
  */
-public interface Visitable {
+public interface Visitable extends Serializable {
 	/**
 	 * Get a JPQL fragment as used in a WHERE clause.
 	 */
 	String asExpression(AliasContext ctx);
+	
+	/**
+	 * Gets the string representation in a SELECT projection.
+	 */
+	String asProjection(AliasContext ctx);
+	
+	/**
+	 * Sets alias.
+	 */
+	void setAlias(AliasContext ctx);
+	
+	String getAliasHint(AliasContext ctx);
+	
+	String asJoinable(AliasContext ctx);
+
+
+
 }