package org.infinispan.objectfilter.impl.syntax.parser;
import java.util.List;
import org.infinispan.objectfilter.impl.logging.Log;
import org.infinispan.objectfilter.impl.ql.AggregationFunction;
import org.infinispan.objectfilter.impl.ql.PropertyPath;
import org.jboss.logging.Logger;
/**
* An aggregated property path (e.g. {@code SUM(foo.bar.baz)}) represented by {@link PropertyReference}s
* used with an aggregation function in the SELECT, HAVING or ORDER BY clause.
*
* @author anistor@redhat.com
* @since 9.0
*/
public final class AggregationPropertyPath<TypeMetadata> extends PropertyPath<TypeDescriptor<TypeMetadata>> {
private static final Log log = Logger.getMessageLogger(Log.class, AggregationPropertyPath.class.getName());
private final AggregationFunction aggregationFunction;
AggregationPropertyPath(AggregationFunction aggregationFunction, List<PropertyReference<TypeDescriptor<TypeMetadata>>> path) {
super(path);
switch (aggregationFunction) {
case SUM:
case AVG:
case MIN:
case MAX:
case COUNT:
break;
default:
throw log.getAggregationTypeNotSupportedException(aggregationFunction.name());
}
this.aggregationFunction = aggregationFunction;
}
public AggregationFunction getAggregationFunction() {
return aggregationFunction;
}
@Override
public boolean equals(Object o) {
if (!super.equals(o)) return false;
AggregationPropertyPath<?> that = (AggregationPropertyPath<?>) o;
return aggregationFunction == that.aggregationFunction;
}
@Override
public int hashCode() {
return 31 * super.hashCode() + aggregationFunction.hashCode();
}
@Override
public String toString() {
return aggregationFunction.name() + "(" + asStringPath() + ")";
}
}