gdamour     2005/07/03 06:08:39

  Modified:    modules/openejb-builder/src/java/org/openejb/deployment
                        CMPContainerBuilder.java CMPEntityBuilder.java
  Log:

  GERONIMO 665 - CMR pre-fetching.
  
  Pre-fetching works for CMP, CMP fields, CMR fields, finders and selects.
  
  Revision  Changes    Path
  1.21      +17 -15    
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java
  
  Index: CMPContainerBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPContainerBuilder.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- CMPContainerBuilder.java  22 Jun 2005 11:27:21 -0000      1.20
  +++ CMPContainerBuilder.java  3 Jul 2005 10:08:39 -0000       1.21
  @@ -234,14 +234,15 @@
           IdentityTransform remoteProxyTransform = new 
RemoteProxyTransform(primaryKeyTransform, proxyFactory);
   
           List attributes = ejb.getAttributes();
  -        EmptySlotLoader[] slotLoaders = new 
EmptySlotLoader[attributes.size()];
  -        String[] attributeNames = new String[attributes.size()];
  -        for (int i = 0; i < attributes.size(); i++) {
  -            Attribute attr = (Attribute) attributes.get(i);
  +        List pkAttributes = ejb.getPrimaryKeyFields();
  +        EmptySlotLoader[] slotLoaders = new 
EmptySlotLoader[pkAttributes.size()];
  +        String[] attributeNames = new String[pkAttributes.size()];
  +        for (int i = 0; i < pkAttributes.size(); i++) {
  +            Attribute attr = (Attribute) pkAttributes.get(i);
               attributeNames[i] = attr.getName();
  -            slotLoaders[i] = new EmptySlotLoader(i, new FieldAccessor(i, 
attr.getType()));
  +            slotLoaders[i] = new EmptySlotLoader(attributes.indexOf(attr), 
new FieldAccessor(i, attr.getType()));
           }
  -        QueryCommand loadCommand = queryBuilder.buildLoad(getEJBName(), 
attributeNames);
  +        QueryCommand loadCommand = 
queryBuilder.buildLoadEntity(getEJBName(), attributeNames);
           FaultHandler faultHandler = new QueryFaultHandler(loadCommand, 
identityDefiner, slotLoaders);
   
           // EJB QL queries
  @@ -269,7 +270,8 @@
           }
   
           // build the instance factory
  -        LinkedHashMap cmrFieldAccessors[] = 
createCMRFieldAccessors(queryBuilder);
  +        LinkedHashMap cmrFieldAccessors[] = 
createCMRFieldAccessors(queryBuilder, true);
  +        LinkedHashMap cmrNoPrefetchFieldAccessors[] = 
createCMRFieldAccessors(queryBuilder, false);
           LinkedHashMap cmpFieldAccessors = 
createCMPFieldAccessors(queryBuilder, cmrFieldAccessors[0]);
           Map selects = queryBuilder.buildSelects(ejb.getName());
           Map instanceMap = null;
  @@ -290,7 +292,7 @@
           }
   
           // build the vop table
  -        LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable, 
cmrFieldAccessors[1], cmp1Bridge, identityDefiner, 
ejb.getPrimaryKeyGeneratorDelegate(), primaryKeyTransform, localProxyTransform, 
remoteProxyTransform, finders);
  +        LinkedHashMap vopMap = buildVopMap(beanClass, cacheTable, 
cmrNoPrefetchFieldAccessors[1], cmp1Bridge, identityDefiner, 
ejb.getPrimaryKeyGeneratorDelegate(), primaryKeyTransform, localProxyTransform, 
remoteProxyTransform, finders);
   
           InterfaceMethodSignature[] signatures = (InterfaceMethodSignature[]) 
vopMap.keySet().toArray(new InterfaceMethodSignature[vopMap.size()]);
           VirtualOperation[] vtable = (VirtualOperation[]) 
