You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2010/06/12 16:05:44 UTC

svn commit: r954007 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-jdbc/src/main/resources/...

Author: fancy
Date: Sat Jun 12 14:05:43 2010
New Revision: 954007

URL: http://svn.apache.org/viewvc?rev=954007&view=rev
Log:
OPENJPA-1696: Type discriminator for polymorphic queries limited to Single Table inheritance

Added:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualTypeExpression.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/NotEqualTypeExpression.java
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ExpContext.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Type.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/LogicalUnion.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Select.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
    openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestDefaultInheritanceStrategy.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/TestInheritanceTypeJoinedQuery.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java Sat Jun 12 14:05:43 2010
@@ -42,7 +42,9 @@ import org.apache.openjpa.jdbc.kernel.ex
 import org.apache.openjpa.jdbc.kernel.exps.SQLValue;
 import org.apache.openjpa.jdbc.kernel.exps.Val;
 import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.meta.Discriminator;
 import org.apache.openjpa.jdbc.meta.FieldMapping;
+import org.apache.openjpa.jdbc.meta.strats.NoneDiscriminatorStrategy;
 import org.apache.openjpa.jdbc.meta.strats.VerticalClassStrategy;
 import org.apache.openjpa.jdbc.schema.Column;
 import org.apache.openjpa.jdbc.schema.Table;
@@ -345,6 +347,11 @@ public class JDBCStoreQuery 
             if (verts.length == 1 && subclasses)
                 subclassBits.set(sels.size());
 
+            Discriminator disc = mappings[i].getDiscriminator();
+            if (mappings.length > 1 && disc != null && disc.getColumns().length == 0 &&
+                disc.getStrategy() instanceof NoneDiscriminatorStrategy)
+                ctx.tpcMeta = mappings[i];
+
             // create criteria select and clone for each vert mapping
             sel = ((JDBCExpressionFactory) facts[i]).getSelectConstructor().
                 evaluate(ctx, null, null, exps[i], states[i]);

Added: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualTypeExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualTypeExpression.java?rev=954007&view=auto
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualTypeExpression.java (added)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualTypeExpression.java Sat Jun 12 14:05:43 2010
@@ -0,0 +1,90 @@
+/*
+ * 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.jdbc.kernel.exps;
+
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.sql.SQLBuffer;
+import org.apache.openjpa.jdbc.sql.Select;
+
+/**
+ * Compares two entity types.
+ *
+ * @author Catalina Wei
+ */
+class EqualTypeExpression
+    extends CompareEqualExpression {
+
+    /**
+     * Constructor. Supply values to compare.
+     */
+    public EqualTypeExpression(Val val1, Val val2) {
+        super(val1, val2);
+    }
+
+    public void appendTo(Select sel, ExpContext ctx, BinaryOpExpState bstate, 
+        SQLBuffer buf, boolean val1Null, boolean val2Null) {
+        if (val1Null && val2Null)
+            buf.append("1 = 1");
+        else if (val1Null || val2Null) {
+            Val val = (val1Null) ? getValue2() : getValue1();
+            ExpState state = (val1Null) ? bstate.state2 : bstate.state1;
+            if (!isDirectComparison()) {
+                int len = val.length(sel, ctx, state);
+                for (int i = 0; i < len; i++) {
+                    if (i > 0)
+                        buf.append(" AND ");
+                    val.appendTo(sel, ctx, state, buf, i);
+                    buf.append(" IS ").appendValue(null);
+                }
+            } else
+                val.appendIsNull(sel, ctx, state, buf);
+        } else {
+            Val val1 = getValue1();
+            Val val2 = getValue2();
+            if (val1.length(sel, ctx, bstate.state1) == 1 
+                && val2.length(sel, ctx, bstate.state2) == 1) {
+                String op = "=";
+                if (sel.getTablePerClassMeta() != null) {
+                    if (val1 instanceof Type) {
+                        if ((ClassMapping) val2.getMetaData() != sel.getTablePerClassMeta())
+                            op = "<>";
+                    }
+                    else {
+                        if ((ClassMapping) val1.getMetaData() != sel.getTablePerClassMeta())
+                            op = "<>";
+                    }
+                }
+                ctx.store.getDBDictionary().comparison(buf, op,
+                    new FilterValueImpl(sel, ctx, bstate.state1, val1),
+                    new FilterValueImpl(sel, ctx, bstate.state2, val2));
+            } else {
+                int len = java.lang.Math.min(val1.length(sel, ctx, 
+                    bstate.state1), val2.length(sel, ctx, bstate.state2));
+                for (int i = 0; i < len; i++) {
+                    if (i > 0)
+                        buf.append(" AND ");
+
+                    val1.appendTo(sel, ctx, bstate.state1, buf, i);
+                    buf.append(" = ");
+                    val2.appendTo(sel, ctx, bstate.state2, buf, i);
+                }
+            }
+        }
+    }
+}

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ExpContext.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ExpContext.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ExpContext.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ExpContext.java Sat Jun 12 14:05:43 2010
@@ -20,6 +20,7 @@ package org.apache.openjpa.jdbc.kernel.e
 
 import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
 import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.ClassMapping;
 
 /**
  * Expression tree context.
@@ -44,6 +45,8 @@ public class ExpContext {
      */
     public JDBCFetchConfiguration fetch; 
 
