Skip to content

Commit 1cea00c

Browse files
[MOD] XQuery: better static typing of arrays
1 parent acea87b commit 1cea00c

27 files changed

+113
-31
lines changed

basex-core/src/main/java/org/basex/query/QueryPlan.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ public FBuilder create(final ExprInfo expr, final Object... atts) {
104104
addAttribute(elem, atts[a], atts[a + 1]);
105105
}
106106
if(expr instanceof final Expr ex) {
107-
attachType(elem, ex.seqType(), ex.size(), ex.data());
107+
attachType(elem, ex.seqType(), ex.size(), ex.structSize(), ex.data());
108108
} else if(expr instanceof StaticDecl) {
109-
attachType(elem, ((StaticDecl) expr).seqType(), -1, null);
109+
attachType(elem, ((StaticDecl) expr).seqType(), -1, -1, null);
110110
}
111111
final InputInfo info = expr.info();
112112
if(info != null) attach(elem, info);
@@ -148,7 +148,7 @@ public FBuilder attachVariable(final FBuilder elem, final Var var, final boolean
148148
addAttribute(elem, NAME, var.toErrorString());
149149
addAttribute(elem, ID, var.id);
150150
if(var.declType != null) addAttribute(elem, AS, var.declType);
151-
if(type) attachType(elem, var.seqType(), var.size(), var.data());
151+
if(type) attachType(elem, var.seqType(), var.size(), -1, var.data());
152152
}
153153
return elem;
154154
}
@@ -158,12 +158,14 @@ public FBuilder attachVariable(final FBuilder elem, final Var var, final boolean
158158
* @param elem element to which attributes will be added
159159
* @param seqType sequence type
160160
* @param size result size
161+
* @param structSize struct size
161162
* @param data data reference (can be {@code null})
162163
*/
163164
private void attachType(final FBuilder elem, final SeqType seqType, final long size,
164-
final Data data) {
165+
final long structSize, final Data data) {
165166
addAttribute(elem, TYPE, seqType);
166167
if(size != -1) addAttribute(elem, SIZE, size);
168+
if(structSize != -1) addAttribute(elem, STRUCT_SIZE, structSize);
167169
if(data != null) addAttribute(elem, DATABASE, data.meta.name);
168170
}
169171

basex-core/src/main/java/org/basex/query/QueryText.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ public interface QueryText {
346346
/** Query Info. */ String DIR = "dir";
347347
/** Query Info. */ String PRE = "pre";
348348
/** Query Info. */ String SIZE = "size";
349+
/** Query Info. */ String STRUCT_SIZE = "structSize";
349350
/** Query Info. */ String AXIS = "axis";
350351
/** Query Info. */ String TEST = "test";
351352
/** Query Info. */ String MIN = "min";

basex-core/src/main/java/org/basex/query/expr/StructFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public Item item(final QueryContext qc, final InputInfo ii) throws QueryExceptio
6767
qf.pos = a.incrementAndGet();
6868
if(expr.test(qc, info, a.get())) ab.add(value);
6969
}
70-
item = ab.array();
70+
item = ab.array(this);
7171
} else {
7272
// maps
7373
final MapBuilder mb = new MapBuilder();
@@ -79,7 +79,7 @@ public Item item(final QueryContext qc, final InputInfo ii) throws QueryExceptio
7979
qf.pos = a.incrementAndGet();
8080
if(expr.test(qc, info, a.get())) mb.put(key, value);
8181
});
82-
item = mb.map();
82+
item = mb.map(this);
8383
}
8484
}
8585
return item;

