package org.sculptor.framework.accessapi;
import java.util.Collection;
import java.util.List;
import org.sculptor.framework.domain.LeafProperty;
import org.sculptor.framework.domain.Property;
public class ConditionalCriteria {
Operator operator;
String propertyName;
String propertyAlias;
String[] propertyPath;
String propertyFullName;
Object firstOperant;
Object secondOperant;
Property<?> property;
private ConditionalCriteria(Operator operator, Property<?> property) {
this(operator, property, null, null);
}
private ConditionalCriteria(Operator operator, Property<?> property, Object firstOperant) {
this(operator, property, firstOperant, null);
}
private ConditionalCriteria(Operator operator, Property<?> property, Object firstOperant, Object secondOperant) {
this.property=property;
this.operator=operator;
this.firstOperant=firstOperant;
this.secondOperant=secondOperant;
if (property == null) {
this.propertyFullName=null;
this.propertyName=null;
this.propertyPath=new String[0];
} else {
this.propertyFullName=property instanceof LeafProperty<?>
? ((LeafProperty<?>)property).getEmbeddedName()
: property.getName();
int lastDotPos = propertyFullName.lastIndexOf('.');
if (lastDotPos == -1) {
this.propertyName=propertyFullName;
this.propertyPath=new String[0];
} else {
this.propertyName=propertyFullName.substring(lastDotPos+1);
this.propertyPath=propertyFullName.substring(0, lastDotPos).split("\\.");
}
}
}
public Operator getOperator() {
return operator;
}
public String getPropertyFullName() {
return propertyFullName == null ? null : propertyFullName.replaceAll("#", ".");
}
public String getPropertyName() {
return propertyName == null ? null : propertyName.replaceAll("#", ".");
}
public String[] getPropertyPath() {
return propertyPath;
}
public String getPropertyAlias() {
return propertyAlias;
}
public Object getFirstOperant() {
return firstOperant;
}
public <Y extends Comparable<?>> Y getFirstOperantAs(Class<Y> type) {
return type.cast(firstOperant);
}
public Object getSecondOperant() {
return secondOperant;
}
public <Y extends Comparable<?>> Y getSecondOperantAs(Class<Y> type) {
return type.cast(secondOperant);
}
public ConditionalCriteria withProperty(Property<?> property) {
return new ConditionalCriteria(this.operator, property, firstOperant, secondOperant);
}
public static ConditionalCriteria equal(Property<?> property, Object value) {
return new ConditionalCriteria(Operator.Equal, property, value);
}
public static ConditionalCriteria ignoreCaseEqual(Property<?> property, Object value) {
return new ConditionalCriteria(Operator.IgnoreCaseEqual, property, value);
}
public static ConditionalCriteria lessThan(Property<?> property, Object value) {
return new ConditionalCriteria(Operator.LessThan, property, value);
}
public static ConditionalCriteria lessThanOrEqual(Property<?> property, Object value) {
return new ConditionalCriteria(Operator.LessThanOrEqual, property, value);
}
public static ConditionalCriteria greatThan(Property<?> property, Object value) {
return new ConditionalCriteria(Operator.GreatThan, property, value);
}
public static ConditionalCriteria greatThanOrEqual(Property<?> property, Object value) {
return new ConditionalCriteria(Operator.GreatThanOrEqual, property, value);
}
public static ConditionalCriteria like(Property<?> property, Object value) {
return new ConditionalCriteria(Operator.Like, property, value);
}
public static ConditionalCriteria ignoreCaseLike(Property<?> property, Object value) {
return new ConditionalCriteria(Operator.IgnoreCaseLike, property, value);
}
public static ConditionalCriteria between(Property<?> property, Object lowRange, Object hightRange) {
return new ConditionalCriteria(Operator.Between, property, lowRange, hightRange);
}
public static ConditionalCriteria in(Property<?> property, Object... itemList) {
if (itemList != null && itemList.length == 1 && itemList[0] instanceof Collection<?>) {
return new ConditionalCriteria(Operator.In, property, itemList[0]);
} else {
return new ConditionalCriteria(Operator.In, property, itemList);
}
}
public static ConditionalCriteria isNull(Property<?> property) {
return new ConditionalCriteria(Operator.IsNull, property);
}
public static ConditionalCriteria isNotNull(Property<?> property) {
return new ConditionalCriteria(Operator.IsNotNull, property);
}
public static ConditionalCriteria isEmpty(Property<?> property) {
return new ConditionalCriteria(Operator.IsEmpty, property);
}
public static ConditionalCriteria isNotEmpty(Property<?> property) {
return new ConditionalCriteria(Operator.IsNotEmpty, property);
}
public static ConditionalCriteria not(ConditionalCriteria criteria) {
return new ConditionalCriteria(Operator.Not, null, criteria);
}
public static ConditionalCriteria or(ConditionalCriteria criteriaLeft, ConditionalCriteria criteriaRight) {
return new ConditionalCriteria(Operator.Or, null, criteriaLeft, criteriaRight);
}
public static ConditionalCriteria or(List<ConditionalCriteria> orCriteria) {
return new ConditionalCriteria(Operator.Or, null, orCriteria);
}
public static ConditionalCriteria and(ConditionalCriteria criteriaLeft, ConditionalCriteria criteriaRight) {
return new ConditionalCriteria(Operator.And, null, criteriaLeft, criteriaRight);
}
public static ConditionalCriteria and(List<ConditionalCriteria> andCriteria) {
return new ConditionalCriteria(Operator.And, null, andCriteria);
}
// Property comparators
public static ConditionalCriteria equalProperty(Property<?> propertyLeft, Property<?> propertyRight) {
return new ConditionalCriteria(Operator.EqualProperty, propertyLeft, propertyRight.getName());
}
public static ConditionalCriteria lessThanProperty(Property<?> propertyLeft, Property<?> propertyRight) {
return new ConditionalCriteria(Operator.LessThanProperty, propertyLeft, propertyRight.getName());
}
public static ConditionalCriteria lessThanOrEqualProperty(Property<?> propertyLeft, Property<?> propertyRight) {
return new ConditionalCriteria(Operator.LessThanOrEqualProperty, propertyLeft, propertyRight.getName());
}
public static ConditionalCriteria greatThanProperty(Property<?> propertyLeft, Property<?> propertyRight) {
return new ConditionalCriteria(Operator.GreatThanProperty, propertyLeft, propertyRight.getName());
}
public static ConditionalCriteria greatThanOrEqualProperty(Property<?> propertyLeft, Property<?> propertyRight) {
return new ConditionalCriteria(Operator.GreatThanOrEqualProperty, propertyLeft, propertyRight.getName());
}
public static ConditionalCriteria orderAsc(Property<?> property) {
return new ConditionalCriteria(Operator.OrderAsc, property);
}
public static ConditionalCriteria orderDesc(Property<?> property) {
return new ConditionalCriteria(Operator.OrderDesc, property);
}
public static ConditionalCriteria fetchEager(Property<?> property) {
return new ConditionalCriteria(Operator.FetchEager, property);
}
public static ConditionalCriteria fetchLazy(Property<?> property) {
return new ConditionalCriteria(Operator.FetchLazy, property);
}
public static ConditionalCriteria distinctRoot() {
return new ConditionalCriteria(Operator.DistinctRoot, null);
}
public static ConditionalCriteria projectionRoot() {
return new ConditionalCriteria(Operator.ProjectionRoot, null);
}
public static ConditionalCriteria groupBy(Property<?> property) {
return new ConditionalCriteria(Operator.GroupBy, property);
}
public static ConditionalCriteria select(Property<?> property) {
return new ConditionalCriteria(Operator.Select, property);
}
public enum Operator {
Equal, LessThan, LessThanOrEqual, GreatThan, GreatThanOrEqual, Like, IgnoreCaseLike, IgnoreCaseEqual
, IsNull, IsNotNull, IsEmpty, IsNotEmpty
, Not, Or, And
, In, Between
, EqualProperty, LessThanProperty, LessThanOrEqualProperty, GreatThanProperty, GreatThanOrEqualProperty
, OrderAsc, OrderDesc, DistinctRoot, ProjectionRoot
, FetchLazy, FetchEager
, GroupBy
, Select, Min, Max, Avg, Sum, SumAsLong, SumAsDouble, Count, CountDistinct
}
}