package org.aksw.jena_sparql_api.core.utils; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Set; import org.aksw.commons.collections.diff.Diff; import org.aksw.jena_sparql_api.utils.ElementUtils; import org.aksw.jena_sparql_api.utils.SetGraph; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.apache.jena.graph.Triple; import org.apache.jena.rdf.model.Model; import org.apache.jena.sparql.core.DatasetDescription; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.modify.request.QuadDataAcc; import org.apache.jena.sparql.modify.request.UpdateData; import org.apache.jena.sparql.modify.request.UpdateDataDelete; import org.apache.jena.sparql.modify.request.UpdateDataInsert; import org.apache.jena.sparql.modify.request.UpdateDeleteInsert; import org.apache.jena.sparql.modify.request.UpdateModify; import org.apache.jena.sparql.syntax.Element; import org.apache.jena.update.Update; import org.apache.jena.update.UpdateFactory; import org.apache.jena.update.UpdateRequest; public class UpdateRequestUtils { public static UpdateRequest clone(UpdateRequest request) { UpdateRequest result = new UpdateRequest(); result.setBaseURI(request.getBaseURI()); result.setPrefixMapping(request.getPrefixMapping()); result.setResolver(request.getResolver()); for(Update update : request.getOperations()) { Update clone = UpdateUtils.clone(update); result.add(clone); } return result; } public static void applyWithIri(UpdateRequest updateRequest, String withIri) { for(Update update : updateRequest.getOperations()) { UpdateUtils.applyWithIriIfApplicable(update, withIri); } } public static void applyDatasetDescription(UpdateRequest updateRequest, DatasetDescription dg) { for(Update update : updateRequest.getOperations()) { UpdateUtils.applyDatasetDescriptionIfApplicable(update, dg); } } public static void fixVarNames(UpdateRequest updateRequest) { List<Update> updates = updateRequest.getOperations(); for(Update update : updates) { if(update instanceof UpdateDeleteInsert) { UpdateDeleteInsert x = (UpdateDeleteInsert)update; Element before = x.getWherePattern(); Element after = ElementUtils.fixVarNames(before); x.setElement(after); } else if(update instanceof UpdateModify) { UpdateModify x = (UpdateModify)update; Element before = x.getWherePattern(); Element after = ElementUtils.fixVarNames(before); x.setElement(after); } } } public static UpdateRequest createUpdateRequestDatasetGraph(Diff<? extends DatasetGraph> diff) { Iterator<Quad> a = diff.getAdded().find(); Iterator<Quad> b = diff.getRemoved().find(); UpdateRequest result = createUpdateRequest(a, b); return result; } public static UpdateRequest createUpdateRequest(Diff<? extends Iterable<? extends Quad>> diff) { UpdateRequest result = createUpdateRequest(diff.getAdded(), diff.getRemoved()); return result; } public static UpdateRequest createUpdateRequest(Model added, Model removed) { Set<Triple> _a = added == null ? Collections.<Triple>emptySet() : SetGraph.wrap(added.getGraph()); Set<Triple> _r = removed == null ? Collections.<Triple>emptySet() : SetGraph.wrap(removed.getGraph()); Iterable<Quad> a = Iterables.transform(_a, FN_QuadFromTriple.fnDefaultGraphNodeGenerated); Iterable<Quad> r = Iterables.transform(_r, FN_QuadFromTriple.fnDefaultGraphNodeGenerated); UpdateRequest result = createUpdateRequest(a, r); return result; } public static UpdateRequest createUpdateRequest(Iterable<? extends Quad> added, Iterable<? extends Quad> removed) { Iterator<? extends Quad> a = added.iterator(); Iterator<? extends Quad> b = removed.iterator(); UpdateRequest result = createUpdateRequest(a, b); return result; } public static UpdateRequest createUpdateRequest(Iterator<? extends Quad> added, Iterator<? extends Quad> removed) { UpdateRequest result = new UpdateRequest(); if(added != null && added.hasNext()) { QuadDataAcc insertQuads = new QuadDataAcc(Lists.newArrayList(added)); UpdateData insertData = new UpdateDataInsert(insertQuads); result.add(insertData); } if(removed != null && removed.hasNext()) { QuadDataAcc deleteQuads = new QuadDataAcc(Lists.newArrayList(removed)); UpdateData deleteData = new UpdateDataDelete(deleteQuads); result.add(deleteData); } return result; } public static UpdateRequest parse(String requestStr) { UpdateRequest result = new UpdateRequest(); UpdateFactory.parse(result, requestStr); return result; } }