package org.tests.model.family;
import io.ebean.annotation.Formula;
import org.tests.model.basic.EBasic;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import java.util.ArrayList;
import java.util.List;
@Entity
public class ParentPerson extends InheritablePerson {
//This rather complex formulas should be built later by CustomAnnotationParser
private static final String CHILD_PERSON_AGGREGATE_JOIN = "left join "
+ "(select i2.parent_identifier, count(*) as child_count, sum(i2.age) as child_age from child_person i2 group by i2.parent_identifier) "
+ "as f2 on f2.parent_identifier = ${ta}.identifier";
private static final String GRAND_PARENT_PERSON_JOIN = "join grand_parent_person j1 on j1.identifier = ${ta}.parent_identifier";
@ManyToOne(cascade = CascadeType.ALL)
private GrandParentPerson parent;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
@OrderBy("identifier")
private List<ChildPerson> children = new ArrayList<>();
//@Count("children")
@Formula(select = "coalesce(f2.child_count, 0)", join = CHILD_PERSON_AGGREGATE_JOIN)
private Integer childCount;
//@Sum("children.age")
@Formula(select = "coalesce(f2.child_age, 0)", join = CHILD_PERSON_AGGREGATE_JOIN)
private Integer totalAge;
private String familyName;
private String address;
//@Coalesce({ "familyName", "parent.familyName" })
@Formula(select = "coalesce(${ta}.family_name, j1.family_name)", join = GRAND_PARENT_PERSON_JOIN)
private String effectiveFamilyName;
//@Coalesce({ "address", "parent.address" })
@Formula(select = "coalesce(${ta}.address, j1.address)", join = GRAND_PARENT_PERSON_JOIN)
private String effectiveAddress;
@Formula(select = "coalesce(${ta}.some_bean_id, j1.some_bean_id)", join = GRAND_PARENT_PERSON_JOIN)
@ManyToOne
private EBasic effectiveBean;
public GrandParentPerson getParent() {
return parent;
}
public void setParent(GrandParentPerson parent) {
this.parent = parent;
}
public String getFamilyName() {
return familyName;
}
public void setFamilyName(String familyName) {
this.familyName = familyName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<ChildPerson> getChildren() {
return children;
}
public Integer getChildCount() {
return childCount;
}
public Integer getTotalAge() {
return totalAge;
}
public String getEffectiveFamilyName() {
return effectiveFamilyName;
}
public String getEffectiveAddress() {
return effectiveAddress;
}
public EBasic getEffectiveBean() {
return effectiveBean;
}
}