diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java index 2f4534d24..1bf5af382 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java @@ -345,7 +345,7 @@ public class JPQLExpressionBuilder private void evalGroupingClause(QueryExpressions exps) { // handle GROUP BY clauses - JPQLNode groupByNode = root().findChildByID(JJTGROUPBY, true); + JPQLNode groupByNode = root().findChildByID(JJTGROUPBY, false); if (groupByNode == null) return; @@ -362,7 +362,7 @@ public class JPQLExpressionBuilder private void evalHavingClause(QueryExpressions exps) { // handle HAVING clauses - JPQLNode havingNode = root().findChildByID(JJTHAVING, true); + JPQLNode havingNode = root().findChildByID(JJTHAVING, false); if (havingNode == null) return; diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestGroupByQuery.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestGroupByQuery.java new file mode 100644 index 000000000..0af73218c --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestGroupByQuery.java @@ -0,0 +1,84 @@ +/* + * TestLockGroupsWithHorizontalBaseType.java + * + * Created on October 4, 2006, 5:03 PM + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +/* + * 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.jdbc.query; + +import java.util.List; + +import javax.persistence.EntityManager; + +import org.apache.openjpa.persistence.jdbc.query.domain.IndoorGame; +import org.apache.openjpa.persistence.jdbc.query.domain.Scrabble; +import org.apache.openjpa.persistence.jdbc.query.domain.Chess; +import org.apache.openjpa.persistence.jdbc.query.domain.Game; +import org.apache.openjpa.persistence.test.SingleEMFTestCase; + +/** + * Tests GROUP BY in sub query does not get parsed by owning query. + * + * Further details can be found in OPENJPA-28 + * + * @author Pinaki Poddar + * + */ +public class TestGroupByQuery extends SingleEMFTestCase { + public void setUp() { + super.setUp(DROP_TABLES, Game.class, IndoorGame.class, Scrabble.class, + Chess.class); + try { + createData(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + void createData() throws Exception { + EntityManager em = emf.createEntityManager(); + em.getTransaction().begin(); + Class[] classes = { Game.class, IndoorGame.class, Scrabble.class, + Chess.class }; + for (Class cls : classes) { + for (int i = 1; i <= 4; i++) { + Game p = (Game) cls.newInstance(); + p.setName(cls.getSimpleName() + "-" + i); + em.persist(p); + } + } + em.getTransaction().commit(); + } + + public void testGroupBy() { + String jpql = "SELECT g.name, g.nTile FROM Scrabble g WHERE " + + "(g.name = ANY(SELECT g1.name FROM Scrabble g1 " + + "GROUP BY g1.name )) ORDER BY g.name"; + EntityManager em = emf.createEntityManager(); + + List employees = em.createQuery(jpql).getResultList(); + + } +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Chess.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Chess.java new file mode 100644 index 000000000..4d7a5bdff --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Chess.java @@ -0,0 +1,43 @@ +/* + * TestLockGroupsWithHorizontalBaseType.java + * + * Created on October 4, 2006, 5:03 PM + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +/* + * 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.jdbc.query.domain; + +import javax.persistence.Entity; + +@Entity +public class Chess extends IndoorGame { + private int nPiece; + + public int getPiece() { + return nPiece; + } + + public void setPiece(int n) { + this.nPiece = n; + } +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Game.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Game.java new file mode 100644 index 000000000..de133a07d --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Game.java @@ -0,0 +1,65 @@ +/* + * TestLockGroupsWithHorizontalBaseType.java + * + * Created on October 4, 2006, 5:03 PM + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +/* + * 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.jdbc.query.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; + +/** + * Simple unrelated persistent entity used to test logically union queries. + * This class is root of an inheritance hierarchy using TABLE PER CLASS + * strategy. Polymorphic queries on this class needs to run logical union + * of queries on all known subclasses. + * + * @author Pinaki Poddar + * + */ +@Entity +@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) +public class Game { + @Id + @GeneratedValue + private long id; + + private String name; + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/IndoorGame.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/IndoorGame.java new file mode 100644 index 000000000..ffe7384d6 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/IndoorGame.java @@ -0,0 +1,43 @@ +/* + * TestLockGroupsWithHorizontalBaseType.java + * + * Created on October 4, 2006, 5:03 PM + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +/* + * 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.jdbc.query.domain; + +import javax.persistence.Entity; + +@Entity +public class IndoorGame extends Game { + private int nPlayer; + + public int getPlayer() { + return nPlayer; + } + + public void setPlayer(int n) { + this.nPlayer = n; + } +} diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Scrabble.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Scrabble.java new file mode 100644 index 000000000..fd0356372 --- /dev/null +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Scrabble.java @@ -0,0 +1,44 @@ +/* + * TestLockGroupsWithHorizontalBaseType.java + * + * Created on October 4, 2006, 5:03 PM + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ + +/* + * 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.jdbc.query.domain; + +import javax.persistence.Entity; + +@Entity +public class Scrabble extends IndoorGame { + private int nTile; + + public int getTile() { + return nTile; + } + + public void setTile(int n) { + this.nTile = n; + } + +}