+    public ClassMapping tpcMeta = null;
+
     public ExpContext() {
     }
 

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java Sat Jun 12 14:05:43 2010
@@ -22,7 +22,8 @@ import java.io.Serializable;
 import java.util.Date;
 
 import org.apache.openjpa.jdbc.meta.ClassMapping;
-import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
+import org.apache.openjpa.jdbc.meta.Discriminator;
+import org.apache.openjpa.jdbc.meta.strats.NoneDiscriminatorStrategy;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
 import org.apache.openjpa.jdbc.sql.Raw;
 import org.apache.openjpa.kernel.exps.AggregateListener;
@@ -87,10 +88,52 @@ public class JDBCExpressionFactory
             return contains(v1, v2);
         if (v2 instanceof PCPath && ((PCPath) v2).isUnaccessedVariable())
             return contains(v2, v1);
+        if (v1 instanceof Type || v2 instanceof Type) {
+            Value val = v1 instanceof Type ? v1 : v2;
+            verifyTypeOperation(val, null, false);
+            return new EqualTypeExpression((Val) v1, (Val) v2);
+        }
         return new EqualExpression((Val) v1, (Val) v2);
     }
 
+    private void verifyTypeOperation(Value val, Value param, boolean isNotEqual) {
+        if (val.getPath() == null)
+            return;
+        PCPath path = (PCPath) val.getPath();
+        Discriminator disc = ((Type) val).getDiscriminator();
+        if (disc == null || !(val.getMetaData().getPCSuperclass() != null ||
+            val.getMetaData().getPCSubclasses().length > 0))
+            throw new UserException(_loc.
+                get("invalid-type-argument", path.last() != null ? path.getPCPathString() : path.getSchemaAlias()));
+        
+        if (disc.getColumns().length == 0) {
+            if (disc.getStrategy() instanceof NoneDiscriminatorStrategy) {
+                // limited support for table per class inheritance hierarchy
+                if (path.last() != null)
+                    throw new UserException(_loc.
+                        get("type-argument-unsupported", path.last().getName())); 
+                if (isNotEqual) {
+                    if (param != null && param instanceof Null)
+                        throw new UserException(_loc.
+                            get("type-in-expression-unsupported", path.getSchemaAlias()));
+                    else
+                        throw new UserException(_loc.
+                            get("type-not-equal-unsupported", path.getSchemaAlias()));
+                }
+            }
+            if (param != null && param instanceof CollectionParam)
+                throw new UserException(_loc.
+                    get("collection-param-unsupported")); 
+        }
+    }
+
     public Expression notEqual(Value v1, Value v2) {
+        if (v1 instanceof Type || v2 instanceof Type) {
+            Value val = v1 instanceof Type ? v1 : v2;
+            Value param = val == v1 ? (v2 instanceof Null ? v2 : null) : (v1 instanceof Null ? v1 : null);
+            verifyTypeOperation(val, param, true);
+            return new NotEqualTypeExpression((Val) v1, (Val) v2);
+        }
         return new NotEqualExpression((Val) v1, (Val) v2);
     }
 
