[jboss-cvs] JBossAS SVN: r59602 - in trunk/server/src/main/org/jboss/ejb/plugins/cmp: jdbc and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Jan 12 09:25:36 EST 2007


Author: alex.loubyansky at jboss.com
Date: 2007-01-12 09:25:32 -0500 (Fri, 12 Jan 2007)
New Revision: 59602

Modified:
   trunk/server/src/main/org/jboss/ejb/plugins/cmp/bridge/CMPFieldBridge.java
   trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java
   trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMPFieldBridge.java
   trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMPFieldBridge2.java
Log:
JBAS-3975 support value classes in EJBQLToSQL92Compiler

Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/bridge/CMPFieldBridge.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/bridge/CMPFieldBridge.java	2007-01-12 14:24:18 UTC (rev 59601)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/bridge/CMPFieldBridge.java	2007-01-12 14:25:32 UTC (rev 59602)
@@ -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: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java	2007-01-12 14:24:18 UTC (rev 59601)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java	2007-01-12 14:25:32 UTC (rev 59602)
@@ -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;
 
@@ -916,7 +918,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)
@@ -1184,18 +1240,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: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMPFieldBridge.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMPFieldBridge.java	2007-01-12 14:24:18 UTC (rev 59601)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMPFieldBridge.java	2007-01-12 14:25:32 UTC (rev 59602)
@@ -27,7 +27,6 @@
 import java.sql.ResultSet;
 
 import org.jboss.ejb.plugins.cmp.bridge.CMPFieldBridge;
-import org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager;
 import org.jboss.ejb.plugins.cmp.jdbc.LockingStrategy;
 import org.jboss.ejb.EntityEnterpriseContext;
 
@@ -48,7 +47,7 @@
  *
  * @version $Revision$
  */
-public interface JDBCCMPFieldBridge extends JDBCFieldBridge, CMPFieldBridge
+public interface JDBCCMPFieldBridge extends CMPFieldBridge
 {
    /**
     * The index of the field among the table fields.

Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMPFieldBridge2.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMPFieldBridge2.java	2007-01-12 14:24:18 UTC (rev 59601)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMPFieldBridge2.java	2007-01-12 14:25:32 UTC (rev 59602)
@@ -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