Add support for Postgres range partition DDL plus refactor xsd definitions that had got out of sync (#1465)

* Add partition meta mapping

* Fix to allow schema prefix on select dynamic formula

* Add partition meta mapping

* Migration XSD Update

* Fix to allow schema prefix on select dynamic formula

* Bump ebean-migration to 11.8.1
This commit is contained in:
Rob Bygrave
2018-08-08 23:29:29 +12:00
committed by GitHub
parent c9497fd654
commit ded7d44974
46 changed files with 639 additions and 290 deletions
@@ -7,6 +7,7 @@ import io.ebean.SqlUpdate;
import io.ebean.Transaction;
import io.ebean.ValuePair;
import io.ebean.annotation.DocStoreMode;
import io.ebean.annotation.PartitionMode;
import io.ebean.bean.BeanCollection;
import io.ebean.bean.EntityBean;
import io.ebean.bean.EntityBeanIntercept;
@@ -204,6 +205,8 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType {
private final String draftTable;
private final PartitionMeta partitionMeta;
/**
* DB table comment.
*/
@@ -482,6 +485,7 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType {
this.baseTableVersionsBetween = deploy.getBaseTableVersionsBetween();
this.dependentTables = deploy.getDependentTables();
this.dbComment = deploy.getDbComment();
this.partitionMeta = deploy.getPartitionMeta();
this.autoTunable = EntityType.ORM == entityType && (beanFinder == null);
// helper object used to derive lists of properties
@@ -2816,6 +2820,20 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType {
return dbComment;
}
/**
* Return true if foreign keys to the base table should be suppressed.
*/
public boolean suppressForeignKey() {
return partitionMeta != null;
}
/**
* Return the partition details of the bean.
*/
public PartitionMeta getPartitionMeta() {
return partitionMeta;
}
/**
* Return the dependent tables for a view based entity.
* <p>
@@ -3160,7 +3178,7 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType {
public boolean hasIdPropertyOnly(EntityBeanIntercept ebi) {
return ebi.hasIdOnly(idPropertyIndex);
}
public boolean isIdLoaded(EntityBeanIntercept ebi) {
return ebi.isLoadedProperty(idPropertyIndex);
}
@@ -0,0 +1,27 @@
package io.ebeaninternal.server.deploy;
import io.ebean.annotation.PartitionMode;
public class PartitionMeta {
private final PartitionMode mode;
private String property;
public PartitionMeta(PartitionMode mode, String property) {
this.mode = mode;
this.property = property;
}
public PartitionMode getMode() {
return mode;
}
public String getProperty() {
return property;
}
public void setProperty(String dbColumn) {
this.property = dbColumn;
}
}
@@ -3,6 +3,7 @@ package io.ebeaninternal.server.deploy.meta;
import io.ebean.annotation.Cache;
import io.ebean.annotation.DocStore;
import io.ebean.annotation.DocStoreMode;
import io.ebean.annotation.PartitionMode;
import io.ebean.config.ServerConfig;
import io.ebean.config.TableName;
import io.ebean.config.dbplatform.IdType;
@@ -27,6 +28,7 @@ import io.ebeaninternal.server.deploy.ChainedBeanQueryAdapter;
import io.ebeaninternal.server.deploy.DeployPropertyParserMap;
import io.ebeaninternal.server.deploy.IndexDefinition;
import io.ebeaninternal.server.deploy.InheritInfo;
import io.ebeaninternal.server.deploy.PartitionMeta;
import io.ebeaninternal.server.deploy.TableJoin;
import io.ebeaninternal.server.deploy.parse.DeployBeanInfo;
import io.ebeaninternal.server.idgen.UuidV1IdGenerator;
@@ -193,6 +195,8 @@ public class DeployBeanDescriptor<T> {
private String dbComment;
private PartitionMeta partitionMeta;
/**
* One of NONE, INDEX or EMBEDDED.
*/
@@ -305,6 +309,20 @@ public class DeployBeanDescriptor<T> {
return dbComment;
}
public void setPartitionMeta(PartitionMeta partitionMeta) {
this.partitionMeta = partitionMeta;
}
public PartitionMeta getPartitionMeta() {
if (partitionMeta != null) {
DeployBeanProperty beanProperty = getBeanProperty(partitionMeta.getProperty());
if (beanProperty != null) {
partitionMeta.setProperty(beanProperty.getDbColumn());
}
}
return partitionMeta;
}
public void setDraftable() {
draftable = true;
}
@@ -2,6 +2,7 @@ package io.ebeaninternal.server.deploy.parse;
import io.ebean.annotation.Cache;
import io.ebean.annotation.DbComment;
import io.ebean.annotation.DbPartition;
import io.ebean.annotation.DocStore;
import io.ebean.annotation.Draftable;
import io.ebean.annotation.DraftableElement;
@@ -16,6 +17,7 @@ import io.ebean.util.AnnotationUtil;
import io.ebeaninternal.server.deploy.BeanDescriptor.EntityType;
import io.ebeaninternal.server.deploy.IndexDefinition;
import io.ebeaninternal.server.deploy.InheritInfo;
import io.ebeaninternal.server.deploy.PartitionMeta;
import io.ebeaninternal.server.deploy.meta.DeployBeanProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -152,6 +154,11 @@ public class AnnotationClass extends AnnotationParser {
}
}
DbPartition partition = AnnotationUtil.findAnnotationRecursive(cls, DbPartition.class);
if (partition != null) {
descriptor.setPartitionMeta(new PartitionMeta(partition.mode(), partition.property()));
}
Draftable draftable = AnnotationUtil.findAnnotationRecursive(cls, Draftable.class);
if (draftable != null) {
descriptor.setDraftable();
@@ -412,7 +412,13 @@ public final class SqlTreeBuilder {
if (!selectProps.containsProperty(baseName)) {
STreeProperty p = desc.findPropertyWithDynamic(baseName);
if (p == null) {
logger.error("property [" + propName + "] not found on " + desc + " for query - excluding it.");
// maybe dynamic formula with schema prefix
p = desc.findPropertyWithDynamic(propName);
if (p != null) {
selectProps.add(p);
} else {
logger.error("property [" + propName + "] not found on " + desc + " for query - excluding it.");
}
} else if (p.isEmbedded()) {
// add the embedded bean (and effectively