package org.aksw.sparqlify.algebra.sql.nodes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
import org.apache.jena.sdb.core.JoinType;
public class SqlOpJoin
extends SqlOpBase2
{
private JoinType joinType;
//private boolean isLeftJoin;
private List<SqlExpr> conditions;
public SqlOpJoin(Schema schema, JoinType joinType, SqlOp left, SqlOp right) {
this(schema, joinType, left, right, new ArrayList<SqlExpr>());
}
public SqlOpJoin(Schema schema, JoinType joinType, SqlOp left, SqlOp right, List<SqlExpr> conditions) {
super(schema, left, right);
this.joinType = joinType;
this.conditions = conditions;
}
public JoinType getJoinType() {
return joinType;
}
public List<SqlExpr> getConditions() {
return conditions;
}
public static Schema createJoinSchema(Schema a, Schema b) {
List<String> names = new ArrayList<String>();
names.addAll(a.getColumnNames());
names.addAll(b.getColumnNames());
Map<String, TypeToken> typeMap = new HashMap<String, TypeToken>();
typeMap.putAll(a.getTypeMap());
typeMap.putAll(b.getTypeMap());
Schema result = new SchemaImpl(names, typeMap);
return result;
}
public static SqlOpJoin create(JoinType joinType, SqlOp a, SqlOp b) {
SqlOpJoin result = create(joinType, a, b, new ArrayList<SqlExpr>());
return result;
}
public static SqlOpJoin create(JoinType joinType, SqlOp a, SqlOp b, List<SqlExpr> conditions) {
Schema newSchema = createJoinSchema(a.getSchema(), b.getSchema());
SqlOpJoin result = new SqlOpJoin(newSchema, joinType, a, b, conditions);
return result;
}
@Override
public void write(IndentedWriter writer) {
writer.println("SqlOpJoin " + joinType + "(");
writer.incIndent();
left.write(writer);
writer.println(",");
right.write(writer);
writer.println();
writer.decIndent();
writer.print(")");
}
@Override
public boolean isEmpty() {
boolean result;
switch(joinType) {
case INNER: {
boolean a = left.isEmpty();
boolean b = right.isEmpty();
result = a || b;
break;
}
case LEFT: {
result = left.isEmpty();
break;
}
default: {
throw new RuntimeException("Should not happen");
}
}
return result;
}
}