@@ -123,8 +166,16 @@ public class JDBCExpressionFactory
     }
 
     public Expression contains(Value map, Value arg) {
-        if (map instanceof Const)
+        if (map instanceof Const) {
+            if (arg instanceof Type) {
+                // limited support for table per class inheritance
+                verifyTypeOperation(arg, map, false);
+                if (((ClassMapping) arg.getMetaData()).getDiscriminator().getColumns().length == 0)
+                    return new EqualTypeExpression((Val) arg, (Val) map);
+            }
+
             return new InExpression((Val) arg, (Const) map);
+        }
         if (map instanceof SubQ)
             return new InSubQExpression((Val) arg, (SubQ) map);
         return new ContainsExpression((Val) map, (Val) arg);

Added: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/NotEqualTypeExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/NotEqualTypeExpression.java?rev=954007&view=auto
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/NotEqualTypeExpression.java (added)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/NotEqualTypeExpression.java Sat Jun 12 14:05:43 2010
@@ -0,0 +1,87 @@
+/*
+ * 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.jdbc.kernel.exps;
+
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.sql.SQLBuffer;
+import org.apache.openjpa.jdbc.sql.Select;
+
+/**
+ * Compares two entity types.
+ *
+ * @author Catalina Wei
+ */
+class NotEqualTypeExpression
+    extends CompareEqualExpression {
+
+    /**
+     * Constructor. Supply values to compare.
+     */
+    public NotEqualTypeExpression(Val val1, Val val2) {
+        super(val1, val2);
+    }
+
+    public void appendTo(Select sel, ExpContext ctx, BinaryOpExpState bstate, 
+        SQLBuffer buf, boolean val1Null, boolean val2Null) {
+        if (val1Null && val2Null)
+            buf.append("1 <> 1");
+        else if (val1Null || val2Null) {
+            Val val = (val1Null) ? getValue2() : getValue1();
+            ExpState state = (val1Null) ? bstate.state2 : bstate.state1;
+            if (!isDirectComparison()) {
+                int len = val.length(sel, ctx, state);
+                for (int i = 0; i < len; i++) {
+                    if (i > 0)
+                        buf.append(" AND ");
+                    val.appendTo(sel, ctx, state, buf, i);
+                    buf.append(" IS NOT ").appendValue(null);
+                }
+            } else
+                val.appendIsNotNull(sel, ctx, state, buf);
+        } else {
+            Val val1 = getValue1();
+            Val val2 = getValue2();
+            if (val1.length(sel, ctx, bstate.state1) == 1 
+                && val2.length(sel, ctx, bstate.state2) == 1) {
+                String op = "<>";
+                if (val1 instanceof Type)
+                    if ((ClassMapping) val2.getMetaData() != sel.getTablePerClassMeta())
+                        op = "=";
+                else
+                    if ((ClassMapping) val1.getMetaData() != sel.getTablePerClassMeta())
+                        op = "=";
+                ctx.store.getDBDictionary().comparison(buf, op,
+                    new FilterValueImpl(sel, ctx, bstate.state1, val1),
+                    new FilterValueImpl(sel, ctx, bstate.state2, val2));
+            } else {
+                int len = java.lang.Math.max(val1.length(sel, ctx, 
+                    bstate.state1), val2.length(sel, ctx, bstate.state2));
+                buf.append("(");
+                for (int i = 0; i < len; i++) {
+                    if (i > 0)
+                        buf.append(" OR ");
+                    val1.appendTo(sel, ctx, bstate.state1, buf, i);
+                    buf.append(" <> ");
+                    val2.appendTo(sel, ctx, bstate.state2, buf, i);
+                }
+                buf.append(")");
+            }
+        }
+    }
+}

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/PCPath.java Sat Jun 12 14:05:43 2010
@@ -1049,7 +1049,7 @@ public class PCPath
         else
             cols = getColumns(state);
 
-        if (cols == null) {
+        if (cols == null || cols.length == 0) {
             sql.append("1");
             return;
         }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java Sat Jun 12 14:05:43 2010
@@ -119,8 +119,7 @@ public class Param
                     getMappingRepositoryInstance().getMapping((Class) val,
                         ctx.store.getContext().getClassLoader(), true);
                 pstate.disc = pstate.mapping.getDiscriminator();
-                pstate.discValue = pstate.disc != null ? pstate.disc.getValue()
-                    : null;
+                pstate.discValue = pstate.disc.getValue() != null ? pstate.disc.getValue() : "1";
             }
         } else if (ImplHelper.isManageable(val)) {
             ClassMapping mapping = ctx.store.getConfiguration().

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SelectConstructor.java Sat Jun 12 14:05:43 2010
@@ -85,6 +85,7 @@ public class SelectConstructor
         // create a new select and initialize it with the joins needed for
         // the criteria of this query
         sel = newSelect(ctx, parent, alias, exps, state);
+        sel.setTablePerClassMeta(ctx.tpcMeta);
 
         // create where clause; if there are no where conditions and
         // no ordering or projections, we return null to signify that this

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Type.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Type.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Type.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Type.java Sat Jun 12 14:05:43 2010
@@ -25,6 +25,7 @@ import org.apache.openjpa.jdbc.meta.Disc
 import org.apache.openjpa.jdbc.sql.Result;
 import org.apache.openjpa.jdbc.sql.SQLBuffer;
 import org.apache.openjpa.jdbc.sql.Select;
+import org.apache.openjpa.kernel.exps.Path;
 import org.apache.openjpa.util.InternalException;
 
 /**
@@ -94,4 +95,12 @@ class Type
         // since we override appendTo(), this method should never be called
         throw new InternalException();
     }
+
+    public Path getPath() {
+        return getValue() instanceof Path ? (Path) getValue() : null;
+    }
+
+    public Discriminator getDiscriminator() {
+        return _disc;
+    }
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/LogicalUnion.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/LogicalUnion.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/LogicalUnion.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/LogicalUnion.java Sat Jun 12 14:05:43 2010
@@ -905,6 +905,12 @@ public class LogicalUnion
         public void logEagerRelations() {
             sel.logEagerRelations();            
         }
+        public void setTablePerClassMeta(ClassMapping meta) {            
+        }
+
+        public ClassMapping getTablePerClassMeta() {
+            return sel.getTablePerClassMeta();
+        }
     }
 
     /**

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Select.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Select.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Select.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/Select.java Sat Jun 12 14:05:43 2010
@@ -737,4 +737,14 @@ public interface Select
      * Extended trace that logs eager relations
      */
     public void logEagerRelations();
+
+    /**
+     * Set table-per-class metadata for polymorphic queries
+     */
+    public void setTablePerClassMeta(ClassMapping meta);
+
+    /**
+     * get table-per-class metadata for polymorphic queries
+     */
+    public ClassMapping getTablePerClassMeta();
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Sat Jun 12 14:05:43 2010
@@ -169,6 +169,13 @@ public class SelectImpl
 
     // A path navigation is begin with this schema alias
     private String _schemaAlias = null;
+    private ClassMapping _tpcMeta = null;
+    public ClassMapping getTablePerClassMeta() {
+        return _tpcMeta;
+    }
+    public void setTablePerClassMeta(ClassMapping meta) {
+        _tpcMeta = meta;
+    }
      
     /**
      * Helper method to return the proper table alias for the given alias index.

Modified: openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties Sat Jun 12 14:05:43 2010
@@ -34,4 +34,19 @@ empty-collection-parm: Input parameter "
 count-distinct-multi-col-only: Count distinct compound primary key is not \
     supported when there are other projection items.
 count-distinct-multi-col-subselect-unsupported: Count distinct multiple columns \
-	in the subselect is not supported.
\ No newline at end of file
+	in the subselect is not supported.
+invalid-type-argument: The argument "{0}" in type discriminator is not involved in any \
+    inheritance class hierarchy. Nonpolymorphic type comparison is not supported.
+type-argument-unsupported: A single valued object path "{0}" for the TYPE argument in \
+    a table per class inheritance hierarchy is not supported.
+type-not-equal-unsupported: The argument "{0}" in type discriminator is in a table per class \
+    or mapped super class inheritance hierarchy. The not equal type comparison for such entity \
+    is not supported. Rewrite the query in type equal comparison  \
+    and or operators for polymorphic query results.
+type-in-expression-unsupported: The argument "{0}" in type discriminator is in a table per class \
+    inheritance hierarchy. The type discriminator in IN expression for such entity \
+    is not supported. Rewrite the query in type equal comparison  \
+    and or operators for polymorphic query results.
+collection-param-unsupported: The collection parameter used in IN expression is not supported \
+    for table per class inheritance hierarchy or inheritance type joined strategy. \
+    Use type equal comparison and or operators for polymorphic query results.

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestDefaultInheritanceStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestDefaultInheritanceStrategy.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestDefaultInheritanceStrategy.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestDefaultInheritanceStrategy.java Sat Jun 12 14:05:43 2010
@@ -120,6 +120,15 @@ public class TestDefaultInheritanceStrat
         em.persist(b);
         em.getTransaction().commit();
 
+        // test entity type discriminator queries for polymorphic results
+        em.clear();
+        String query = "select a from BaseClass a where TYPE(a) = BaseClass";
+        List rs = em.createQuery(query).getResultList();
+        assertTrue(rs.get(0) instanceof BaseClass);
+        query = "select a from BaseClass a where TYPE(a) = SubclassA";
+        rs = em.createQuery(query).getResultList();
+        assertTrue(rs.get(0) instanceof SubclassA);
+
         em.clear();
         
         verifyDtypeColumnEntriesAndMapping(em, "BaseClass", 4, BaseClass.class);
@@ -132,7 +141,7 @@ public class TestDefaultInheritanceStrat
 
         verifyInheritanceQueryResult(em, "BaseClass", 
             classArray(BaseClass.class), 0, 1, 2, 3);
-        
+
         em.close();
     }
 
@@ -207,7 +216,24 @@ public class TestDefaultInheritanceStrat
         em.persist(mc);
         em.persist(b2);
         em.getTransaction().commit();
-        
+
+        // test entity type discriminator queries for polymorphic results
+        em.clear();
+        String query = "select a from BaseClass2 a where TYPE(a) = MidClass";
+        List rs = em.createQuery(query).getResultList();
+        for (int i = 0; i < rs.size(); i++)
+        assertTrue(rs.get(i) instanceof MidClass);
+
+        query = "select a from BaseClass2 a where TYPE(a) = SubclassE";
+        rs = em.createQuery(query).getResultList();
+        for (int i = 0; i < rs.size(); i++)
+            assertTrue(rs.get(i) instanceof SubclassE);   
+
+        query = "select a from BaseClass2 a where TYPE(a) = BaseClass2";
+        rs = em.createQuery(query).getResultList();
+        for (int i = 0; i < rs.size(); i++)
+            assertTrue(rs.get(i) instanceof BaseClass2);
+
         em.clear();
 
         // Verify that baseclass2 contains a discriminator column

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/TestFindAbstractClass.java Sat Jun 12 14:05:43 2010
@@ -18,7 +18,10 @@
  */
 package org.apache.openjpa.persistence.inheritance;
 
+import java.util.List;
+
 import javax.persistence.EntityManager;
+import javax.persistence.InheritanceType;
 
 import junit.textui.TestRunner;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
@@ -33,7 +36,7 @@ public class TestFindAbstractClass
     extends SingleEMFTestCase {
 
     public void setUp() {
-        setUp(AbstractBase.class, ConcreteSubclass.class);
+        setUp(AbstractBase.class, ConcreteSubclass.class, CLEAR_TABLES);
 
         ConcreteSubclass e = new ConcreteSubclass();
         e.setId("id");
@@ -46,6 +49,16 @@ public class TestFindAbstractClass
         em.close();
     }
 
+    public void testEntityTypeInheritanceTypeJoined() {
+        EntityManager em = emf.createEntityManager();
+        String query = "select c from AbstractBase c where TYPE(c) = ConcreteSubclass";
+        List rs = em.createQuery(query).getResultList();
+        assertTrue(rs.get(0) instanceof ConcreteSubclass);
+        query = "select c from AbstractBase c";
+        rs = em.createQuery(query).getResultList();
+        assertTrue(rs.get(0) instanceof ConcreteSubclass);
+    }
+
     public void testFind() {
         EntityManager em = emf.createEntityManager();
         AbstractBase e = em.find(AbstractBase.class, "id");

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/abstractjoinedappid/TestAbstractJoinedAppId.java Sat Jun 12 14:05:43 2010
@@ -20,6 +20,8 @@ package org.apache.openjpa.persistence.i
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
+
 import javax.persistence.EntityManager;
 
 import junit.textui.TestRunner;
@@ -52,6 +54,20 @@ public class TestAbstractJoinedAppId
         em.close();
     }
 
+    public void testEntityTypeForAbstractJoined() {
+        EntityManager em = emf.createEntityManager();
+        String query = "select s from RelationOwner r join r.supers s where TYPE(s) = Subclass";
+        List rs = em.createQuery(query).getResultList();
+        assertTrue(rs.size() > 0);
+        for (int i = 0; i < rs.size(); i++)
+            assertTrue(rs.get(i) instanceof Subclass);
+        query = "select s from Superclass s where TYPE(s) = Subclass";
+        rs = em.createQuery(query).getResultList();
+        assertTrue(rs.size() > 0);
+        for (int i = 0; i < rs.size(); i++)
+            assertTrue(rs.get(i) instanceof Subclass);
+    }
+
     public void testTraverseRelation() {
         EntityManager em = emf.createEntityManager();
         RelationOwner ro = em.find(RelationOwner.class, 1);

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/TestInheritanceTypeJoinedQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/TestInheritanceTypeJoinedQuery.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/TestInheritanceTypeJoinedQuery.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/TestInheritanceTypeJoinedQuery.java Sat Jun 12 14:05:43 2010
@@ -18,11 +18,14 @@
  */
 package org.apache.openjpa.persistence.inheritance.jointable;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
+import org.apache.openjpa.persistence.ArgumentException;
 import org.apache.openjpa.persistence.test.SQLListenerTestCase;
 
 
@@ -50,6 +53,37 @@ public class TestInheritanceTypeJoinedQu
         em.close();
     }
 
+    public void testInheritanceJoinedTypeOperator() {
+        EntityManager em = emf.createEntityManager();
+        Query q = null;
+        String qS = null;
+        qS = "SELECT p FROM Person p where TYPE(p) = Contractor";
+        q = em.createQuery(qS); 
+        List rs = q.getResultList();
+        assertEquals(3, rs.size());
+        for (int i = 0; i < rs.size(); i++)
+            assertTrue(rs.get(i) instanceof Contractor);
+        qS = "select p from Person p where TYPE(p) in (?1) order by p.name";
+        q = em.createQuery(qS).setParameter(1, Contractor.class);
+        rs = q.getResultList();
+        assertEquals(3, rs.size());
+        for (int i = 0; i < rs.size(); i++)
+            assertTrue(rs.get(i) instanceof Contractor);
+
+        qS = "select p from Person p where TYPE(p) in ?1 order by p.name";
+        Collection<Class<?>> params = new ArrayList<Class<?>>(2);
+        params.add(Contractor.class);
+        params.add(Employee.class);
+        try {
+            q = em.createQuery(qS).setParameter(1, params);
+            rs = q.getResultList();
+        } catch (ArgumentException e) {
+            // as expected
+            //System.out.println(e.getMessage());
+        }
+        
+    }
+
     public void testInheritanceTypeJoinedQuery() {
         EntityManager em = emf.createEntityManager();
         Query q = null;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java Sat Jun 12 14:05:43 2010
@@ -18,8 +18,11 @@
  */
 package org.apache.openjpa.persistence.inheritance.mappedsuperclass;
 
+import java.util.List;
+
 import javax.persistence.EntityManager;
 
+import org.apache.openjpa.persistence.ArgumentException;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
 
 /**
@@ -34,16 +37,38 @@ public class TestMappedSuperClass extend
 
     public void setUp() {
         setUp(CashBaseEntity.class, 
-              SituationDA.class, ValuableItemDA.class);
+              SituationDA.class, ValuableItemDA.class, CLEAR_TABLES);
     }
 
     public void testMappedSuperClass() {
         EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
-        SituationDA s = new SituationDA();
-        s.setCashBoxPeriodSerial("test");
-        s.setType((short)1);
-        em.persist(s);
+        for (int i = 0; i < 3; i++) {
+            SituationDA s = new SituationDA();
+            s.setCashBoxPeriodSerial("test");
+            s.setType((short) (i+1));
+            em.persist(s);
+        }
+        for (int i = 0; i < 3; i++) {
+            ValuableItemDA v = new ValuableItemDA();
+            v.setCode((short)(10+i));
+            em.persist(v);
+        }
         em.getTransaction().commit();
+        
+        em.clear();
+
+        // test polymorphic queries
+        String query = "select s from CashBaseEntity s where TYPE(s) = SituationDA";
+        List rs = em.createQuery(query).getResultList();
+        for (int i = 0; i < rs.size(); i++)
+            assertTrue(rs.get(i) instanceof SituationDA);
+        
+        query = "select s from CashBaseEntity s where TYPE(s) <> ValuableItemDA";
+        try {
+            rs = em.createQuery(query).getResultList();
+        } catch (ArgumentException e) {
+            // as expected
+        }
     }
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java Sat Jun 12 14:05:43 2010
@@ -18,8 +18,11 @@
  */
 package org.apache.openjpa.persistence.inheritance.polymorphic;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
+import org.apache.openjpa.persistence.ArgumentException;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
 
@@ -60,51 +63,56 @@ public class TestTablePerClassInheritanc
         		EnglishParagraph.class, FrenchParagraph.class, 
         		GermanParagraph.class, Translatable.class);
     }
-    
+
+    public void populate() {
+        OpenJPAEntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        /**
+         * Aggregate query operations can not be performed on unjoined 
+         * subclasses. Hence all concrete subclasses of abstract base
+         * class is counted separately to count all Translatable instances.
+         */
+        
+        EnglishParagraph english = new EnglishParagraph();
+        FrenchParagraph french   = new FrenchParagraph();
+        GermanParagraph german   = new GermanParagraph();
+        
+        Translation translation1 = new Translation(); 
+        Translation translation2 = new Translation(); 
+        Translation translation3 = new Translation(); 
+        Translation translation4 = new Translation(); 
+        
+        english.setContent("Hello");
+        french.setContent("Bon jour");
+        german.setContent("Guten Tag");
+
+        
+        translation1.setTranslatable(english);
+        translation2.setTranslatable(english);
+        translation3.setTranslatable(french);
+        translation4.setTranslatable(german);
+        
+        english.addTranslation(translation1);
+        english.addTranslation(translation2);
+        french.addTranslation(translation3);
+        german.addTranslation(translation4);
+        
+        em.persist(translation1);
+        em.persist(translation2);
+        em.persist(translation3);
+        em.persist(translation4);
+        em.getTransaction().commit();
+        em.close();
+    }
+
 	@SuppressWarnings("unchecked")
     public void testConsistency() {
-		OpenJPAEntityManager em = emf.createEntityManager();
-		em.getTransaction().begin();
-		/**
-		 * Aggregate query operations can not be performed on unjoined 
-		 * subclasses. Hence all concrete subclasses of abstract base
-         * class is counted separately to count all Translatable instances.
-		 */
-		int nTranslatableBefore = count(UNJOINED_SUBCLASSES);
-		int nTranslationBefore = count(Translation.class);
-		
-		EnglishParagraph english = new EnglishParagraph();
-		FrenchParagraph french   = new FrenchParagraph();
-		GermanParagraph german   = new GermanParagraph();
-		
-		Translation translation1 = new Translation(); 
-		Translation translation2 = new Translation(); 
-		Translation translation3 = new Translation(); 
-		Translation translation4 = new Translation(); 
-		
-		english.setContent("Hello");
-		french.setContent("Bon jour");
-		german.setContent("Guten Tag");
+        OpenJPAEntityManager em = emf.createEntityManager();
 
-		
-		translation1.setTranslatable(english);
-		translation2.setTranslatable(english);
-		translation3.setTranslatable(french);
-		translation4.setTranslatable(german);
-		
-		english.addTranslation(translation1);
-		english.addTranslation(translation2);
-		french.addTranslation(translation3);
-		german.addTranslation(translation4);
-		
-		em.persist(translation1);
-		em.persist(translation2);
-		em.persist(translation3);
-		em.persist(translation4);
-		em.getTransaction().commit();
-		
-		em.clear();
+        int nTranslatableBefore = count(UNJOINED_SUBCLASSES);
+        int nTranslationBefore = count(Translation.class);
 
+        populate();
 		int nTranslatableAfter = count(UNJOINED_SUBCLASSES);
 		int nTranslationAfter  = count(Translation.class);
 		
@@ -152,5 +160,61 @@ public class TestTablePerClassInheritanc
 		}
 		return total;
 	}