basex-core/src/main/java/org/basex/query/expr/constr/CArray.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public Expr optimize(final CompileContext cc) throws QueryException {
4747

4848
@Override
4949
public XQArray item(final QueryContext qc, final InputInfo ii) throws QueryException {
50-
final ArrayBuilder ab = new ArrayBuilder(qc);
50+
final ArrayBuilder ab = new ArrayBuilder(qc, exprs.length);
5151
for(final Expr expr : exprs) ab.add(expr.value(qc));
5252
return ab.array(this);
5353
}
@@ -70,6 +70,11 @@ public boolean equals(final Object obj) {
7070
return obj instanceof CArray && super.equals(obj);
7171
}
7272

73+
@Override
74+
public long structSize() {
75+
return exprs.length;
76+
}
77+
7378
@Override
7479
public String description() {
7580
return "squared " + ARRAY + " constructor";

basex-core/src/main/java/org/basex/query/expr/constr/CItemArray.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ public boolean equals(final Object obj) {
6363
return obj instanceof CItemArray && super.equals(obj);
6464
}
6565

66+
@Override
67+
public long structSize() {
68+
return expr.size();
69+
}
70+
6671
@Override
6772
public String description() {
6873
return "curly " + ARRAY + " constructor";

basex-core/src/main/java/org/basex/query/func/array/ArrayAppend.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,10 @@ protected Expr opt(final CompileContext cc) throws QueryException {
3434
}
3535
return this;
3636
}
37+
38+
@Override
39+
public long structSize() {
40+
final long as = arg(0).structSize();
41+
return as != -1 ? as + 1 : -1;
42+
}
3743
}

basex-core/src/main/java/org/basex/query/func/array/ArrayBuild.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ public XQArray item(final QueryContext qc, final InputInfo ii) throws QueryExcep
2323
if(action == null) return XQArray.items(arg(0).value(qc));
2424

2525
final Iter input = arg(0).iter(qc);
26-
final ArrayBuilder ab = new ArrayBuilder(qc);
26+
final ArrayBuilder ab = new ArrayBuilder(qc, input.size());
2727
final HofArgs args = new HofArgs(2, action);
2828
for(Item item; (item = qc.next(input)) != null;) {
2929
ab.add(invoke(action, args.set(0, item).inc(), qc));
3030
}
31-
return ab.array();
31+
return ab.array(this);
3232
}
3333

3434
@Override

basex-core/src/main/java/org/basex/query/func/array/ArrayEmpty.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ protected Expr opt(final CompileContext cc) {
3131
final Expr array = arg(0);
3232
if(array.seqType().type instanceof ArrayType) {
3333
final long size = array.structSize();
34-
if(size >= 0 && !array.has(Flag.NDT)) return Bln.get(size == 0);
34+
if(size != -1 && !array.has(Flag.NDT)) return Bln.get(size == 0);
3535
}
3636
return this;
3737
}

basex-core/src/main/java/org/basex/query/func/array/ArrayForEach.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public XQArray item(final QueryContext qc, final InputInfo ii) throws QueryExcep
2222
final FItem action = toFunction(arg(1), 2, qc);
2323

2424
final HofArgs args = new HofArgs(2, action);
25-
final ArrayBuilder ab = new ArrayBuilder(qc);
25+
final ArrayBuilder ab = new ArrayBuilder(qc, array.structSize());
2626
for(final Value value : array.iterable()) {
2727
ab.add(invoke(action, args.set(0, value).inc(), qc));
2828
}
@@ -46,6 +46,11 @@ protected Expr opt(final CompileContext cc) throws QueryException {
4646
return this;
4747
}
4848

49+
@Override
50+
public long structSize() {
51+
return arg(0).structSize();
52+
}
53+
4954
@Override
5055
public int hofIndex() {
5156
return 1;

basex-core/src/main/java/org/basex/query/func/array/ArrayForEachPair.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ public XQArray item(final QueryContext qc, final InputInfo ii) throws QueryExcep
2424
final FItem action = toFunction(arg(2), 3, qc);
2525

2626
final HofArgs args = new HofArgs(3, action);
27-
final ArrayBuilder ab = new ArrayBuilder(qc);
28-
final Iterator<Value> as = array1.iterator(0), bs = array2.iterator(0);
29-
while(as.hasNext() && bs.hasNext()) {
30-
ab.add(invoke(action, args.set(0, as.next()).set(1, bs.next()).inc(), qc));
27+
final long as = Math.min(array1.structSize(), array2.structSize());
28+
final ArrayBuilder ab = new ArrayBuilder(qc, as);
29+
final Iterator<Value> iter1 = array1.iterator(0), iter2 = array2.iterator(0);
30+
while(iter1.hasNext() && iter2.hasNext()) {
31+
ab.add(invoke(action, args.set(0, iter1.next()).set(1, iter2.next()).inc(), qc));
3132
}
3233
return ab.array(this);
3334
}
@@ -50,6 +51,12 @@ protected Expr opt(final CompileContext cc) throws QueryException {
5051
return this;
5152
}
5253

54+
@Override
55+
public long structSize() {
56+
final long as1 = arg(0).structSize(), as2 = arg(0).structSize();
57+
return as1 != -1 && as2 != -1 ? Math.min(as1, as2) : -1;
58+
}
59+
5360
@Override
5461
public int hofIndex() {
5562
return 2;

0 commit comments

Comments
 (0)