vopMap.values().toArray(new VirtualOperation[vopMap.size()]);
  @@ -350,7 +352,7 @@
                   accessor = new ReadOnlyCMPFieldAccessor(accessor, 
attribute.getName());
               }  else {
                   IdentityDefiner identityDefiner = 
identityDefinerBuilder.getIdentityDefiner(ejb);
  -                QueryCommand command = 
queryBuilder.buildLoadWithPrefetch(ejb.getName(), name);
  +                QueryCommand command = 
queryBuilder.buildLoadAttribute(ejb.getName(), name, true);
                   FieldTransform attAccessor = 
command.getQuery().getResultAccessors()[0];
                   EmptySlotLoader[] loaders = new EmptySlotLoader[] {new 
EmptySlotLoader(i, attAccessor)};
                   FaultHandler faultHandler = new QueryFaultHandler(command, 
identityDefiner, loaders);
  @@ -363,7 +365,7 @@
           return cmpFieldAccessors;
       }
   
  -    private LinkedHashMap[] createCMRFieldAccessors(SQLQueryBuilder 
queryBuilder) throws QueryException {
  +    private LinkedHashMap[] createCMRFieldAccessors(SQLQueryBuilder 
queryBuilder, boolean prefetch) throws QueryException {
           IdentityDefinerBuilder identityDefinerBuilder = new 
IdentityDefinerBuilder(ejbSchema, globalSchema);
           IdentityDefiner identityDefiner = 
identityDefinerBuilder.getIdentityDefiner(ejb);
   
  @@ -382,13 +384,13 @@
   
               CMPFieldTransform accessor = new CMPFieldAccessor(new 
CacheRowAccessor(i, null), name);
   
  -            FaultHandler faultHandler = buildFaultHandler(queryBuilder, ejb, 
field, i);
  +            FaultHandler faultHandler = buildFaultHandler(queryBuilder, ejb, 
field, i, prefetch);
               accessor = new CMPFieldFaultTransform(accessor, faultHandler, 
new int[]{i});
   
               cmrFaultAccessors.put(name, accessor);
               
               int relatedIndex = relatedEJB.getAttributes().size() + 
relatedEJB.getAssociationEnds().indexOf(relatedField);
  -            FaultHandler relatedFaultHandler = 
buildFaultHandler(queryBuilder, relatedEJB, relatedField, relatedIndex);
  +            FaultHandler relatedFaultHandler = 
buildFaultHandler(queryBuilder, relatedEJB, relatedField, relatedIndex, 
prefetch);
               CMPFieldTransform relatedAccessor = new CMPFieldAccessor(new 
CacheRowAccessor(relatedIndex, null), name);
               relatedAccessor = new CMPFieldFaultTransform(relatedAccessor, 
relatedFaultHandler, new int[]{relatedIndex});
               if ( association.isOneToOne() ) {
  @@ -419,7 +421,7 @@
           return new LinkedHashMap[] {cmrFaultAccessors, cmrFieldAccessors};
       }
   
  -    private FaultHandler buildFaultHandler(SQLQueryBuilder queryBuilder, EJB 
definingEJB, CMRField field, int slot) throws QueryException {
  +    private FaultHandler buildFaultHandler(SQLQueryBuilder queryBuilder, EJB 
definingEJB, CMRField field, int slot, boolean prefetch) throws QueryException {
           IdentityDefinerBuilder identityDefinerBuilder = new 
IdentityDefinerBuilder(ejbSchema, globalSchema);
           Association association = field.getAssociation();
           CMRField relatedField = (CMRField) association.getOtherEnd(field);
  @@ -439,7 +441,7 @@
               relatedIdentityDefiner = new DerivedIdentity(relatedCacheTbl, 
slots);
           }
   
  -        QueryCommand faultCommand = 
queryBuilder.buildCMRFaultHandler(definingEJB.getName(), field.getName());
  +        QueryCommand faultCommand = 
queryBuilder.buildLoadAssociationEnd(definingEJB.getName(), field.getName(), 
prefetch);
           if ( association.isOneToOne() || association.isManyToOne(field) ) {
               return new SingleValuedCMRFaultHandler(faultCommand,
                       identityDefiner,
  
  
  
  1.32      +9 -1      
openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java
  
  Index: CMPEntityBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb/modules/openejb-builder/src/java/org/openejb/deployment/CMPEntityBuilder.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- CMPEntityBuilder.java     22 Jun 2005 11:27:21 -0000      1.31
  +++ CMPEntityBuilder.java     3 Jul 2005 10:08:39 -0000       1.32
  @@ -82,6 +82,7 @@
   import org.openejb.xbeans.ejbjar.OpenejbEjbRelationType;
   import org.openejb.xbeans.ejbjar.OpenejbEjbRelationshipRoleType;
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType;
  +import org.openejb.xbeans.ejbjar.OpenejbEntityGroupMappingType;
   import org.openejb.xbeans.ejbjar.OpenejbGroupType;
   import 
org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.AutomaticKeyGeneration;
   import org.openejb.xbeans.ejbjar.OpenejbEntityBeanType.CmpFieldMapping;
  @@ -185,6 +186,12 @@
               
               EJB ejb = ejbSchema.getEJB(ejbName);
               PrefetchGroup prefetchGroup = 
openEJBEntities[i].getPrefetchGroup();
  +            
  +            if (prefetchGroup.isSetEntityGroupMapping()) {
  +                OpenejbEntityGroupMappingType mapping = 
prefetchGroup.getEntityGroupMapping();
  +                ejb.setPrefetchGroup(mapping.getGroupName());
  +            }
  +            
               OpenejbCmpFieldGroupMappingType[] cmpMappings = 
prefetchGroup.getCmpFieldGroupMappingArray();
               for (int j = 0; j < cmpMappings.length; j++) {
                   OpenejbCmpFieldGroupMappingType mapping = cmpMappings[i];
  @@ -195,6 +202,7 @@
                   }
                   cmpField.setPrefetchGroup(mapping.getGroupName());
               }
  +            
               OpenejbCmrFieldGroupMappingType[] cmrMappings = 
prefetchGroup.getCmrFieldGroupMappingArray();
               for (int j = 0; j < cmrMappings.length; j++) {
                   OpenejbCmrFieldGroupMappingType mapping = cmrMappings[i];
  
  
  

Reply via email to