-
-
Notifications
You must be signed in to change notification settings - Fork 238
/
SirixQueryContext.java
66 lines (51 loc) · 1.8 KB
/
SirixQueryContext.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package org.sirix.xquery;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
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;
public final class SirixQueryContext extends QueryContext {
public enum CommitStrategy {
AUTO,
EXPLICIT
}
private CommitStrategy mCommitStrategy;
public SirixQueryContext(final DBStore store) {
this(store, CommitStrategy.AUTO);
}
public SirixQueryContext(final DBStore store, final CommitStrategy commitStrategy) {
super(store);
mCommitStrategy = checkNotNull(commitStrategy);
}
@Override
public void applyUpdates() throws QueryException {
super.applyUpdates();
if (mCommitStrategy == CommitStrategy.AUTO) {
final List<UpdateOp> updateList =
getUpdateList() != null ? getUpdateList().list() : Collections.emptyList();
if (!updateList.isEmpty()) {
final Function<Sequence, XdmNodeReadTrx> mapDBNodeToWtx = sequence -> {
if (sequence instanceof DBNode) {
final XdmNodeReadTrx trx = ((DBNode) sequence).getTrx();
return trx;
}
// Can not occur (must be a write transaction).
throw new IllegalStateException();
};
final Set<Long> trxIDs = new HashSet<>();
updateList.stream().map(UpdateOp::getTarget).map(mapDBNodeToWtx)
.filter(trx -> trxIDs.add(trx.getId()))
.forEach(trx -> ((XdmNodeWriteTrx) trx).commit());
}
}
}
}