[jboss-cvs] JBossAS SVN: r61737 - in branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp: jdbc and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Mar 27 10:16:36 EDT 2007


Author: alex.loubyansky at jboss.com
Date: 2007-03-27 10:16:36 -0400 (Tue, 27 Mar 2007)
New Revision: 61737

Modified:
   branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/bridge/CMPFieldBridge.java
   branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java
   branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMPFieldBridge2.java
Log:
JBAS-3975

Modified: branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/bridge/CMPFieldBridge.java
===================================================================
--- branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/bridge/CMPFieldBridge.java	2007-03-27 14:07:55 UTC (rev 61736)
+++ branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/bridge/CMPFieldBridge.java	2007-03-27 14:16:36 UTC (rev 61737)
@@ -21,6 +21,8 @@
  */
 package org.jboss.ejb.plugins.cmp.bridge;
 
-public interface CMPFieldBridge extends FieldBridge {
+import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCFieldBridge;
+
+public interface CMPFieldBridge extends JDBCFieldBridge {
    public Class getFieldType();
 }

Modified: branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java
===================================================================
--- branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java	2007-03-27 14:07:55 UTC (rev 61736)
+++ branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java	2007-03-27 14:16:36 UTC (rev 61737)
@@ -34,11 +34,13 @@
 import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCFieldBridge;
 import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractEntityBridge;
 import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMRFieldBridge;
+import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMPFieldBridge;
 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCReadAheadMetaData;
 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCTypeMappingMetaData;
 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCRelationMetaData;
 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCFunctionMappingMetaData;
 import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCQueryMetaData;
+import org.jboss.ejb.plugins.cmp.bridge.CMPFieldBridge;
 import org.jboss.ejb.EntityPersistenceStore;
 import org.jboss.logging.Logger;
 
@@ -903,7 +905,61 @@
 
    public Object visit(ASTValueClassComparison node, Object data)
    {
-      throw new IllegalStateException("Value class comparison is not yet supported.");
+      StringBuffer buf = (StringBuffer) data;
+
+      boolean not = (node.opp.equals(SQLUtil.NOT_EQUAL));
+      String comparison = node.opp;
+      buf.append('(');
+      if(not)
+      {
+         buf.append(SQLUtil.NOT).append('(');
+         comparison = "=";
+      }
+
+      // setup the from path
+      ASTPath fromPath = (ASTPath) node.jjtGetChild(0);
+      addInnerJoinPath(fromPath);
+      String fromAlias = aliasManager.getAlias(fromPath.getPath(fromPath.size() - 2));
+      CMPFieldBridge fromCMPField = (CMPFieldBridge) fromPath.getCMPField();
+
+      Node toNode = node.jjtGetChild(1);
+      if(toNode instanceof ASTParameter)
+      {
+         ASTParameter toParam = (ASTParameter) toNode;
+
+         // can only compare like kind entities
+         Class parameterType = getParameterType(toParam.number);
+         if(!(fromCMPField.getFieldType().equals(parameterType)))
+         {
+            throw new IllegalStateException("Only like types can be " +
+               "compared: from CMP field=" +
+               fromCMPField.getFieldType() +
+               " to parameter=" + parameterType);
+         }
+
+         inputParameters.addAll(QueryParameter.createParameters(toParam.number - 1, fromCMPField));
+         SQLUtil.getWhereClause(fromCMPField.getJDBCType(), fromAlias, comparison, buf);
+      }
+      else
+      {
+         ASTPath toPath = (ASTPath) toNode;
+         addInnerJoinPath(toPath);
+         String toAlias = aliasManager.getAlias(toPath.getPath(toPath.size() - 2));
+         JDBCCMPFieldBridge toCMPField = (JDBCCMPFieldBridge) toPath.getCMPField();
+
+         // can only compare like kind entities
+         if(!(fromCMPField.getFieldType().equals(toCMPField.getFieldType())))
+         {
+            throw new IllegalStateException("Only like types can be " +
+               "compared: from CMP field=" +
+               fromCMPField.getFieldType() +
+               " to CMP field=" + toCMPField.getFieldType());
+         }
+
+         SQLUtil.getSelfCompareWhereClause(fromCMPField, toCMPField, fromAlias, toAlias, comparison, buf);
+      }
+
+      return (not ? buf.append(')') : buf).append(')');
    }
 
    public Object visit(ASTEntityComparison node, Object data)
@@ -1171,18 +1227,24 @@
             + "Should have been handled at a higher level.");
       }
 
+      JDBCFieldBridge cmpField = (JDBCFieldBridge) node.getCMPField();
+
       // make sure this is mapped to a single column
       switch(node.type)
       {
          case EJBQLTypes.ENTITY_TYPE:
          case EJBQLTypes.VALUE_CLASS_TYPE:
+            if(cmpField.getJDBCType().hasMapper() ||
+               cmpField.getJDBCType().getParameterSetter() != null)
+            {
+               break;
+            }
          case EJBQLTypes.UNKNOWN_TYPE:
             throw new IllegalStateException("Can not visit multi-column path " +
                "node. Should have been handled at a higher level.");
       }
 
       addLeftJoinPath(node);
-      JDBCFieldBridge cmpField = (JDBCFieldBridge) node.getCMPField();
       String alias = aliasManager.getAlias(node.getPath(node.size() - 2));
       SQLUtil.getColumnNamesClause(cmpField, alias, buf);
       return data;

Modified: branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMPFieldBridge2.java
===================================================================
--- branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMPFieldBridge2.java	2007-03-27 14:07:55 UTC (rev 61736)
+++ branches/Branch_4_2/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMPFieldBridge2.java	2007-03-27 14:16:36 UTC (rev 61737)
@@ -28,7 +28,6 @@
 import org.jboss.ejb.plugins.cmp.jdbc.JDBCType;
 import org.jboss.ejb.plugins.cmp.jdbc.JDBCEntityPersistenceStore;
 import org.jboss.ejb.plugins.cmp.jdbc.JDBCResultSetReader;
-import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCFieldBridge;
 import org.jboss.ejb.EntityEnterpriseContext;
 import org.jboss.deployment.DeploymentException;
 import org.jboss.logging.Logger;
@@ -44,7 +43,7 @@
  * @version <tt>$Revision$</tt>
  */
 public class JDBCCMPFieldBridge2
-   implements CMPFieldBridge, JDBCFieldBridge
+   implements CMPFieldBridge
 {
    private final JDBCEntityBridge2 entity;
    private final int rowIndex;




More information about the jboss-cvs-commits mailing list