private SqlQueryBuilder buildSelectQuery(RdbmsResource subj, RdbmsURI pred, RdbmsValue obj,
RdbmsResource... ctxs)
throws RdbmsException, SQLException
{
String tableName = statements.getTableName(vf.getInternalId(pred));
SqlQueryBuilder query = factory.createSqlQueryBuilder();
query.select().column("t", "ctx");
query.select().append(
"CASE WHEN cu.value IS NOT NULL THEN cu.value WHEN clu.value IS NOT NULL THEN clu.value ELSE cb.value END");
query.select().column("t", "subj");
query.select().append(
"CASE WHEN su.value IS NOT NULL THEN su.value WHEN slu.value IS NOT NULL THEN slu.value ELSE sb.value END");
query.select().column("pu", "id");
query.select().column("pu", "value");
query.select().column("t", "obj");
query.select().append(
"CASE WHEN ou.value IS NOT NULL THEN ou.value" + " WHEN olu.value IS NOT NULL THEN olu.value"
+ " WHEN ob.value IS NOT NULL THEN ob.value"
+ " WHEN ol.value IS NOT NULL THEN ol.value ELSE oll.value END");
query.select().column("od", "value");
query.select().column("og", "value");
SqlJoinBuilder join;
if (pred != null) {
join = query.from(uris.getShortTableName(), "pu");
// TODO what about long predicate URIs?
join = join.join(tableName, "t");
}
else {
join = query.from(tableName, "t");
}
if (pred == null) {
join.join(uris.getShortTableName(), "pu").on("id", "t.pred");
}
join.leftjoin(uris.getShortTableName(), "cu").on("id", "t.ctx");
join.leftjoin(uris.getLongTableName(), "clu").on("id", "t.ctx");
join.leftjoin(bnodes.getName(), "cb").on("id", "t.ctx");
join.leftjoin(uris.getShortTableName(), "su").on("id", "t.subj");
join.leftjoin(uris.getLongTableName(), "slu").on("id", "t.subj");
join.leftjoin(bnodes.getName(), "sb").on("id", "t.subj");
join.leftjoin(uris.getShortTableName(), "ou").on("id", "t.obj");
join.leftjoin(uris.getLongTableName(), "olu").on("id", "t.obj");
join.leftjoin(bnodes.getName(), "ob").on("id", "t.obj");
join.leftjoin(literals.getLabelTable().getName(), "ol").on("id", "t.obj");
join.leftjoin(literals.getLongLabelTable().getName(), "oll").on("id", "t.obj");
join.leftjoin(literals.getLanguageTable().getName(), "og").on("id", "t.obj");
join.leftjoin(literals.getDatatypeTable().getName(), "od").on("id", "t.obj");
if (ctxs != null && ctxs.length > 0) {
Number[] ids = new Number[ctxs.length];
for (int i = 0; i < ids.length; i++) {
ids[i] = vf.getInternalId(ctxs[i]);
}
query.filter().and().columnIn("t", "ctx", ids);
}
if (subj != null) {
Number id = vf.getInternalId(subj);
query.filter().and().columnEquals("t", "subj", id);
}
if (pred != null) {
Number id = vf.getInternalId(pred);
query.filter().and().columnEquals("pu", "id", id);
if (statements.isPredColumnPresent(id)) {
query.filter().and().columnEquals("t", "pred", id);
}
}
if (obj != null) {
Number id = vf.getInternalId(obj);
query.filter().and().columnEquals("t", "obj", id);
}
return query;
}