package org.geotools.data.efeature.query; import java.util.Date; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.query.conditions.Condition; import org.eclipse.emf.query.conditions.Not; import org.eclipse.emf.query.conditions.booleans.BooleanCondition; import org.eclipse.emf.query.conditions.eobjects.EObjectInstanceCondition; import org.eclipse.emf.query.conditions.numbers.NumberCondition; import org.eclipse.emf.query.conditions.strings.StringRegularExpressionValue; import org.geotools.data.efeature.DataBuilder; import org.geotools.data.efeature.DataTypes; import org.opengis.filter.expression.Literal; public class ConditionEncoder { public static final Condition IS_NULL = EObjectInstanceCondition.IS_NULL; // ----------------------------------------------------- // Generic comparison methods // ----------------------------------------------------- public static Condition eq(Literal value) throws EFeatureEncoderException { return eq(value.getValue()); } public static Condition eq(EDataType type, Literal value) throws EFeatureEncoderException { return eq(DataBuilder.toValue(type, value)); } public static Condition eq(EDataType type, Object value) throws EFeatureEncoderException { return eq(DataBuilder.toValue(type, value)); } public static Condition eq(Object value) throws EFeatureEncoderException { if (DataTypes.isNumeric(value)) { return eq((Number) value); } else if (DataTypes.isDate(value)) { return eq((Date) value); } else if (DataTypes.isBoolean(value,false)) { return eq((Boolean) value); } else if (DataTypes.isString(value)) { return eq((String) value); } else if (DataTypes.isCharacter(value)) { return eq((Character) value); } throw new EFeatureEncoderException("EQ: Literal " + value + " not supported"); } public static Condition ne(Literal value) throws EFeatureEncoderException { return ne(value.getValue()); } public static Condition ne(EDataType type, Literal value) throws EFeatureEncoderException { return ne(DataBuilder.toValue(type, value)); } public static Condition ne(EDataType type, Object value) throws EFeatureEncoderException { return ne(DataBuilder.toValue(type, value)); } public static Condition ne(Object value) throws EFeatureEncoderException { if (DataTypes.isNumeric(value)) { return ne((Number) value); } else if (DataTypes.isDate(value)) { return ne((Date) value); } else if (DataTypes.isBoolean(value,false)) { return ne((Boolean) value); } else if (DataTypes.isString(value)) { return ne((String) value); } else if (DataTypes.isCharacter(value)) { return ne((Character) value); } throw new EFeatureEncoderException("NE: Literal " + value + " not supported"); } public static Condition lt(Literal value) throws EFeatureEncoderException { return lt(value.getValue()); } public static Condition lt(EDataType type, Literal value) throws EFeatureEncoderException { return lt(DataBuilder.toValue(type, value)); } public static Condition lt(EDataType type, Object value) throws EFeatureEncoderException { return lt(DataBuilder.toValue(type, value)); } public static Condition lt(Object value) throws EFeatureEncoderException { if (DataTypes.isNumeric(value)) { return lt((Number) value); } else if (DataTypes.isDate(value)) { return lt((Date) value); } else if (DataTypes.isString(value)) { return lt((String) value); } else if (DataTypes.isCharacter(value)) { return lt((Character) value); } throw new EFeatureEncoderException("LT: Literal " + value + " not supported"); } public static Condition le(Literal value) throws EFeatureEncoderException { return le(value.getValue()); } public static Condition le(EDataType type, Literal value) throws EFeatureEncoderException { return le(DataBuilder.toValue(type, value)); } public static Condition le(EDataType type, Object value) throws EFeatureEncoderException { return le(DataBuilder.toValue(type, value)); } public static Condition le(Object value) throws EFeatureEncoderException { if (DataTypes.isNumeric(value)) { return le((Number) value); } else if (DataTypes.isDate(value)) { return le((Date) value); } else if (DataTypes.isString(value)) { return le((String) value); } else if (DataTypes.isCharacter(value)) { return le((Character) value); } throw new EFeatureEncoderException("LE: Literal " + value + " not supported"); } public static Condition gt(Literal value) throws EFeatureEncoderException { return gt(value.getValue()); } public static Condition gt(EDataType type, Literal value) throws EFeatureEncoderException { return gt(DataBuilder.toValue(type, value)); } public static Condition gt(EDataType type, Object value) throws EFeatureEncoderException { return gt(DataBuilder.toValue(type, value)); } public static Condition gt(Object value) throws EFeatureEncoderException { if (DataTypes.isNumeric(value)) { return gt((Number) value); } else if (DataTypes.isDate(value)) { return gt((Date) value); } else if (DataTypes.isString(value)) { return gt((String) value); } else if (DataTypes.isCharacter(value)) { return gt((Character) value); } throw new EFeatureEncoderException("GT: Literal " + value + " not supported"); } public static Condition ge(Literal value) throws EFeatureEncoderException { return ge(value.getValue()); } public static Condition ge(EDataType type, Literal value) throws EFeatureEncoderException { return ge(DataBuilder.toValue(type, value)); } public static Condition ge(EDataType type, Object value) throws EFeatureEncoderException { return ge(DataBuilder.toValue(type, value)); } public static Condition ge(Object value) throws EFeatureEncoderException { if (DataTypes.isNumeric(value)) { return ge((Number) value); } else if (DataTypes.isDate(value)) { return ge((Date) value); } else if (DataTypes.isString(value)) { return ge((String) value); } else if (DataTypes.isCharacter(value)) { return ge((Character) value); } throw new EFeatureEncoderException("GE: Literal " + value + " not supported"); } public static Condition like(Literal value) throws EFeatureEncoderException { return like(value.getValue()); } public static Condition like(EDataType type, Literal value) throws EFeatureEncoderException { return like(DataBuilder.toValue(type, value)); } public static Condition like(EDataType type, Object value) throws EFeatureEncoderException { return like(DataBuilder.toValue(type, value)); } public static Condition like(Object value) throws EFeatureEncoderException { if (DataTypes.isString(value)) { return like((String) value); } throw new EFeatureEncoderException("LIKE: Literal " + value + " not supported"); } public static Condition between(Literal lower, Literal upper) throws EFeatureEncoderException { return between(lower.getValue(),upper.getValue()); } public static Condition between(EDataType type, Literal lower, Literal upper) throws EFeatureEncoderException { return between(DataBuilder.toValue(type, lower),DataBuilder.toValue(type, upper)); } public static Condition between(EDataType type, Object lower, Object upper) throws EFeatureEncoderException { return between(DataBuilder.toValue(type, lower),DataBuilder.toValue(type, upper)); } public static Condition between(Object lower, Object upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); if (DataTypes.isNumeric(lower)) { return between((Number) lower, (Number) upper); } else if (DataTypes.isDate(lower)) { return between((Date) lower, (Date) upper); } else if (DataTypes.isString(lower)) { return between((String) lower, (String) upper); } else if (DataTypes.isCharacter(lower)) { return between((Character) lower,(Character) upper); } throw new EFeatureEncoderException("BETWEEN: Literals '" + lower + "' and '" + upper + "' not supported"); } public static Condition outside(Literal lower, Literal upper) throws EFeatureEncoderException { return outside(lower.getValue(),upper.getValue()); } public static Condition outside(EDataType type, Literal lower, Literal upper) throws EFeatureEncoderException { return outside(DataBuilder.toValue(type, lower),DataBuilder.toValue(type, upper)); } public static Condition outside(EDataType type, Object lower, Object upper) throws EFeatureEncoderException { return outside(DataBuilder.toValue(type, lower),DataBuilder.toValue(type, upper)); } public static Condition outside(Object lower, Object upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); if (DataTypes.isNumeric(lower)) { return outside((Number) lower, (Number) upper); } else if (DataTypes.isDate(lower)) { return outside((Date) lower, (Date) upper); } else if (DataTypes.isString(lower)) { return outside((String) lower, (String) upper); } else if (DataTypes.isCharacter(lower)) { return outside((Character) lower,(Character) upper); } throw new EFeatureEncoderException("OUTSIDE: Literals '" + lower + "' and '" + upper + "' not supported"); } // ----------------------------------------------------- // Number comparison methods // ----------------------------------------------------- public static NumberCondition<?> eq(Number number) throws EFeatureEncoderException { isSane(number, "number", true); if (number instanceof Integer) return NumberCondition.equals((Integer) number); else if (number instanceof Double) return NumberCondition.equals((Double) number); else if (number instanceof Long) return NumberCondition.equals((Long) number); else if (number instanceof Float) return NumberCondition.equals((Float) number); else if (number instanceof Short) return NumberCondition.equals((Short) number); else if (number instanceof Byte) return NumberCondition.equals((Byte) number); throw new EFeatureEncoderException("Type " + number + " not supported"); } public static NumberCondition<?> ne(Number number) throws EFeatureEncoderException { isSane(number, "number", true); if (number instanceof Integer) return NumberCondition.notEquals((Integer) number); else if (number instanceof Double) return NumberCondition.notEquals((Double) number); else if (number instanceof Long) return NumberCondition.notEquals((Long) number); else if (number instanceof Float) return NumberCondition.notEquals((Float) number); else if (number instanceof Short) return NumberCondition.notEquals((Short) number); else if (number instanceof Byte) return NumberCondition.notEquals((Byte) number); throw new EFeatureEncoderException("Type " + number + " not supported"); } public static NumberCondition<?> lt(Number number) throws EFeatureEncoderException { isSane(number, "number", true); if (number instanceof Integer) return NumberCondition.lessThan((Integer) number); else if (number instanceof Double) return NumberCondition.lessThan((Double) number); else if (number instanceof Long) return NumberCondition.lessThan((Long) number); else if (number instanceof Float) return NumberCondition.lessThan((Float) number); else if (number instanceof Short) return NumberCondition.lessThan((Short) number); else if (number instanceof Byte) return NumberCondition.lessThan((Byte) number); throw new EFeatureEncoderException("Type " + number + " not supported"); } public static NumberCondition<?> le(Number number) throws EFeatureEncoderException { isSane(number, "number", true); if (number instanceof Integer) return NumberCondition.lessThanOrEquals((Integer) number); else if (number instanceof Double) return NumberCondition.lessThanOrEquals((Double) number); else if (number instanceof Long) return NumberCondition.lessThanOrEquals((Long) number); else if (number instanceof Float) return NumberCondition.lessThanOrEquals((Float) number); else if (number instanceof Short) return NumberCondition.lessThanOrEquals((Short) number); else if (number instanceof Byte) return NumberCondition.lessThanOrEquals((Byte) number); throw new EFeatureEncoderException("Type " + number + " not supported"); } public static NumberCondition<?> gt(Number number) throws EFeatureEncoderException { isSane(number, "number", true); if (number instanceof Integer) return NumberCondition.greaterThan((Integer) number); else if (number instanceof Double) return NumberCondition.greaterThan((Double) number); else if (number instanceof Long) return NumberCondition.greaterThan((Long) number); else if (number instanceof Float) return NumberCondition.greaterThan((Float) number); else if (number instanceof Short) return NumberCondition.greaterThan((Short) number); else if (number instanceof Byte) return NumberCondition.greaterThan((Byte) number); throw new EFeatureEncoderException("Type " + number + " not supported"); } public static NumberCondition<?> ge(Number number) throws EFeatureEncoderException { isSane(number, "number", true); if (number instanceof Integer) return NumberCondition.greaterThanOrEquals((Integer) number); else if (number instanceof Double) return NumberCondition.greaterThanOrEquals((Double) number); else if (number instanceof Long) return NumberCondition.greaterThanOrEquals((Long) number); else if (number instanceof Float) return NumberCondition.greaterThanOrEquals((Float) number); else if (number instanceof Short) return NumberCondition.greaterThanOrEquals((Short) number); else if (number instanceof Byte) return NumberCondition.greaterThanOrEquals((Byte) number); throw new EFeatureEncoderException("Type " + number + " not supported"); } public static NumberCondition<?> between(Number lower, Number upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); if (lower instanceof Integer) return NumberCondition.between((Integer) lower, (Integer) upper); else if (lower instanceof Double) return NumberCondition.between((Double) lower, (Double) upper); else if (lower instanceof Long) return NumberCondition.between((Long) lower, (Long) upper); else if (lower instanceof Float) return NumberCondition.between((Float) lower, (Float) upper); else if (lower instanceof Short) return NumberCondition.between((Short) lower, (Short) upper); else if (lower instanceof Byte) return NumberCondition.between((Byte) lower, (Byte) upper); throw new EFeatureEncoderException("Type " + lower + " not supported"); } public static Condition outside(Number lower, Number upper) throws EFeatureEncoderException { return new Not(between(lower, upper)); } // ----------------------------------------------------- // Date comparison methods // ----------------------------------------------------- public static DateCondition eq(Date date) throws EFeatureEncoderException { isSane(date, "date", true); return DateCondition.equals(date); } public static DateCondition ne(Date date) throws EFeatureEncoderException { isSane(date, "date", true); return DateCondition.notEquals(date); } public static DateCondition lt(Date date) throws EFeatureEncoderException { isSane(date, "date", true); return DateCondition.lessThan(date); } public static DateCondition le(Date date) throws EFeatureEncoderException { isSane(date, "date", true); return DateCondition.lessThanOrEquals(date); } public static DateCondition gt(Date date) throws EFeatureEncoderException { isSane(date, "date", true); return DateCondition.greaterThan(date); } public static DateCondition ge(Date date) throws EFeatureEncoderException { isSane(date, "date", true); return DateCondition.greaterThanOrEquals(date); } public static DateCondition between(Date lower, Date upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); return DateCondition.between(lower, upper); } public static DateCondition outside(Date lower, Date upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); return DateCondition.outside(lower, upper); } // ----------------------------------------------------- // Boolean comparison methods // ----------------------------------------------------- public static BooleanCondition eq(Boolean state) throws EFeatureEncoderException { isSane(state, "state", true); return new BooleanCondition(state); } public static BooleanCondition ne(Boolean state) throws EFeatureEncoderException { isSane(state, "state", true); return new BooleanCondition(!state); } // ----------------------------------------------------- // String comparison methods // ----------------------------------------------------- public static StringCondition eq(String str) throws EFeatureEncoderException { isSane(str, "str", true); return StringCondition.equals(str); } public static StringCondition ne(String str) throws EFeatureEncoderException { isSane(str, "str", true); return StringCondition.notEquals(str); } public static StringCondition lt(String str) throws EFeatureEncoderException { isSane(str, "str", true); return StringCondition.lessThan(str); } public static StringCondition le(String str) throws EFeatureEncoderException { isSane(str, "str", true); return StringCondition.lessThanOrEquals(str); } public static StringCondition gt(String str) throws EFeatureEncoderException { isSane(str, "str", true); return StringCondition.greaterThan(str); } public static StringCondition ge(String str) throws EFeatureEncoderException { isSane(str, "str", true); return StringCondition.greaterThanOrEquals(str); } public static StringCondition between(String lower, String upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); return StringCondition.between(lower, upper); } public static StringCondition outside(String lower, String upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); return StringCondition.outside(lower, upper); } public static StringRegularExpressionValue like(String pattern) throws EFeatureEncoderException { isSane(pattern, "pattern", true); return new StringRegularExpressionValue(pattern); } // ----------------------------------------------------- // Character comparison methods // ----------------------------------------------------- public static CharacterCondition eq(Character c) throws EFeatureEncoderException { isSane(c, "c", true); return CharacterCondition.equals(c); } public static CharacterCondition ne(Character c) throws EFeatureEncoderException { isSane(c, "c", true); return CharacterCondition.notEquals(c); } public static CharacterCondition lt(Character c) throws EFeatureEncoderException { isSane(c, "c", true); return CharacterCondition.lessThan(c); } public static CharacterCondition le(Character c) throws EFeatureEncoderException { isSane(c, "c", true); return CharacterCondition.lessThanOrEquals(c); } public static CharacterCondition gt(Character c) throws EFeatureEncoderException { isSane(c, "c", true); return CharacterCondition.greaterThan(c); } public static CharacterCondition ge(Character c) throws EFeatureEncoderException { isSane(c, "c", true); return CharacterCondition.greaterThanOrEquals(c); } public static CharacterCondition between(Character lower, Character upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); return CharacterCondition.between(lower, upper); } public static CharacterCondition outside(Character lower, Character upper) throws EFeatureEncoderException { isSameType(lower, "lower", upper, "upper", true); return CharacterCondition.outside(lower, upper); } // ----------------------------------------------------- // Public helper methods // ----------------------------------------------------- public static boolean isSane(Object object, String name, boolean exception) throws EFeatureEncoderException { if (object == null) { return failure("Parameter '" + name + "' can not be null", exception); } return true; } public static boolean isSameType(Object obj1, String name1, Object obj2, String name2, boolean exception) throws EFeatureEncoderException { if (!isSane(obj1, name1, exception)) return false; if (!isSane(obj2, name2, exception)) return false; if (obj2.getClass() != obj2.getClass()) { return failure("Parameters are not of same type", exception); } return true; } public static boolean failure(String message, boolean exception) throws EFeatureEncoderException { if (exception) throw new EFeatureEncoderException(message); return false; } }