package org.springframework.data.simpledb.query;
import org.springframework.data.mapping.model.MappingException;
import org.springframework.data.repository.query.parser.Part;
import org.springframework.data.repository.query.parser.PartTree;
import org.springframework.data.repository.query.parser.PartTree.OrPart;
import org.springframework.data.simpledb.annotation.Query;
import org.springframework.data.simpledb.util.StringUtil;
import java.util.Iterator;
public final class PartTreeConverter {
private PartTreeConverter() {
/* utility class */
}
/**
* Convert a {@link PartTree} into a where query alike to the one present in the
* {@link Query}'s where property.
*/
public static String toIndexedQuery(final PartTree tree) {
final StringBuilder result = new StringBuilder();
final Iterator<OrPart> orIt = tree.iterator();
while(orIt.hasNext()) {
final OrPart orPart = orIt.next();
final Iterator<Part> partIt = orPart.iterator();
while(partIt.hasNext()) {
final Part part = partIt.next();
result.append(" " + part.getProperty().getSegment() + " ");
result.append(convertOperator(part.getType()));
if(partIt.hasNext()) {
result.append(" AND ");
}
}
if(orIt.hasNext()) {
result.append(" OR ");
}
}
return StringUtil.removeExtraSpaces(result.toString());
}
private static String convertOperator(final Part.Type type) {
String result = "";
switch(type) {
case SIMPLE_PROPERTY: {
result = " = ? ";
break;
}
case NEGATING_SIMPLE_PROPERTY: {
result = " != ? ";
break;
}
case GREATER_THAN: {
result = " > ? ";
break;
}
case GREATER_THAN_EQUAL: {
result = " >= ? ";
break;
}
case LESS_THAN: {
result = " < ? ";
break;
}
case LESS_THAN_EQUAL: {
result = " <= ? ";
break;
}
case LIKE: {
result = " LIKE ? ";
break;
}
case NOT_LIKE: {
result = " NOT LIKE ? ";
break;
}
case BETWEEN: {
result = " BETWEEN ? and ? ";
break;
}
case IS_NOT_NULL: {
result = " IS NOT NULL ";
break;
}
case IS_NULL: {
result = " IS NULL ";
break;
}
case IN: {
result = " IN ? ";
break;
}
default: {
throw new MappingException("No matching simpleDB operator for " + type);
}
}
return result;
}
}