package com.mysema.rdfbean.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.mysema.commons.lang.CloseableIterator;
/**
* @author tiwe
*
*/
public class RDFUpdateImpl implements RDFUpdate {
private final RDFConnection connection;
private final List<PatternBlock> delete = new ArrayList<PatternBlock>();
private final List<PatternBlock> insert = new ArrayList<PatternBlock>();
private final List<UID> from = new ArrayList<UID>();
private final List<UID> into = new ArrayList<UID>();
private final List<Block> where = new ArrayList<Block>();
public RDFUpdateImpl(RDFConnection connection) {
this.connection = connection;
}
@Override
public void execute() {
UID[] _from = from.toArray(new UID[from.size()]);
Block[] _where = where.toArray(new Block[where.size()]);
List<STMT> added = null;
List<STMT> removed = null;
if (!insert.isEmpty()) {
CloseableIterator<STMT> stmts = new RDFQueryImpl(connection)
.from(_from).where(_where)
.construct(insert.toArray(new Block[insert.size()]));
added = convertStatements(stmts, into);
// System.err.println("added " + added);
}
if (!delete.isEmpty()) {
CloseableIterator<STMT> stmts = new RDFQueryImpl(connection)
.from(_from).where(_where)
.construct(delete.toArray(new Block[delete.size()]));
removed = convertStatements(stmts, from);
// System.err.println("removed " + removed);
}
connection.update(removed, added);
}
private List<STMT> convertStatements(CloseableIterator<STMT> stmts, List<UID> contexts) {
List<STMT> rv = new ArrayList<STMT>();
try {
while (stmts.hasNext()) {
STMT stmt = stmts.next();
if (!contexts.isEmpty()) {
for (UID uid : contexts) {
rv.add(new STMT(stmt, uid));
}
} else {
rv.add(stmt);
}
}
} finally {
stmts.close();
}
return rv;
}
@Override
public RDFUpdate delete(PatternBlock... patterns) {
this.delete.addAll(Arrays.asList(patterns));
return this;
}
@Override
public RDFUpdate from(UID... uids) {
this.from.addAll(Arrays.asList(uids));
return this;
}
@Override
public RDFUpdate insert(PatternBlock... patterns) {
this.insert.addAll(Arrays.asList(patterns));
return this;
}
@Override
public RDFUpdate into(UID... uids) {
this.into.addAll(Arrays.asList(uids));
return this;
}
@Override
public RDFUpdate where(Block... blocks) {
this.where.addAll(Arrays.asList(blocks));
return this;
}
}