mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
254 lines
5.4 KiB
Java
254 lines
5.4 KiB
Java
package io.ebeaninternal.server.deploy.parse;
|
|
|
|
import io.ebeaninternal.server.deploy.InheritInfo;
|
|
|
|
import javax.persistence.DiscriminatorType;
|
|
import java.sql.Types;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Represents a node in the Inheritance tree.
|
|
* Holds information regarding Super Subclass support.
|
|
*/
|
|
public class DeployInheritInfo {
|
|
|
|
/**
|
|
* the default discriminator column according to the JPA 1.0 spec.
|
|
*/
|
|
private static final String DEFAULT_COLUMN_NAME = "dtype";
|
|
|
|
private String discriminatorStringValue;
|
|
private Object discriminatorObjectValue;
|
|
|
|
private int columnType;
|
|
private String columnName;
|
|
private int columnLength;
|
|
private String columnDefn;
|
|
|
|
private final Class<?> type;
|
|
|
|
private Class<?> parent;
|
|
|
|
private final ArrayList<DeployInheritInfo> children = new ArrayList<>();
|
|
|
|
/**
|
|
* Create for a given type.
|
|
*/
|
|
DeployInheritInfo(Class<?> type) {
|
|
this.type = type;
|
|
}
|
|
|
|
/**
|
|
* return the type.
|
|
*/
|
|
public Class<?> getType() {
|
|
return type;
|
|
}
|
|
|
|
/**
|
|
* Return the type of the root object.
|
|
*/
|
|
public Class<?> getParent() {
|
|
return parent;
|
|
}
|
|
|
|
/**
|
|
* Set the type of the root object.
|
|
*/
|
|
public void setParent(Class<?> parent) {
|
|
this.parent = parent;
|
|
}
|
|
|
|
/**
|
|
* Return true if this is abstract node.
|
|
*/
|
|
public boolean isAbstract() {
|
|
return (discriminatorObjectValue == null);
|
|
}
|
|
|
|
/**
|
|
* Return true if this is the root node.
|
|
*/
|
|
public boolean isRoot() {
|
|
return parent == null;
|
|
}
|
|
|
|
/**
|
|
* Return the child nodes.
|
|
*/
|
|
public List<DeployInheritInfo> children() {
|
|
return children;
|
|
}
|
|
|
|
/**
|
|
* Add a child node.
|
|
*/
|
|
public void addChild(DeployInheritInfo childInfo) {
|
|
children.add(childInfo);
|
|
}
|
|
|
|
/**
|
|
* Return the column name of the discriminator.
|
|
*/
|
|
public String getColumnName(InheritInfo parent) {
|
|
if (columnName == null) {
|
|
if (parent == null) {
|
|
columnName = DEFAULT_COLUMN_NAME;
|
|
} else {
|
|
columnName = parent.getDiscriminatorColumn();
|
|
}
|
|
}
|
|
return columnName;
|
|
}
|
|
|
|
/**
|
|
* Set the column name of the discriminator.
|
|
*/
|
|
public void setColumnName(String columnName) {
|
|
this.columnName = columnName;
|
|
}
|
|
|
|
public int getColumnLength(InheritInfo parent) {
|
|
if (columnLength == 0) {
|
|
if (parent == null) {
|
|
columnLength = 10;
|
|
} else {
|
|
columnLength = parent.getColumnLength();
|
|
}
|
|
}
|
|
return columnLength;
|
|
}
|
|
|
|
/**
|
|
* Return the sql type of the discriminator value.
|
|
*/
|
|
public int getDiscriminatorType(InheritInfo parent) {
|
|
if (columnType == 0) {
|
|
if (parent == null) {
|
|
columnType = Types.VARCHAR;
|
|
} else {
|
|
columnType = parent.getDiscriminatorType();
|
|
}
|
|
}
|
|
return columnType;
|
|
}
|
|
|
|
/**
|
|
* Set the sql type of the discriminator.
|
|
*/
|
|
public void setColumnType(DiscriminatorType type) {
|
|
if (type.equals(DiscriminatorType.INTEGER)) {
|
|
this.columnType = Types.INTEGER;
|
|
} else {
|
|
this.columnType = Types.VARCHAR;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set explicit column definition (ddl).
|
|
*/
|
|
void setColumnDefn(String columnDefn) {
|
|
this.columnDefn = columnDefn;
|
|
}
|
|
|
|
/**
|
|
* Return the explicit column definition.
|
|
*/
|
|
public String getColumnDefn() {
|
|
return columnDefn;
|
|
}
|
|
|
|
/**
|
|
* Set the length of the discriminator column.
|
|
*/
|
|
void setColumnLength(int columnLength) {
|
|
this.columnLength = columnLength;
|
|
}
|
|
|
|
/**
|
|
* Return the discriminator value for this node.
|
|
*/
|
|
public Object getDiscriminatorObjectValue() {
|
|
return discriminatorObjectValue;
|
|
}
|
|
|
|
public String getDiscriminatorStringValue() {
|
|
return discriminatorStringValue;
|
|
}
|
|
|
|
/**
|
|
* Set the discriminator value for this node.
|
|
*/
|
|
void setDiscriminatorValue(String value) {
|
|
if (value != null) {
|
|
value = value.trim();
|
|
if (!value.isEmpty()) {
|
|
discriminatorStringValue = value;
|
|
// convert the value if desired
|
|
if (columnType == Types.INTEGER) {
|
|
this.discriminatorObjectValue = Integer.valueOf(value);
|
|
} else {
|
|
this.discriminatorObjectValue = value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public String getWhere() {
|
|
|
|
List<Object> discList = new ArrayList<>();
|
|
|
|
appendDiscriminator(discList);
|
|
|
|
return buildWhereLiteral(discList);
|
|
}
|
|
|
|
private void appendDiscriminator(List<Object> list) {
|
|
if (discriminatorObjectValue != null) {
|
|
list.add(discriminatorObjectValue);
|
|
}
|
|
for (DeployInheritInfo child : children) {
|
|
child.appendDiscriminator(list);
|
|
}
|
|
}
|
|
|
|
private String buildWhereLiteral(List<Object> discList) {
|
|
int size = discList.size();
|
|
if (size == 0) {
|
|
return "";
|
|
}
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append(columnName);
|
|
if (size == 1) {
|
|
sb.append(" = ");
|
|
} else {
|
|
sb.append(" in (");
|
|
}
|
|
for (int i = 0; i < discList.size(); i++) {
|
|
appendSqlLiteralValue(i, discList.get(i), sb);
|
|
}
|
|
if (size > 1) {
|
|
sb.append(")");
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
private void appendSqlLiteralValue(int count, Object value, StringBuilder sb) {
|
|
if (count > 0) {
|
|
sb.append(",");
|
|
}
|
|
if (value instanceof String) {
|
|
sb.append("'").append(value).append("'");
|
|
} else {
|
|
sb.append(value);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "InheritInfo[" + type.getName() + "]" + " root[" + parent.getName() + "]" + " disValue[" + discriminatorStringValue + "]";
|
|
}
|
|
|
|
}
|