/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.query.algebra.evaluation.util;
import java.util.Comparator;
import org.openrdf.model.Value;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.algebra.Order;
import org.openrdf.query.algebra.OrderElem;
import org.openrdf.query.algebra.evaluation.EvaluationStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author james
*
*/
public class OrderComparator implements Comparator<BindingSet> {
private Logger logger = LoggerFactory.getLogger(OrderComparator.class);
private EvaluationStrategy strategy;
private Order order;
private ValueComparator cmp;
public OrderComparator(EvaluationStrategy strategy, Order order,
ValueComparator vcmp) {
this.strategy = strategy;
this.order = order;
this.cmp = vcmp;
}
public int compare(BindingSet o1, BindingSet o2) {
try {
for (OrderElem element : order.getElements()) {
Value v1 = strategy.evaluate(element.getExpr(), o1);
Value v2 = strategy.evaluate(element.getExpr(), o2);
int compare = cmp.compare(v1, v2);
if (compare == 0)
continue;
if (element.isAscending())
return compare;
if (compare > 0)
return -1;
if (compare < 0)
return 1;
}
return 0;
} catch (QueryEvaluationException e) {
logger.debug(e.getMessage(), e);
return 0;
} catch (IllegalArgumentException e) {
logger.debug(e.getMessage(), e);
return 0;
}
}
}