Author: fancy
Date: Tue Oct  6 16:13:33 2009
New Revision: 822330

URL: http://svn.apache.org/viewvc?rev=822330&view=rev
Log:
OPENJPA-1338 Allow comparison for VALUE(e) that maps to basic type

Added:
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Embed_Coll_Map.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EntityA_Embed_Coll_Map.java
Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=822330&r1=822329&r2=822330&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
 Tue Oct  6 16:13:33 2009
@@ -1731,20 +1731,20 @@
 
     private Value getGeneralIdentifier(JPQLNode node, boolean inWhereClause) {
         JPQLNode id = onlyChild(node);
-        if (inWhereClause && node.id == JJTVALUE)
-            throw parseException(EX_USER, "bad-general-identifier",
-                new Object[]{ id.text, "VALUE" }, null);
-
         Path path = validateMapPath(node, id);
+
+        if (node.id == JJTKEY)
+            path = (Path) factory.getKey(path);
         FieldMetaData fld = path.last();
-        path = (Path) factory.getKey(path);
-        ClassMetaData meta = fld.getKey().getTypeMetaData();
-        if (inWhereClause && meta != null &&
-            fld.isElementCollection() &&
-            fld.getElement().getEmbeddedMetaData() != null)
-            // check basic type
-            throw parseException(EX_USER, "bad-general-identifier",
-                new Object[]{ id.text, "KEY" }, null);
+        ClassMetaData meta = node.id == JJTKEY ? meta = 
fld.getKey().getTypeMetaData()
+                : fld.getDeclaredTypeMetaData();
+        if (inWhereClause &&
+            (meta != null && meta.isEmbeddable()) ||
+                (fld.isElementCollection() &&
+                 fld.getElement().getEmbeddedMetaData() != null))   
+                 // check basic type
+                throw parseException(EX_USER, "bad-general-identifier",
+                    new Object[]{ id.text, node.id == JJTVALUE ? "VALUE" : 
"KEY" }, null);
 
         return path;
     }

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Embed_Coll_Map.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Embed_Coll_Map.java?rev=822330&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Embed_Coll_Map.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Embed_Coll_Map.java
 Tue Oct  6 16:13:33 2009
@@ -0,0 +1,67 @@
+/*
+ * 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.embed;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.ElementCollection;
+import javax.persistence.Embeddable;
+
+...@embeddable 
+public class Embed_Coll_Map {
+    protected String name1;
+    protected String name2;
+    protected String name3;
+    
+    @ElementCollection
+    public Map<Integer, Integer> mapKeyInteger = new HashMap<Integer, 
Integer>();
+    
+    public String getName1() {
+        return name1;
+    }
+    
+    public void setName1(String name1) {
+        this.name1 = name1;
+    }
+    
+    public String getName2() {
+        return name2;
+    }
+    
+    public void setName2(String name2) {
+        this.name2 = name2;
+    }
+    
+    public String getName3() {
+        return name3;
+    }
+    
+    public void setName3(String name3) {
+        this.name3 = name3;
+    }
+    
+    public Map<Integer,Integer> getMap() {
+        return mapKeyInteger;
+    }
+ 
+    public void addMap(Integer key, Integer value) {
+        mapKeyInteger.put(key, value);
+    }
+}

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EntityA_Embed_Coll_Map.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EntityA_Embed_Coll_Map.java?rev=822330&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EntityA_Embed_Coll_Map.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/EntityA_Embed_Coll_Map.java
 Tue Oct  6 16:13:33 2009
@@ -0,0 +1,77 @@
+/*
+ * 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.embed;
+
+import java.io.Serializable;
+
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+...@entity
+...@table(name="EETMM")
+public class EntityA_Embed_Coll_Map implements Serializable {
+    @Id
+    Integer id;
+
+    @Column(length = 30)
+    String name;
+
+    @Basic(fetch = FetchType.LAZY)
+    int age;
+
+    @Embedded
+    protected Embed_Coll_Map embed;
+
+    public int getAge() {
+        return age;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Embed_Coll_Map getEmbed() {
+        return embed;
+    }
+
+    public void setEmbed(Embed_Coll_Map embed) {
+        this.embed = embed;
+    }
+}

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java?rev=822330&r1=822329&r2=822330&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
 Tue Oct  6 16:13:33 2009
@@ -97,6 +97,7 @@
             Embed_MappedToOne.class, Embed_MappedToOneCascadeDelete.class, 
             EntityA_Embed_MappedToOneCascadeDelete.class, EntityB2.class, 
             Book.class, Listing.class, Seller.class,
+            EntityA_Embed_Coll_Map.class, Embed_Coll_Map.class,
             EntityA_Embed_Complex.class, CLEAR_TABLES);
             sql.clear();
             DBDictionary dict = 
((JDBCConfiguration)emf.getConfiguration()).getDBDictionaryInstance();
@@ -104,7 +105,24 @@
                 ((OracleDictionary)dict).useTriggersForAutoAssign = true;
             }
     }
-    
+
+    public void testEntityA_Embed_Coll_Map() {
+        queryEntityA_Embed_Coll_Map();
+    }
+
+    public void queryEntityA_Embed_Coll_Map() {
+        EntityManager em = emf.createEntityManager();
+        String query[] = {
+                "select e from EntityA_Embed_Coll_Map a join a.embed e " +
+                "join e.mapKeyInteger i where value(i) > 0 ",
+            };
+        List rs = null;
+        for (int i = 0; i < query.length; i++) {
+            rs = em.createQuery(query[i]).getResultList();
+            em.clear();
+        }        
+    }
+
     public void testEntityA_Coll_String() {
         createEntityA_Coll_String();
         queryEntityA_Coll_String();


Reply via email to