-	
+
+    public void testEntityTypeForTablePerClassInheritance() {
+        populate();
+        OpenJPAEntityManager em = emf.createEntityManager();
+        String query = "select tr from Translatable tr join tr.translations t where " +
+                "TYPE(tr) = EnglishParagraph";
+        List rs = em.createQuery(query).getResultList();
+        assertEquals(2, rs.size());
+        for (int i=0; i < rs.size(); i++)
+            assertTrue(rs.get(i) instanceof EnglishParagraph);
+        
+        query = "select distinct tr from Translatable tr join tr.translations t where " +
+            "TYPE(tr) = EnglishParagraph or TYPE(tr) = FrenchParagraph";
+        rs = em.createQuery(query).getResultList();
+        assertEquals(2, rs.size());
+        for (int i=0; i < rs.size(); i++)
+            assertTrue(!(rs.get(i) instanceof GermanParagraph));
+        
+        query = "select distinct tr from Translatable tr join tr.translations t where " +
+            "TYPE(tr) in (?1, ?2)";
+        try {
+            rs = em.createQuery(query).setParameter(1, EnglishParagraph.class).
+            setParameter(2, FrenchParagraph.class).getResultList();
+        } catch(ArgumentException e) {
+            // as expected
+            //System.out.println(e.getMessage());
+        }
+        
+        query = "select tr from Translatable tr join tr.translations t where " +
+            "TYPE(tr) <> EnglishParagraph";
+        try {
+            rs = em.createQuery(query).getResultList();
+        } catch(ArgumentException e) {
+            // as expected
+            //System.out.println(e.getMessage());
+        }
+
+        String query1 = "select t from Translation t where TYPE(t.translatable) = EnglishParagraph";
+        try {
+            rs = em.createQuery(query1).getResultList();
+        } catch(ArgumentException e) {
+            // as expected
+            //System.out.println(e.getMessage());
+        }
+
+        query1 = "select tr from Translatable tr join tr.translations t where " +
+                "TYPE(tr) in ?1";
+        Collection<Class <?>> params = new ArrayList(2);
+        params.add(EnglishParagraph.class);
+        params.add(FrenchParagraph.class);
+        try {
+            rs = em.createQuery(query).setParameter(1, params).getResultList();
+        } catch(ArgumentException e) {
+            // as expected
+            //System.out.println("e.getMessages()");
+        }
+    }
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java?rev=954007&r1=954006&r2=954007&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java Sat Jun 12 14:05:43 2010
@@ -71,6 +71,19 @@ public class TestEntityTypeExpression ex
         endEm(em);
     }
 
+    public void testTypeOnNonPolymorphicEntity() {
+        EntityManager em = currentEntityManager();
+        String query = "select a from Address a where type(a) = ?1";
+        List rs = null;
+        try {
+            rs =  em.createQuery(query).setParameter(1, Address.class).getResultList();
+            System.out.println("rs size="+rs.size());
+        } catch(Exception e) {
+            // as expected
+            //System.out.println(e.getMessage());
+        }
+    }
+
     @SuppressWarnings("unchecked")
     public void testTypeExpression() {
         EntityManager em = currentEntityManager();