Return-Path: Delivered-To: apmail-openjpa-commits-archive@www.apache.org Received: (qmail 48040 invoked from network); 18 May 2009 23:42:09 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 18 May 2009 23:42:09 -0000 Received: (qmail 13465 invoked by uid 500); 18 May 2009 23:42:09 -0000 Delivered-To: apmail-openjpa-commits-archive@openjpa.apache.org Received: (qmail 13418 invoked by uid 500); 18 May 2009 23:42:09 -0000 Mailing-List: contact commits-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openjpa.apache.org Delivered-To: mailing list commits@openjpa.apache.org Received: (qmail 13409 invoked by uid 99); 18 May 2009 23:42:09 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 18 May 2009 23:42:09 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 18 May 2009 23:42:05 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 650E023888E8; Mon, 18 May 2009 23:41:44 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r776136 - in /openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria: CriteriaBuilder.java CriteriaQueryImpl.java SelectionImpl.java Date: Mon, 18 May 2009 23:41:44 -0000 To: commits@openjpa.apache.org From: faywang@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090518234144.650E023888E8@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: faywang Date: Mon May 18 23:41:43 2009 New Revision: 776136 URL: http://svn.apache.org/viewvc?rev=776136&view=rev Log: OPENJPA-1013: Constructor support in Criteria Query. Test case will be checked in later. Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java?rev=776136&r1=776135&r2=776136&view=diff ============================================================================== --- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java (original) +++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java Mon May 18 23:41:43 2009 @@ -540,7 +540,7 @@ public Selection select(Class result, Selection... selections) { - throw new AbstractMethodError(); + return new SelectionImpl(result).setSelections(selections); } public Case selectCase() { Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java?rev=776136&r1=776135&r2=776136&view=diff ============================================================================== --- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java (original) +++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java Mon May 18 23:41:43 2009 @@ -62,6 +62,9 @@ private PredicateImpl _having; private Boolean _distinct; private LinkedMap _parameterTypes; + private Class _resultClass; + private Value[] _projections; + private int _aliasCount = 0; public CriteriaQueryImpl(MetamodelImpl model) { this._model = model; @@ -177,6 +180,14 @@ _parameterTypes = parameterTypes; } + public void setResultClass(Class resultClass) { + _resultClass = resultClass; + } + + public void setProjections(Value[] projections) { + _projections = projections; + } + /** * Populate kernel expressions. */ @@ -206,14 +217,13 @@ evalOrdering(exps, factory); // exps.operation = QueryOperations.OP_SELECT; - // exps.parameterTypes = null; // LinkedMap<> - // exps.projectionAliases = null; // String[] - // exps.projectionClauses = null; // String[] - exps.projections = toValues(factory, getSelectionList()); + evalProjection(exps, factory); + // exps.range = null; // Value[] // exps.resultClass = null; // Class - if (_parameterTypes != null) - exps.parameterTypes = _parameterTypes; + if (_parameterTypes != null) + exps.parameterTypes = _parameterTypes; + exps.resultClass = _resultClass; return exps; } @@ -249,19 +259,31 @@ (ExpressionImpl)groupBy, factory, _model, this);; } } - - - - Value[] toValues(ExpressionFactory factory, List> sels) { + void evalProjection(QueryExpressions exps, ExpressionFactory factory) { + Value [] projs = toValues(exps, factory, getSelectionList()); + if (projs.length == 1 && projs[0] == null) + exps.projections = _projections; + else + exps.projections = projs; + //exps.projectionClauses = String[]; + } + + Value[] toValues(QueryExpressions exps, ExpressionFactory factory, + List> sels) { if (sels == null || (sels.size() == 1 && sels.get(0) == getRoot())) return new Value[0]; Value[] result = new Value[sels.size()]; + String[] aliases = new String[sels.size()]; int i = 0; for (Selection s : sels) { - result[i++] = ((ExpressionImpl)s).toValue(factory, _model, + result[i] = ((SelectionImpl)s).toValue(factory, _model, this); - } + aliases[i] = nextAlias(); + i++; + } + exps.projectionAliases = aliases; + return result; } @@ -323,4 +345,9 @@ if (_parameterTypes.containsKey(paramKey)) _parameterTypes.put(paramKey, type); } + + private String nextAlias() { + return "jpqlalias" + (++_aliasCount); + } + } Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java?rev=776136&r1=776135&r2=776136&view=diff ============================================================================== --- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java (original) +++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java Mon May 18 23:41:43 2009 @@ -18,9 +18,16 @@ */ package org.apache.openjpa.persistence.criteria; +import java.util.Arrays; +import java.util.List; + +import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Selection; +import org.apache.openjpa.kernel.exps.ExpressionFactory; +import org.apache.openjpa.kernel.exps.Value; import org.apache.openjpa.persistence.ResultItemImpl; +import org.apache.openjpa.persistence.meta.MetamodelImpl; /** * An item selected in the projection clause of Criteria query. @@ -31,8 +38,32 @@ */ public class SelectionImpl extends ResultItemImpl implements Selection { - + + private List> _sels; + public SelectionImpl(Class cls) { super(cls); } + + public SelectionImpl setSelections(Selection... selections) { + _sels = Arrays.asList(selections); + return this; + } + + public List> getSelections() { + return _sels; + } + + Value toValue(ExpressionFactory factory, MetamodelImpl model, + CriteriaQuery q) { + ((CriteriaQueryImpl)q).setResultClass(getJavaType()); + Value[] result = new Value[_sels.size()]; + int i = 0; + for (Selection s : _sels) { + result[i++] = ((ExpressionImpl)s).toValue(factory, model, + q); + } + ((CriteriaQueryImpl)q).setProjections(result); + return null; + } }