/*
* Copyright (c) 2011 PonySDK
* Owners:
* Luciano Broussal <luciano.broussal AT gmail.com>
* Mathieu Barbier <mathieu.barbier AT gmail.com>
* Nicolas Ciaravola <nicolas.ciaravola.pro AT gmail.com>
*
* WebSite:
* http://code.google.com/p/pony-sdk/
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.ponysdk.hibernate.query.decorator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.ponysdk.core.query.ComparatorType;
import com.ponysdk.core.query.Criterion;
import com.ponysdk.core.query.Query;
import com.ponysdk.core.query.Query.QueryMode;
import com.ponysdk.core.query.SortingType;
import com.ponysdk.hibernate.query.CriteriaContext;
import com.ponysdk.hibernate.query.OrderingCriteria;
import com.ponysdk.hibernate.query.QueryGenerator;
public class DefaultQueryGenerator<T> implements QueryGenerator {
private final Map<String, CriteriaDecorator> criteriaDecoratorByPojoPropertyKey = new HashMap<String, CriteriaDecorator>();
private CriteriaDecorator sortCriteriaDecorator;
private final OrderingCriteria criteria;
private String defaultSortingProperty;
private SortingType sortingType;
public DefaultQueryGenerator(final OrderingCriteria criteria) {
this(criteria, null, SortingType.NONE);
}
public DefaultQueryGenerator(final OrderingCriteria criteria, final String defaultSortingProperty, final SortingType sortingType) {
this.defaultSortingProperty = defaultSortingProperty;
this.sortingType = sortingType;
this.criteria = criteria;
this.sortCriteriaDecorator = new DefaultSortCriteriaDecorator();
}
public void putDecorator(final String pojoPropertyKey, final CriteriaDecorator criteriaDecorator) {
criteriaDecoratorByPojoPropertyKey.put(pojoPropertyKey, criteriaDecorator);
}
public void setSortCriteriaDecorator(final CriteriaDecorator sortCriteriaDecorator) {
this.sortCriteriaDecorator = sortCriteriaDecorator;
}
@Override
public OrderingCriteria generate(final Query query) {
boolean applyDefaultSorting = (defaultSortingProperty != null);
final List<Criterion> fields = query.getCriteria();
if (fields != null) {
for (final Criterion criterion : fields) {
final CriteriaContext context = new CriteriaContext();
context.setCriterion(criterion);
context.setOrderingCriteria(criteria);
if (criterion.getValue() != null || criterion.getSortingType() != SortingType.NONE || criterion.getComparator() == ComparatorType.IS_NULL || criterion.getComparator() == ComparatorType.IS_NOT_NULL) {
CriteriaDecorator criteriaDecorator = criteriaDecoratorByPojoPropertyKey.get(criterion.getPojoProperty());
if (criteriaDecorator == null) {
criteriaDecorator = new DefaultCriteriaDecorator();
}
criteriaDecorator.render(context);
}
if (applyDefaultSorting && criterion.getSortingType() != SortingType.NONE && criterion.getPojoProperty().equals(defaultSortingProperty)) {
applyDefaultSorting = false;
}
}
}
// sort forced on the default property
if (applyDefaultSorting) {
final Criterion field = new Criterion(defaultSortingProperty);
field.setSortingType(sortingType);
final CriteriaContext context = new CriteriaContext();
context.setCriterion(field);
context.setOrderingCriteria(criteria);
sortCriteriaDecorator.render(context);
}
// handle scrolling when too many data
if (!QueryMode.FULL_RESULT.equals(query.getQueryMode())) {
criteria.setMaxResults(query.getPageSize()).setFirstResult(query.getPageNum() * query.getPageSize());
}
return criteria;
}
}