#461 - ENH: Add @Draftable support - optimise publish query

This commit is contained in:
Robin Bygrave
2015-11-24 01:01:37 +13:00
parent 555e5ba6fd
commit 0efbe061ab
3 changed files with 35 additions and 3 deletions
@@ -1,6 +1,7 @@
package com.avaje.ebeaninternal.server.deploy;
import com.avaje.ebean.OrderBy;
import com.avaje.ebean.Query;
import com.avaje.ebean.SqlUpdate;
import com.avaje.ebean.Transaction;
import com.avaje.ebean.ValuePair;
@@ -1941,6 +1942,13 @@ public class BeanDescriptor<T> implements MetaBeanInfo, SpiBeanType<T> {
}
}
/**
* Optimise the draft query fetching any draftable element relationships.
*/
public void draftQueryOptimise(Query<T> query) {
draftHelp.draftQueryOptimise(query);
}
/**
* Return true if this entity bean has history support.
*/
@@ -1,5 +1,6 @@
package com.avaje.ebeaninternal.server.deploy;
import com.avaje.ebean.Query;
import com.avaje.ebean.bean.EntityBean;
/**
@@ -49,4 +50,25 @@ public final class BeanDescriptorDraftHelp<T> {
return liveBean;
}
/**
* Fetch draftable element relationships.
*/
public void draftQueryOptimise(Query<T> query) {
BeanPropertyAssocOne<?>[] one = desc.propertiesOne();
for (int i = 0; i < one.length; i++) {
if (one[i].getTargetDescriptor().isDraftableElement()) {
query.fetch(one[i].getName());
}
}
BeanPropertyAssocMany<?>[] many = desc.propertiesMany();
for (int i = 0; i < many.length; i++) {
if (many[i].getTargetDescriptor().isDraftableElement()) {
query.fetch(many[i].getName());
}
}
}
}
@@ -134,6 +134,7 @@ public final class DefaultPersister implements Persister {
Class<T> beanType = query.getBeanType();
BeanDescriptor<T> desc = server.getBeanDescriptor(beanType);
desc.draftQueryOptimise(query);
List<T> draftBeans = server.findList(query, transaction);
PUB.debug("publish [{}] count[{}]", desc.getName(), draftBeans.size());
@@ -149,9 +150,10 @@ public final class DefaultPersister implements Persister {
}
// fetch existing live beans to update (or insert if missing)
Map<?, T> liveBeans = server.find(beanType)
.where().idIn(idList)
.findMap();
Query<T> liveBeansQuery = server.find(beanType).where().idIn(idList).query();
desc.draftQueryOptimise(liveBeansQuery);
Map<?, T> liveBeans = liveBeansQuery.findMap();
List<T> livePublish = new ArrayList<T>(idList.size());