package org.openanzo.glitter.expression.aggregate; import java.util.Collection; import java.util.List; import java.util.Map; import org.openanzo.glitter.exception.ExpressionEvaluationException; import org.openanzo.glitter.expression.AggregaterFunctionBase; import org.openanzo.glitter.expression.FunctionWithAttributes; import org.openanzo.glitter.query.PatternSolution; import org.openanzo.glitter.query.SolutionSet; import org.openanzo.glitter.util.Glitter; import org.openanzo.rdf.Literal; import org.openanzo.rdf.MemPlainLiteral; import org.openanzo.rdf.URI; import org.openanzo.rdf.Value; import org.openanzo.rdf.Variable; import org.openanzo.rdf.Constants.NAMESPACES; /** * Implements the GROUP_CONCAT() aggregate function, which combines the values for expressions within the group into * a single value for the group. * * @author lee <lee@cambridgesemantics.com> * */ public class GroupConcat extends AggregaterFunctionBase implements FunctionWithAttributes { /** * What string should be used to separate items being concatenated? */ final static public String ATTRIBUTE_SEPARATOR = "separator"; private String separator = ","; public void setAttributes(Map<String, Object> attributes) { if (attributes.containsKey(ATTRIBUTE_SEPARATOR)) separator = (String) attributes.get(ATTRIBUTE_SEPARATOR); } public Value call(List<Variable> arguments, SolutionSet group) throws ExpressionEvaluationException { String s = ""; boolean needsSeparator = false; for (PatternSolution sol : group) { Collection<Variable> vars = (arguments != null && !arguments.isEmpty()) ? arguments : sol.getBoundVariables(); for (Variable v : vars) { Value val = sol.getBinding(v); if (val != null) { if (needsSeparator) { s += separator; } else { needsSeparator = true; } if (val instanceof Literal) s += ((Literal)val).getLabel(); else s += val.toString(); } } } return MemPlainLiteral.create(s); } public URI getIdentifier() { return Glitter.createURI(NAMESPACES.BUILTIN_AGGREGATE_NAMESPACE + "group_concat"); } @Override public String toString() { return "GROUP_CONCAT"; } }