package org.aksw.sparqlify.core.rewrite.expr.transform;
import java.util.ArrayList;
import java.util.List;
import org.aksw.jena_sparql_api.views.E_RdfTerm;
import org.aksw.jena_sparql_api.views.ExprCopy;
import org.aksw.jena_sparql_api.views.SqlTranslationUtils;
import org.apache.jena.sparql.expr.Expr;
import org.apache.jena.sparql.expr.ExprFunction;
import org.apache.jena.sparql.expr.ExprList;
import org.apache.jena.vocabulary.XSD;
/**
* Expand all arguments of any concat expression into this expression.
* Also merges consecutive constants.
*
*/
public class ExprTransformerConcat
implements ExprTransformer
{
@Override
public E_RdfTerm transform(Expr fn, List<E_RdfTerm> exprs) {
List<Expr> newArgs = new ArrayList<Expr>();
for(E_RdfTerm expr : exprs) {
Expr arg = expr.getLexicalValue();
if(SqlTranslationUtils.isConcatExpr(arg)) {
ExprFunction fnArg = arg.getFunction();
for(Expr a : fnArg.getArgs()) {
newArgs.add(a);
}
} else {
newArgs.add(arg);
}
}
ExprList merged = SqlTranslationUtils.mergeConsecutiveConstants(newArgs);
Expr newVal = ExprCopy.getInstance().copy(fn, merged);
E_RdfTerm result = E_RdfTerm.createTypedLiteral(newVal, XSD.xstring);
return result;
}
}