/* * * * JBoss, Home of Professional Open Source. * * Copyright 2011, Red Hat, Inc., and individual contributors * * as indicated by the @author tags. See the copyright.txt file in the * * distribution for a full listing of individual contributors. * * * * This is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of * * the License, or (at your option) any later version. * * * * This software is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this software; if not, write to the Free * * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * * 02110-1301 USA, or see the FSF site: http://www.fsf.org. * */ package org.jboss.capedwarf.datastore.query; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.lucene.search.Query; import static com.google.appengine.api.datastore.Query.CompositeFilter; import static com.google.appengine.api.datastore.Query.Filter; import static com.google.appengine.api.datastore.Query.FilterPredicate; /** * Converts GAE's Query.FilterPredicates to Lucene Queries * * @author <a href="mailto:marko.luksa@gmail.com">Marko Luksa</a> */ public class FilterConverter { private LuceneQueryBuilder queryBuilder; public FilterConverter(LuceneQueryBuilder queryBuilder) { this.queryBuilder = queryBuilder; } public Query convert(Filter filter) { if (filter == null) { return queryBuilder.matchAll(); } if (filter instanceof CompositeFilter) { CompositeFilter compositeFilter = (CompositeFilter) filter; return convert(compositeFilter); } else if (filter instanceof FilterPredicate) { FilterPredicate predicate = (FilterPredicate) filter; return convert(predicate); } else { throw new IllegalArgumentException("Unknown filter type: " + filter); } } private Query convert(CompositeFilter compositeFilter) { List<Query> subQueries = new ArrayList<Query>(compositeFilter.getSubFilters().size()); for (Filter subFilter : compositeFilter.getSubFilters()) { subQueries.add(convert(subFilter)); } switch (compositeFilter.getOperator()) { case AND: return queryBuilder.all(subQueries); case OR: return queryBuilder.any(subQueries); default: throw new IllegalArgumentException("Unknown operator " + compositeFilter.getOperator()); } } public Query convert(FilterPredicate filterPredicate) { String fieldName = filterPredicate.getPropertyName(); Object value = filterPredicate.getValue(); switch (filterPredicate.getOperator()) { case EQUAL: return queryBuilder.equal(fieldName, value); case NOT_EQUAL: return queryBuilder.notEqual(fieldName, value); case IN: return queryBuilder.in(fieldName, (Collection<?>) value); case GREATER_THAN: return queryBuilder.greaterThan(fieldName, value); case GREATER_THAN_OR_EQUAL: return queryBuilder.greaterThanOrEqual(fieldName, value); case LESS_THAN: return queryBuilder.lessThan(fieldName, value); case LESS_THAN_OR_EQUAL: return queryBuilder.lessThanOrEqual(fieldName, value); default: throw new IllegalArgumentException("Unknown operator " + filterPredicate.getOperator()); } } }