Skip to content

Commit 84de4f3

Browse files
[MOD] XQuery, map constructor, JNodes. qtspecs#2525
1 parent feb869b commit 84de4f3

File tree

6 files changed

+31
-12
lines changed

6 files changed

+31
-12
lines changed

basex-core/src/main/java/org/basex/io/serial/AdaptiveSerializer.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.basex.query.value.item.*;
1414
import org.basex.query.value.map.*;
1515
import org.basex.query.value.node.*;
16-
import org.basex.query.value.seq.*;
1716
import org.basex.query.value.type.*;
1817
import org.basex.util.*;
1918

@@ -72,15 +71,15 @@ public final void serialize(final Item item) throws IOException {
7271

7372
@Override
7473
protected void jnode(final JNode jnode) throws IOException {
75-
if(jnode.key != Empty.VALUE) {
74+
if(jnode.isRoot()) {
75+
printChars(QueryText.JTREE);
76+
printChar('(');
77+
} else {
7678
printChars(Token.token(QueryText.JNODE));
7779
printChar('(');
7880
super.serialize(jnode.key);
7981
printChar(':');
8082
if(indent) printChar(' ');
81-
} else {
82-
printChars(QueryText.JTREE);
83-
printChar('(');
8483
}
8584
int cc = 0;
8685
if(jnode.value.size() > 1) printChar('(');

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.basex.query.value.*;
1414
import org.basex.query.value.item.*;
1515
import org.basex.query.value.map.*;
16+
import org.basex.query.value.node.*;
1617
import org.basex.query.value.seq.*;
1718
import org.basex.query.value.type.*;
1819
import org.basex.query.var.*;
@@ -157,9 +158,19 @@ public XQMap item(final QueryContext qc, final InputInfo ii) throws QueryExcepti
157158
if(exprs[e + 1] != Empty.UNDEFINED) {
158159
add.accept(toAtomItem(exprs[e], qc), exprs[e + 1].value(qc));
159160
} else {
160-
final Iter iter = exprs[e].unwrappedIter(qc);
161+
final Iter iter = exprs[e].iter(qc);
161162
for(Item item; (item = iter.next()) != null;) {
162-
toMap(item).forEach(add);
163+
Item it;
164+
if(item instanceof final JNode jnode) {
165+
if(jnode.isRoot()) {
166+
it = (Item) jnode.value;
167+
} else {
168+
it = XQMap.get(jnode.key, jnode.value);
169+
}
170+
} else {
171+
it = item;
172+
}
173+
toMap(it).forEach(add);
163174
}
164175
}
165176
}

basex-core/src/main/java/org/basex/query/expr/path/JNodeTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ public static boolean equals(final Value v1, final Value v2) {
8282
@Override
8383
public boolean matches(final GNode node) {
8484
if(node instanceof final JNode jnode) {
85-
final Item k1 = key, k2 = jnode.key;
86-
return (k1 == null || (k1 == Empty.VALUE ? k2 == Empty.VALUE : equals(k1, k2))) &&
85+
return (key == null || (key == Empty.VALUE ? jnode.isRoot() : equals(key, jnode.key))) &&
8786
valueType.instance(jnode.value);
8887
}
8988
return false;

basex-core/src/main/java/org/basex/query/expr/path/NameTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.basex.query.*;
55
import org.basex.query.value.item.*;
66
import org.basex.query.value.node.*;
7-
import org.basex.query.value.seq.*;
87
import org.basex.query.value.type.*;
98
import org.basex.util.*;
109

@@ -123,7 +122,7 @@ public boolean matches(final GNode node) {
123122
if(node instanceof final JNode jnode) {
124123
// JNodes
125124
if(scope == Scope.ALL) return true;
126-
if(jnode.key == Empty.VALUE) return false;
125+
if(jnode.isRoot()) return false;
127126
if(scope == Scope.FLEXIBLE) {
128127
try {
129128
return Token.eq(qname.string(), jnode.key.string(null));

basex-core/src/main/java/org/basex/query/value/node/JNode.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ public JNode(final Item key, final Value value, final JNode parent, final long i
8080
this.position = position;
8181
}
8282

83+
/**
84+
* Indicates if this is a root node.
85+
* @return result of check
86+
*/
87+
public boolean isRoot() {
88+
return key == Empty.VALUE;
89+
}
90+
8391
@Override
8492
public Value atomValue(final QueryContext qc, final InputInfo ii) throws QueryException {
8593
return value.atomValue(qc, ii);
@@ -335,7 +343,7 @@ public Value materialize(final Predicate<Data> test, final InputInfo ii, final Q
335343
@Override
336344
public void toString(final QueryString qs) {
337345
qs.token(QueryText.JTREE);
338-
if(key == Empty.VALUE) {
346+
if(isRoot()) {
339347
qs.paren(value);
340348
} else {
341349
qs.token('(').token(key).token(':').token(value).token(')');

basex-core/src/test/java/org/basex/query/expr/XQuery4Test.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,9 @@ public final class XQuery4Test extends SandboxTest {
713713
check("{ 0: 0, { 1: 1 } } => map:size()", 2, root(Itr.class));
714714
check("{ 0: 0, (1 to 6) ! { .: . } } => map:size()", 7, root(_MAP_SIZE));
715715

716+
query("{ 'a': 'b' }/. ! { . }", "{\"a\":\"b\"}");
717+
query("{ 'a': 'b' }/a ! { . }", "{\"a\":\"b\"}");
718+
716719
check("{ 1: 1, <a/>[. = 'b'] }", "{1:1}",
717720
root(CMap.class), type(CMap.class, "map(*)"));
718721
check("{ 1: <a/>[. = 'b'], 2: 1 }", "{1:(),2:1}",

0 commit comments

Comments
 (0)