Skip to content

Commit 662ca9b

Browse files
[FIX] ArrayBuilder/ValueBuilder: Always pass interruptible job. Closes #2568
1 parent 5f8ada0 commit 662ca9b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+431
-392
lines changed

basex-core/src/main/java/org/basex/io/parse/csv/CsvW3Converter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ protected Value finish(final InputInfo ii, final QueryContext qc) throws QueryEx
3838
final XQMap map = (XQMap) super.finish(ii, qc);
3939
Value columns = copts.get(CsvOptions.HEADER);
4040
if(columns.seqType().instanceOf(BOOLEAN_O)) {
41-
columns = map.get(CsvXQueryConverter.NAMES).atomValue(qc, ii);
41+
columns = map.get(CsvXQueryConverter.NAMES);
42+
if(qc != null) columns = columns.atomValue(qc, ii);
4243
}
4344
final MapBuilder columnIndexBuilder = new MapBuilder();
4445
int i = 0;

basex-core/src/main/java/org/basex/io/parse/json/JsonConverter.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.*;
44

55
import org.basex.build.json.*;
6+
import org.basex.core.jobs.*;
67
import org.basex.io.*;
78
import org.basex.io.in.*;
89
import org.basex.query.*;
@@ -18,7 +19,7 @@
1819
* @author BaseX Team, BSD License
1920
* @author Leo Woerteler
2021
*/
21-
public abstract class JsonConverter {
22+
public abstract class JsonConverter extends Job {
2223
/** Shared data references. */
2324
protected final SharedData shared = new SharedData();
2425
/** JSON options. */
@@ -30,8 +31,8 @@ public abstract class JsonConverter {
3031
protected QueryFunction<byte[], Item> numberParser;
3132
/** Null value. */
3233
protected Value nullValue = Empty.VALUE;
33-
/** Query context (can be {@code null}). */
34-
protected QueryContext qctx;
34+
/** Interruptible job. */
35+
protected Job job;
3536

3637
/**
3738
* Returns a JSON converter for the given configuration.
@@ -92,7 +93,7 @@ public final void nullValue(final Value item) {
9293
public final Value convert(final IO input) throws QueryException, IOException {
9394
final String encoding = jopts.get(JsonParserOptions.ENCODING);
9495
try(NewlineInput ni = new NewlineInput(input, encoding)) {
95-
return convert(ni, input.url(), null, null);
96+
return convert(ni, input.url(), null, this);
9697
}
9798
}
9899

@@ -101,14 +102,14 @@ public final Value convert(final IO input) throws QueryException, IOException {
101102
* @param input input
102103
* @param uri uri (can be empty)
103104
* @param ii input info (can be {@code null})
104-
* @param qc query context (if {@code null}, result may lack XQuery-specific contents)
105+
* @param jb interruptible job
105106
* @return result
106107
* @throws QueryException query exception
107108
* @throws IOException I/O exception
108109
*/
109110
public final Value convert(final TextInput input, final String uri, final InputInfo ii,
110-
final QueryContext qc) throws QueryException, IOException {
111-
qctx = qc;
111+
final Job jb) throws QueryException, IOException {
112+
job = jb;
112113
init(uri);
113114
new JsonParser(input, jopts, this).parse(ii);
114115
return finish();

basex-core/src/main/java/org/basex/io/parse/json/JsonW3Converter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ protected void closeObject() {
8888

8989
@Override
9090
protected void openArray() {
91-
arrays.push(new ArrayBuilder(qctx));
91+
arrays.push(new ArrayBuilder(job));
9292
}
9393

9494
@Override

basex-core/src/main/java/org/basex/query/util/DataBuilder.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.*;
66

77
import org.basex.core.*;
8+
import org.basex.core.jobs.*;
89
import org.basex.data.*;
910
import org.basex.query.*;
1011
import org.basex.query.iter.*;
@@ -24,8 +25,8 @@
2425
* @author Christian Gruen
2526
*/
2627
public final class DataBuilder {
27-
/** Query context. */
28-
private final QueryContext qc;
28+
/** Interruptible job. */
29+
private final Job job;
2930
/** Target data instance. */
3031
private final MemData data;
3132
/** Full-text result builder. */
@@ -34,11 +35,11 @@ public final class DataBuilder {
3435
/**
3536
* Constructor.
3637
* @param data target data
37-
* @param qc query context (can be {@code null})
38+
* @param job interruptible job (can be {@code null})
3839
*/
39-
public DataBuilder(final MemData data, final QueryContext qc) {
40+
public DataBuilder(final MemData data, final Job job) {
4041
this.data = data;
41-
this.qc = qc;
42+
this.job = job != null ? job : new Job() { };
4243
}
4344

4445
/**
@@ -99,7 +100,7 @@ private static void limit(final int value, final int limit, final String message
99100
* @return PRE value of next node
100101
*/
101102
private int addNode(final ANode node, final int pre, final int par) {
102-
if(qc != null) qc.checkStop();
103+
job.checkStop();
103104
return switch((NodeType) node.type) {
104105
case DOCUMENT_NODE -> addDoc(node, pre);
105106
case ELEMENT -> addElem(node, pre, par);

basex-core/src/main/java/org/basex/query/util/DeepEqual.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ public final class DeepEqual {
2121

2222
/** Input info (can be {@code null}). */
2323
public final InputInfo info;
24-
/** Query context (to interrupt process, can be {@code null}). */
24+
/** Query context (can be {@code null}). */
2525
public final QueryContext qc;
2626
/** Collation. */
2727
public final Collation coll;
2828
/** Options. */
2929
public final DeepEqualOptions options;
3030

31-
/** Comparison function. */
31+
/** Comparison function (requires {@link #qc} to be assigned). */
3232
public FItem itemsEqual;
3333
/** Flag for nested node comparisons. */
3434
public boolean nested;

basex-core/src/main/java/org/basex/query/util/fingertree/DeepTree.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.basex.query.util.fingertree;
22

3-
import org.basex.query.*;
3+
import org.basex.core.jobs.*;
44
import org.basex.util.*;
55

66
/**
@@ -245,14 +245,14 @@ public DeepTree<N, E> concat(final Node<N, E>[] nodes, final long sz,
245245
}
246246

247247
@Override
248-
public FingerTree<N, E> reverse(final QueryContext qc) {
249-
qc.checkStop();
248+
public FingerTree<N, E> reverse(final Job job) {
249+
job.checkStop();
250250
final int l = left.length, r = right.length;
251251
@SuppressWarnings("unchecked")
252252
final Node<N, E>[] newLeft = new Node[r], newRight = new Node[l];
253253
for(int i = 0; i < r; i++) newLeft[i] = right[r - 1 - i].reverse();
254254
for(int i = 0; i < l; i++) newRight[i] = left[l - 1 - i].reverse();
255-
return new DeepTree<>(newLeft, rightSize(), middle.reverse(qc), newRight, size);
255+
return new DeepTree<>(newLeft, rightSize(), middle.reverse(job), newRight, size);
256256
}
257257

258258
@Override
@@ -289,8 +289,8 @@ public FingerTree<N, E> set(final long pos, final E val) {
289289
}
290290

291291
@Override
292-
public FingerTree<N, E> insert(final long pos, final E val, final QueryContext qc) {
293-
qc.checkStop();
292+
public FingerTree<N, E> insert(final long pos, final E val, final Job job) {
293+
job.checkStop();
294294
if(pos <= leftSize) {
295295
// insert into left digit
296296
int i = 0;
@@ -338,7 +338,7 @@ public FingerTree<N, E> insert(final long pos, final E val, final QueryContext q
338338
long p = pos - leftSize;
339339
final long midSize = middle.size();
340340
if(p < midSize)
341-
return new DeepTree<>(left, leftSize, middle.insert(p, val, qc), right, size + 1);
341+
return new DeepTree<>(left, leftSize, middle.insert(p, val, job), right, size + 1);
342342

343343
// insert into right digit
344344
p -= midSize;
@@ -384,13 +384,13 @@ public FingerTree<N, E> insert(final long pos, final E val, final QueryContext q
384384
}
385385

386386
@Override
387-
public TreeSlice<N, E> remove(final long pos, final QueryContext qc) {
388-
qc.checkStop();
387+
public TreeSlice<N, E> remove(final long pos, final Job job) {
388+
job.checkStop();
389389
if(pos < leftSize) return new TreeSlice<>(removeLeft(pos));
390390
final long rightStart = leftSize + middle.size();
391391
if(pos >= rightStart) return new TreeSlice<>(removeRight(pos - rightStart));
392392

393-
final TreeSlice<Node<N, E>, E> slice = middle.remove(pos - leftSize, qc);
393+
final TreeSlice<Node<N, E>, E> slice = middle.remove(pos - leftSize, job);
394394
if(slice.isTree()) {
395395
// no underflow
396396
final FingerTree<Node<N, E>, E> newMiddle = slice.getTree();

basex-core/src/main/java/org/basex/query/util/fingertree/EmptyTree.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.basex.query.util.fingertree;
22

3-
import org.basex.query.*;
3+
import org.basex.core.jobs.*;
44
import org.basex.util.*;
55

66
/**
@@ -83,17 +83,17 @@ public TreeSlice<N, E> slice(final long pos, final long len) {
8383
}
8484

8585
@Override
86-
public FingerTree<N, E> reverse(final QueryContext qc) {
86+
public FingerTree<N, E> reverse(final Job job) {
8787
return this;
8888
}
8989

9090
@Override
91-
public FingerTree<N, E> insert(final long pos, final E val, final QueryContext qc) {
91+
public FingerTree<N, E> insert(final long pos, final E val, final Job job) {
9292
throw Util.notExpected();
9393
}
9494

9595
@Override
96-
public TreeSlice<N, E> remove(final long pos, final QueryContext qc) {
96+
public TreeSlice<N, E> remove(final long pos, final Job job) {
9797
throw Util.notExpected();
9898
}
9999

basex-core/src/main/java/org/basex/query/util/fingertree/FingerTree.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java.util.*;
44

5-
import org.basex.query.*;
5+
import org.basex.core.jobs.*;
66
import org.basex.util.*;
77

88
/**
@@ -184,28 +184,28 @@ public final E get(final long index) {
184184

185185
/**
186186
* Creates a reversed version of this tree.
187-
* @param qc query context
187+
* @param job interruptible job
188188
* @return reversed tree
189189
*/
190-
public abstract FingerTree<N, E> reverse(QueryContext qc);
190+
public abstract FingerTree<N, E> reverse(Job job);
191191

192192
/**
193193
* Inserts the given value at the given position into this tree.
194194
* @param pos position to insert at
195195
* @param val value to insert
196-
* @param qc query context
196+
* @param job interruptible job
197197
* @return resulting tree
198198
*/
199-
public abstract FingerTree<N, E> insert(long pos, E val, QueryContext qc);
199+
public abstract FingerTree<N, E> insert(long pos, E val, Job job);
200200

201201
/**
202202
* Removes an element from this tree.
203203
* @param pos position of the element to remove
204-
* @param qc query context
204+
* @param job interruptible job
205205
* @return resulting (potentially partial) tree
206206
* @throws AssertionError if this tree is empty
207207
*/
208-
public abstract TreeSlice<N, E> remove(long pos, QueryContext qc);
208+
public abstract TreeSlice<N, E> remove(long pos, Job job);
209209

210210
/**
211211
* Extracts a slice from this tree containing the {@code len} elements starting with that at

basex-core/src/main/java/org/basex/query/util/fingertree/SingletonTree.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.basex.query.util.fingertree;
22

3-
import org.basex.query.*;
3+
import org.basex.core.jobs.*;
44

55
/**
66
* A tree consisting of a single value.
@@ -71,7 +71,7 @@ public FingerTree<N, E> concat(final Node<N, E>[] mid, final long size,
7171
}
7272

7373
@Override
74-
public FingerTree<N, E> reverse(final QueryContext qc) {
74+
public FingerTree<N, E> reverse(final Job job) {
7575
return new SingletonTree<>(elem.reverse());
7676
}
7777

@@ -81,7 +81,7 @@ public FingerTree<N, E> set(final long pos, final E val) {
8181
}
8282

8383
@Override
84-
public FingerTree<N, E> insert(final long pos, final E val, final QueryContext qc) {
84+
public FingerTree<N, E> insert(final long pos, final E val, final Job job) {
8585
@SuppressWarnings("unchecked")
8686
final Node<N, E>[] siblings = new Node[4];
8787
if(!elem.insert(siblings, pos, val)) {
@@ -96,7 +96,7 @@ public FingerTree<N, E> insert(final long pos, final E val, final QueryContext q
9696
}
9797

9898
@Override
99-
public TreeSlice<N, E> remove(final long pos, final QueryContext qc) {
99+
public TreeSlice<N, E> remove(final long pos, final Job job) {
100100
final NodeLike<N, E>[] removed = elem.remove(null, null, pos);
101101
return new TreeSlice<>(removed[1]);
102102
}

0 commit comments

Comments
 (0)