package org.springframework.data.simpledb.core; import java.util.Iterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.simpledb.repository.support.entityinformation.SimpleDbEntityInformation; public class QueryBuilder { private static final Logger LOGGER = LoggerFactory.getLogger(QueryBuilder.class); private StringBuilder query; public QueryBuilder(SimpleDbEntityInformation<?, ?> entityInformation) { this(entityInformation, false); } public QueryBuilder(SimpleDbEntityInformation<?, ?> entityInformation, boolean shouldCount) { query = new StringBuilder(); query.append("select"); if(shouldCount) { query.append(" count(*) "); } else { query.append(" * "); } query.append("from ").append(quote(entityInformation.getDomain())); } public QueryBuilder(String customQuery) { this(customQuery, false); } public QueryBuilder(String customQuery, boolean shouldCount) { this.query = new StringBuilder(); if(shouldCount) { query.append("select count(*) from ").append(customQuery.split("from")[1]); } else { query.append(customQuery); } } public QueryBuilder withLimit(final int limit) { query.append(" limit ").append(limit); return this; } public QueryBuilder withIds(Iterable<?> iterable) { Iterator<?> iterator = iterable.iterator(); appendWhereOrEndClause(query); query.append("("); while(iterator.hasNext()) { query.append("itemName()='").append(iterator.next().toString()).append("'"); if(iterator.hasNext()) { query.append(" or "); } } query.append(")"); return this; } public QueryBuilder with(Sort sort) { if(sort != null) { Iterator<Sort.Order> sortIt = sort.iterator(); if(sortIt.hasNext()) { Sort.Order order = sortIt.next(); appendWhereOrEndClause(query); query.append(order.getProperty()).append(" is not null order by "); query.append(order.getProperty()).append(" ").append(order.getDirection().name().toLowerCase()); } if(sortIt.hasNext()) { throw new IllegalArgumentException("SimpleDb does not support multiple sorting"); } } return this; } public QueryBuilder with(Pageable pageable) { Sort sort = pageable.getSort(); if(sort != null) { with(sort); } if(pageable.getPageSize() > 0) { withLimit(pageable.getPageSize()); } return this; } @Override public String toString() { // TODO change itemName() to ID field from domain object String result = query.toString(); LOGGER.debug("Created query: {}", result); return result; } private void appendWhereOrEndClause(StringBuilder query) { if(query.indexOf("where") > 0) { query.append(" and "); } else { query.append(" where "); } } private String quote(String simpleDbName) { return "`" + simpleDbName + "`"; } }