package org.aksw.sparqlify.core.algorithms;
import java.util.ArrayList;
import java.util.List;
import org.aksw.commons.util.reflect.MultiMethod;
import org.aksw.sparqlify.algebra.sql.exprs2.S_Agg;
import org.aksw.sparqlify.algebra.sql.exprs2.S_ColumnRef;
import org.aksw.sparqlify.algebra.sql.exprs2.S_Constant;
import org.aksw.sparqlify.algebra.sql.exprs2.SqlExpr;
import org.aksw.sparqlify.core.TypeToken;
import org.aksw.sparqlify.core.interfaces.SqlExprSerializer;
import org.apache.jena.sparql.expr.E_Cast;
import org.apache.jena.sparql.expr.NodeValue;
public abstract class SqlExprSerializerDefault
implements SqlExprSerializer
{
//public DatatypeAssigner datatypeAssigner;
protected DatatypeToString datatypeSerializer;
public SqlExprSerializerDefault(DatatypeToString datatypeSerializer)
{
//this.datatypeAssigner = datatypeAssigner;
this.datatypeSerializer = datatypeSerializer;
}
public String _serialize(NodeValue nodeValue) {
if(nodeValue.equals(NodeValue.nvNothing)) {
return "NULL ";
}
// TODO Handle this correctly
String result = nodeValue.asUnquotedString();
return result;
}
@Override
public String serialize(SqlExpr expr) {
try {
String result = (String)MultiMethod.invoke(this, "_serialize", expr);
return result;
} catch(Exception e) {
throw new RuntimeException("Error serializing expression" + expr, e);
}
}
public String _serialize(S_Agg expr) {
System.err.println("Hack used for serializing aggregators.");
String result = expr.getAggregator().toString(); ////this._serializeAgg(expr.getAggregator());
return result;
}
/*
public String _serialize(ExprAggregator expr) {
String result = this._serializeAgg(expr.getAggregator());
return result;
}
public String _serializeAgg(SqlAggregator aggregator) {
String result = MultiMethod.invoke(this, "serializeAgg", aggregator);
return result;
}
public String serializeAgg(SqlAggregatorCount aggregator) {
return "COUNT(*)";
}
*/
//
// public String _serialize(S_Serialize expr) {
// List<String> argStrs = serializeArgs(expr.getArgs());
//
// String result = expr.getSerializer().serialize(argStrs);
// return result;
// }
//
//
public List<String> serializeArgs(List<SqlExpr> exprs) {
List<String> result = new ArrayList<String>();
for(SqlExpr expr : exprs) {
String tmp = serialize(expr);
result.add(tmp);
}
return result;
}
public String _serialize(E_Cast expr) {
throw new RuntimeException("fix this");
/*
String tmp = serialize(expr.getExpr());
SqlDatatype datatype = datatypeAssigner.assign(expr);
Factory1<String> caster = datatypeSerializer.asString(datatype);
String result = caster.create(tmp);
return result;
*/
}
/*
public String _serialize(E_Function expr) {
List<String> args = serializeArgs(expr.getArgs());
SqlStringTransformer transformer = null; //expr.getTransformer();
if(transformer == null) {
return expr.getFuncName() + "(" + Joiner.on(", ").join(serializeArgs(expr.getArgs())) + ")";
} else {
return transformer.transform(expr, args);
}
}
*/
/*
public static String _serialize(Expr expr) {
return expr.asSQL();
}
*/
/*
public String _serialize(ExprColumn expr)
{
String columnAlias = SqlAlgebraToString.escapeAlias(expr.getColumnName());
if(expr.getTableName() == null) {
return columnAlias;
} else {
return expr.getTableName() + "." + columnAlias;
}
//return expr.asString();
}
*/
public String _serialize(S_Constant expr) {
return serializeConstant(expr.getValue(), expr.getDatatype());
}
public abstract String serializeConstant(Object value, TypeToken datatype);
/*
public String _serialize(E_String expr) {
return expr.getSqlString();
}*/
/*
// unused
public String _serialize(ExprNode expr) {
//return serializeConstant(expr);
return serializeConstant(expr.getObject(), expr.getDatatype());
}*/
/*
public String _serialize(E_GeographyFromText expr)
{
return "ST_GeographyFromText(" + serialize(expr.getExpr()) + ")";
}
public String _serialize(E_GeometryFromText expr)
{
return "ST_GeomFromText(" + serialize(expr.getExpr()) + ", 4326)";
}
public String _serialize(E_Intersects expr)
{
// Did I have some argument against ST_Intersects???
//return "(" + serialize(expr.getArg1()) + " && " + serialize(expr.getArg2()) + ")";
return "ST_Intersects(" + serialize(expr.getArg1()) + ", " + serialize(expr.getArg2()) + ")";
}
*/
//
// public String _serialize(E_LessThan expr) {
// return "(" + serialize(expr.getArg1()) + " < " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_LessThanOrEqual expr) {
// return "(" + serialize(expr.getArg1()) + " <= " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_Equals expr) {
// return "(" + serialize(expr.getArg1()) + " = " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_GreaterThanOrEqual expr) {
// return "(" + serialize(expr.getArg1()) + " >= " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_GreaterThan expr) {
// return "(" + serialize(expr.getArg1()) + " > " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_LogicalAnd expr) {
// return "(" + serialize(expr.getArg1()) + " AND " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_LogicalOr expr) {
// return "(" + serialize(expr.getArg1()) + " OR " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_LogicalNot expr) {
// return "(NOT " + serialize(expr.getExpr()) + ")";
// }
//
// public String _serialize(E_Add expr) {
// return "(" + serialize(expr.getArg1()) + " + " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_Subtract expr) {
// return "(" + serialize(expr.getArg1()) + " + " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_Multiply expr) {
// return "(" + serialize(expr.getArg1()) + " + " + serialize(expr.getArg2()) + ")";
// }
//
// public String _serialize(E_Divide expr) {
// return "(" + serialize(expr.getArg1()) + " + " + serialize(expr.getArg2()) + ")";
// }
//
//
// // IsNotNull
// public String _serialize(E_Bound expr) {
// String arg = serialize(expr.getExpr());
// String result = "(" + arg + " IS NOT NULL)";
//
// return result;
// }
//
// public String _serialize(E_StrConcat concat) {
// List<String> args = serializeArgs(concat.getArgs());
// String result = serializeConcat(args);
// return result;
// }
//
// public String _serialize(E_StrConcatPermissive concat) {
// List<String> args = serializeArgs(concat.getArgs());
// String result = serializeConcat(args);
// return result;
// }
//
// public String serializeConcat(List<String> args) {
// String result = "(" + Joiner.on(" || ").join(args) + ")";
//
// return result;
// }
//
// public String _serialize(E_Regex expr) {
//
// List<Expr> args = expr.getArgs();
// Expr varArg = args.get(0);
// Expr patternArg = args.get(1);
//
//
// if(!patternArg.isConstant()) {
// throw new RuntimeException("Pattern for regex must be a constant, encountered: " + patternArg);
// }
//
// String arg = serialize(varArg);
// String pattern = patternArg.getConstant().asUnquotedString(); //serialize(patternArg);
// String result = arg + " ~* " + "'" + pattern + "'";
//
// return result;
// }
//
public String _serialize(S_ColumnRef expr) {
//System.out.println("ColumnRef: " + expr);
//System.err.println("Should not use variables but rather something like E_ColumnRef.");
String result;
if(expr.getRelationAlias() == null) {
result = "\"" + expr.getColumnName() + "\"";
} else {
result = expr.getRelationAlias() + ".\"" + expr.getColumnName() + "\"";
}
//String result = expr.getVarName();
//String result = expr.getRelationAlias() + ".\"" + expr.getColumnName() + "\"";
return result;
}
//
//
// public String _serialize(ExprVar expr) {
// System.err.println("Should not use variables but E_ColumnRef - Something most likely went wrong");
// return expr.getVarName();
// }
}