package org.vertexium.cypher.functions.aggregate;
import org.vertexium.cypher.VertexiumCypherQueryContext;
import org.vertexium.cypher.VertexiumCypherScope;
import org.vertexium.cypher.exceptions.VertexiumCypherNotImplemented;
import org.vertexium.cypher.executor.ExpressionScope;
import java.util.Comparator;
import java.util.List;
public class PercentileDiscFunction extends PercentileFunction {
@Override
protected Object invoke(VertexiumCypherQueryContext ctx, List<Double> values, double percentile, ExpressionScope scope) {
int count = values.size();
values.sort(Double::compare);
if (percentile == 1.0 || count == 1) {
return values.get(values.size() - 1);
} else if (count > 1) {
double doubleIndex = percentile * (double) count;
int index = (int) doubleIndex;
index = (doubleIndex != index || index == 0) ? index : index - 1;
return values.get(index);
} else {
return null;
}
}
}