package com.breeze.hib;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.MatchMode;
import org.hibernate.engine.spi.TypedValue;
import org.hibernate.internal.util.StringHelper;
/**
* superclass for comparisons between two properties (with like clauses)
*
*
*/
class LikePropertyExpression implements Criterion {
private static final long serialVersionUID = 1L;
private static final TypedValue[] NO_TYPED_VALUES = new TypedValue[0];
private final String propertyName;
private final String otherPropertyName;
private final MatchMode mode;
protected LikePropertyExpression(String propertyName, String otherPropertyName, MatchMode mode) {
this.propertyName = propertyName;
this.otherPropertyName = otherPropertyName;
this.mode = mode;
}
@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
final String[] lhsColumns = criteriaQuery.findColumns( propertyName, criteria );
final String[] rhsColumns = criteriaQuery.findColumns( otherPropertyName, criteria );
List<String> comparisons = new ArrayList<String>();
for (int i = 0; i<lhsColumns.length; i++) {
String comp = formatExpr(lhsColumns[0], rhsColumns[0], mode);
comparisons.add(comp);
}
if ( comparisons.size() > 1 ) {
return '(' + StringHelper.join( " and ", comparisons.toArray(new String[comparisons.size()]) ) + ')';
} else {
return comparisons.get(0);
}
}
@Override
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) {
return NO_TYPED_VALUES;
}
private String formatExpr(String p1, String p2, MatchMode mode) {
String pct = "'%'";
String expr = p1 + " like ";
if (mode == MatchMode.ANYWHERE) {
return expr + "concat(" + pct + "," + p2 + "," + pct + ")";
} else if (mode == MatchMode.START) {
return expr + "concat(" + p2 + "," + pct + ")";
} else if (mode == MatchMode.END) {
return expr + "concat(" + pct + "," + p2 + ")";
} else if (mode == MatchMode.EXACT) {
return expr + p2;
} else {
throw new RuntimeException("Unrecognized MatchMode: " + mode);
}
}
@Override
public String toString() {
return propertyName + " like " + otherPropertyName + "( MatchMode=" + mode.toString() + ")";
}
}