package com.mysema.rdfbean.model; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mysema.commons.lang.IteratorAdapter; /** * @author tiwe * */ public class SPARQLUpdateClause implements SPARQLUpdate { private static final Logger logger = LoggerFactory.getLogger(SPARQLUpdateClause.class); private final RDFConnection connection; private final UpdateClause clause; public SPARQLUpdateClause(RDFConnection connection, UpdateClause clause) { this.connection = connection; this.clause = clause; } public SPARQLUpdateClause(RDFConnection connection, String clause) { try { this.connection = connection; this.clause = new SPARQLUpdateParser().parse(clause); } catch (IOException e) { throw new RepositoryException(e); } } @Override public void execute() { switch (clause.getType()) { case CLEAR: case DROP: connection.remove(null, null, null, clause.getSource()); case CREATE: case LOAD: // TODO break; case DELETE: executeDelete(); break; case INSERT: executeInsert(); break; case MODIFY: executeModify(); break; default: throw new IllegalStateException("Unknown clause " + clause.getType()); } } private long executeModify() { List<STMT> added = null, removed = null; if (clause.getInsert() != null) { added = getTriples(clause.getInsert(), clause.getPattern()); } if (clause.getDelete() != null) { removed = getTriples(clause.getDelete(), clause.getPattern()); } connection.update(removed, added); return 0l; } private long executeInsert() { List<STMT> stmts = getTriples(clause.getTemplate(), clause.getPattern()); connection.update(null, stmts); return 0l; } private long executeDelete() { List<STMT> stmts = getTriples(clause.getTemplate(), clause.getPattern()); connection.update(stmts, null); return 0l; } private List<STMT> getTriples(String template, @Nullable String pattern) { // if (pattern == null ) { // // TODO : parse as Turtle // } StringBuilder qry = new StringBuilder(); for (Map.Entry<String, String> prefix : clause.getPrefixes().entrySet()) { qry.append("PREFIX " + prefix.getKey() + ": <" + prefix.getValue() + ">\n"); } qry.append("CONSTRUCT { " + template + " }\n"); if (pattern != null) { for (UID uid : clause.getFrom()) { qry.append("FROM <" + uid.getId() + ">\n"); } qry.append("WHERE { " + pattern + " }\n"); } else { qry.append("WHERE { ?sss ?ppp ?ooo } LIMIT 1"); // XXX : improve // this } logger.info(qry.toString()); SPARQLQuery query = connection.createQuery(QueryLanguage.SPARQL, qry.toString()); List<STMT> stmts = IteratorAdapter.asList(query.getTriples()); if (clause.getInto().isEmpty() && clause.getFrom().isEmpty()) { return stmts; } else { List<UID> sources = clause.getInto().isEmpty() ? clause.getFrom() : clause.getInto(); List<STMT> rv = new ArrayList<STMT>(stmts.size() * sources.size()); for (STMT stmt : stmts) { for (UID uid : sources) { rv.add(new STMT(stmt, uid)); } } return rv; } } }