package er.cayenne.example; import java.util.ArrayList; import java.util.List; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.cayenne.query.SortOrder; import er.cayenne.example.ChainableOrdering.ChainableOrderings; /** * A key in a DataObject. * * @param <E> The type this key returns. */ public class Key<E> { /** * Name of the key in the object */ private String _key; /** * Constructs a new key with the given name. */ public Key( String key ) { _key = key; } /** * @return Name of the key in the object. */ public String key() { return _key; } /** * @return An expression representing null. */ public Expression isNull() { return ExpressionFactory.matchExp( key(), null ); } /** * @return An expression representing a non-null value. */ public Expression isNotNull() { return ExpressionFactory.matchExp( key(), null ).notExp(); } /** * @return An expression representing equality. */ public Expression eq( E value ) { return ExpressionFactory.matchExp( key(), value ); } /** * @return An expression representing inequality. */ public Expression ne( E value ) { return ExpressionFactory.noMatchExp( key(), value ); } /** * @return An expression for a Database "Like" query. */ public Expression like( E value ) { return ExpressionFactory.likeExp( key(), value ); } /** * @return An expression for a case insensitive "Like" query. */ public Expression likeInsensitive( E value ) { return ExpressionFactory.likeIgnoreCaseExp( key(), value ); } /** * @return An expression applying to objects between the two given bounds (not inclusive) * * @param lower The lower bound. [null] represents infinity. * @param upper The upper bound. [null] represents infinity. */ public Expression between( E lower, E upper ) { return between( lower, upper, false ); } /** * @return An expression applying to objects between the two given bounds (not inclusive) * * @param lower The lower bound. [null] represents infinity. * @param upper The upper bound. [null] represents infinity. */ public Expression between( E lower, E upper, boolean inclusive ) { List<Expression> expressions = new ArrayList<>(); if( lower != null ) { if( inclusive ) { expressions.add( gte( lower ) ); } else { expressions.add( gt( lower ) ); } } if( upper != null ) { if( inclusive ) { expressions.add( lte( upper ) ); } else { expressions.add( lt( upper ) ); } } return andExpressions( expressions ); } /** * @return An expression for finding objects with values in the given set. */ public Expression in( E ... values ) { return ExpressionFactory.inExp( key(), values ); } /** * @return A greater than Expression. */ public Expression gt( E value ) { return ExpressionFactory.greaterExp( key(), value ); } /** * @return A greater than or equal to Expression. */ public Expression gte( E value ) { return ExpressionFactory.greaterOrEqualExp( key(), value ); } /** * @return A less than Expression. */ public Expression lt( E value) { return ExpressionFactory.lessExp( key(), value ); } /** * @return A less than or equal to Expression. */ public Expression lte( E value) { return ExpressionFactory.lessOrEqualExp( key(), value ); } /** * @return Ascending sort orderings on this key. */ public ChainableOrdering asc() { return new ChainableOrdering( key(), SortOrder.ASCENDING ); } /** * @return Ascending sort orderings on this key. */ public ChainableOrderings ascs() { return new ChainableOrderings( asc() ); } /** * @return Ascending case insensitive sort orderings on this key. */ public ChainableOrdering ascInsensitive() { return new ChainableOrdering( key(), SortOrder.ASCENDING_INSENSITIVE ); } /** * @return Ascending case insensitive sort orderings on this key. */ public ChainableOrderings ascInsensitives() { return new ChainableOrderings( ascInsensitive() ); } /** * @return Descending sort orderings on this key. */ public ChainableOrdering desc() { return new ChainableOrdering( key(), SortOrder.DESCENDING ); } /** * @return Descending sort orderings on this key. */ public ChainableOrderings descs() { return new ChainableOrderings(desc() ); } /** * @return Descending case insensitive sort orderings on this key. */ public ChainableOrdering descInsensitive() { return new ChainableOrdering( key(), SortOrder.DESCENDING_INSENSITIVE ); } /** * @return Descending case insensitive sort orderings on this key. */ public ChainableOrderings descInsensitives() { return new ChainableOrderings( descInsensitive() ); } /** * @return An expression with the given expressions combined with logical "and". */ private static Expression andExpressions( List<Expression> expressions ) { Expression resultExpression = null; for( Expression e : expressions ) { if( resultExpression == null ) { resultExpression = e; } else { resultExpression = resultExpression.andExp( e ); } } return resultExpression; } public String dot( String key ) { return key() + "." + key; } public String dot( Key<?> key ) { return key() + "." + key.key(); } }