package org.aksw.sparqlify.core.rewrite.expr.transform;
import java.util.ArrayList;
import java.util.List;
import org.aksw.jena_sparql_api.utils.ExprUtils;
import org.aksw.jena_sparql_api.views.E_RdfTerm;
import org.apache.jena.sparql.expr.E_Equals;
import org.apache.jena.sparql.expr.Expr;
import org.apache.jena.sparql.expr.NodeValue;
import org.apache.jena.vocabulary.XSD;
public class ExprTransformerOneOf
implements ExprTransformer
{
@Override
public E_RdfTerm transform(Expr orig, List<E_RdfTerm> exprs) {
E_RdfTerm a = exprs.get(0);
List<E_RdfTerm> bs = new ArrayList<E_RdfTerm>(exprs.size() - 1);
for(int i = 1; i < exprs.size(); ++i) {
E_RdfTerm tmp = exprs.get(i);
bs.add(tmp);
}
Expr termTypeA = a.getType();
if(!termTypeA.isConstant()) {
throw new RuntimeException("Term type is expected to be a constant: " + termTypeA + " in expression " + orig + " as " + exprs);
}
List<Expr> es = new ArrayList<Expr>(exprs.size());
for(E_RdfTerm b : bs) {
Expr termTypeB = b.getType();
if(!termTypeB.isConstant()) {
throw new RuntimeException("Term type is expected to be a constant: " + termTypeB + " in expression " + orig + " as " + exprs);
}
boolean isEqual = termTypeA.getConstant().equals(termTypeB.getConstant());
if(isEqual) {
Expr e = new E_Equals(a.getLexicalValue(), b.getLexicalValue());
es.add(e);
}
}
Expr or;
if(es.isEmpty()) {
or = NodeValue.FALSE;
} else {
or = ExprUtils.orifyBalanced(es);
}
E_RdfTerm result = E_RdfTerm.createTypedLiteral(or, XSD.xboolean);
return result;
//throw new RuntimeException("Implement me");
}
/*
@Override
public E_RdfTerm transform(Expr orig, E_RdfTerm a) {
E_OneOf e = (E_OneOf)orig;
Expr lhs = e.getLHS();
ExprList rhs = e.getRHS();
e.getA
//throw new RuntimeException("Implement me");
}
*/
}