package org.aksw.sparqlify.algebra.sql.nodes; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.aksw.sparqlify.algebra.sql.exprs2.SqlExpr; import org.aksw.sparqlify.core.TypeToken; import org.aksw.sparqlify.core.sql.schema.Schema; import org.aksw.sparqlify.core.sql.schema.SchemaImpl; import org.apache.jena.atlas.io.IndentedWriter; public class SqlOpExtend extends SqlOpBase1 { private Projection projection; public SqlOpExtend(Schema schema, SqlOp subOp, Projection projection) { super(schema, subOp); this.projection = projection; } public Projection getProjection() { return projection; } /* public static Map<String, XClass> extractExtendedTypeMap(Map<String, Expr> nameToExpr, DatatypeAssigner datatypeAssigner, Map<String, XClass> baseTypeMap) { Map<String, XClass> result = new HashMap<String, XClass>(); for(Entry<String, Expr> entry : nameToExpr.entrySet()) { Expr expr = entry.getValue(); XClass datatype = datatypeAssigner.assign(expr, baseTypeMap); if(datatype == null) { System.err.println("Could not determine datatype for: " + expr); } result.put(entry.getKey(), datatype); } return result; } public static SqlOpExtend create(SqlOp op, Projection projection, DatatypeAssigner datatypeAssigner) { Schema schema = new SchemaImpl(); schema.getColumnNames().addAll(op.getSchema().getColumnNames()); schema.getColumnNames().addAll(projection.getNames()); Map<String, XClass> typeMap = extractExtendedTypeMap(projection.getNameToExpr(), datatypeAssigner, op.getSchema().getTypeMap()); //projection.getNameToExpr(typeMap) schema.getTypeMap().putAll(op.getSchema().getTypeMap()); schema.getTypeMap().putAll(typeMap); return new SqlOpExtend(schema, op, projection); } */ public static Map<String, TypeToken> extractExtendedTypeMap(Map<String, SqlExpr> nameToExpr, Map<String, TypeToken> baseTypeMap) { Map<String, TypeToken> result = new HashMap<String, TypeToken>(); for(Entry<String, SqlExpr> entry : nameToExpr.entrySet()) { SqlExpr expr = entry.getValue(); //XClass datatype = datatypeAssigner.assign(expr, baseTypeMap); TypeToken datatype = expr.getDatatype(); if(datatype == null) { System.err.println("Could not determine datatype for: " + expr); } result.put(entry.getKey(), datatype); } return result; } public static Map<String, TypeToken> extractExtendedTypeMap(Map<String, SqlExpr> nameToExpr) { Map<String, TypeToken> result = new HashMap<String, TypeToken>(); for(Entry<String, SqlExpr> entry : nameToExpr.entrySet()) { /* Expr expr = entry.getValue(); XClass datatype = datatypeAssigner.assign(expr, baseTypeMap); if(datatype == null) { System.err.println("Could not determine datatype for: " + expr); } */ TypeToken typeName = entry.getValue().getDatatype(); result.put(entry.getKey(), typeName); } return result; } public static SqlOpExtend create(SqlOp op, Projection projection) { Schema schema = new SchemaImpl(); schema.getColumnNames().addAll(op.getSchema().getColumnNames()); schema.getColumnNames().addAll(projection.getNames()); Map<String, TypeToken> typeMap = extractExtendedTypeMap(projection.getNameToExpr(), op.getSchema().getTypeMap()); //projection.getNameToExpr(typeMap) schema.getTypeMap().putAll(op.getSchema().getTypeMap()); schema.getTypeMap().putAll(typeMap); return new SqlOpExtend(schema, op, projection); } @Override public void write(IndentedWriter writer) { writer.println("SqlOpExtend " + projection + "("); writer.incIndent(); subOp.write(writer); writer.println(); writer.decIndent(); writer.print(")"); } }