From 69ce0220e3a57815484b314734cafafb1f7ebe7a Mon Sep 17 00:00:00 2001 From: Johannes Lichtenberger Date: Sun, 13 Aug 2017 23:52:57 +0200 Subject: [PATCH] [FIX] Committing of update list. --- .../org/sirix/xquery/SirixQueryContext.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/bundles/sirix-xquery/src/main/java/org/sirix/xquery/SirixQueryContext.java b/bundles/sirix-xquery/src/main/java/org/sirix/xquery/SirixQueryContext.java index 9a7a2162d..c0a38e746 100644 --- a/bundles/sirix-xquery/src/main/java/org/sirix/xquery/SirixQueryContext.java +++ b/bundles/sirix-xquery/src/main/java/org/sirix/xquery/SirixQueryContext.java @@ -3,13 +3,16 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; +import java.util.HashSet; import java.util.List; -import java.util.Optional; +import java.util.Set; +import java.util.function.Function; import org.brackit.xquery.QueryContext; import org.brackit.xquery.QueryException; import org.brackit.xquery.update.op.UpdateOp; import org.brackit.xquery.xdm.Sequence; +import org.sirix.api.XdmNodeReadTrx; import org.sirix.api.XdmNodeWriteTrx; import org.sirix.xquery.node.DBNode; import org.sirix.xquery.node.DBStore; @@ -42,16 +45,22 @@ public void applyUpdates() throws QueryException { getUpdateList() != null ? getUpdateList().list() : Collections.emptyList(); if (!updateList.isEmpty()) { - commit(updateList.get(0).getTarget()); - } - } - } + final Function mapDBNodeToWtx = sequence -> { + if (sequence instanceof DBNode) { + final XdmNodeReadTrx trx = ((DBNode) sequence).getTrx(); + return trx; + } - private void commit(Sequence item) { - if (item instanceof DBNode) { - final Optional trx = - ((DBNode) item).getTrx().getResourceManager().getNodeWriteTrx(); - trx.ifPresent(XdmNodeWriteTrx::commit); + // Can not occur (must be a write transaction). + throw new IllegalStateException(); + }; + + final Set trxIDs = new HashSet<>(); + + updateList.stream().map(UpdateOp::getTarget).map(mapDBNodeToWtx) + .filter(trx -> trxIDs.add(trx.getId())) + .forEach(trx -> ((XdmNodeWriteTrx) trx).commit()); + } } } }