Skip to content

Commit b78375a

Browse files
[FIX] JNodes, fn:generate-id
1 parent edf7b90 commit b78375a

5 files changed

Lines changed: 29 additions & 14 deletions

File tree

basex-core/src/main/java/org/basex/query/func/fn/FnGenerateId.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,6 @@ public final class FnGenerateId extends ContextFn {
1515
@Override
1616
public Str item(final QueryContext qc, final InputInfo ii) throws QueryException {
1717
final GNode node = toGNodeOrNull(context(qc), qc);
18-
if(node == null) return Str.EMPTY;
19-
20-
final TokenBuilder tb = new TokenBuilder(Token.ID);
21-
if(node instanceof final DBNode dbnode) {
22-
tb.addInt(dbnode.data().dbid).add('d').addInt(dbnode.pre());
23-
} else if(node instanceof final FNode fnode) {
24-
tb.addInt(fnode.id);
25-
} else {
26-
tb.add('j').addInt(node.hashCode());
27-
}
28-
return Str.get(tb.finish());
18+
return node != null ? Str.get(node.id()) : Str.EMPTY;
2919
}
3020
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ public final int pre() {
118118
return pre;
119119
}
120120

121+
@Override
122+
public final byte[] id() {
123+
return Token.concat(Token.ID, data().dbid, 'd', pre());
124+
}
125+
121126
@Override
122127
public final byte[] string() {
123128
return data.atom(pre);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ public boolean hasAttributes() {
7272
return false;
7373
}
7474

75+
@Override
76+
public final byte[] id() {
77+
return Token.concat(Token.ID, id);
78+
}
79+
7580
/**
7681
* Returns the string value for the specified nodes.
7782
* @param nodes nodes

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ public final boolean test(final QueryContext qc, final InputInfo ii, final long
6666
*/
6767
public abstract int compare(GNode node);
6868

69+
/**
70+
* Returns a node ID.
71+
* @return ID
72+
*/
73+
public abstract byte[] id();
74+
6975
/**
7076
* Returns the root of a node (the topmost ancestor without parent node).
7177
* @return root node

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,13 @@ private long index() {
156156
long i = index;
157157
if(i != -1) return i;
158158
if(parent.value instanceof final XQMap map) {
159-
i = 1;
159+
i = 0;
160160
for(final Item k : map.keys()) {
161161
if(JNodeTest.equals(k, key)) break;
162162
i++;
163163
}
164164
} else {
165-
i = ((Itr) key).itr();
165+
i = ((Itr) key).itr() - 1;
166166
}
167167
index = i;
168168
return i;
@@ -174,6 +174,15 @@ public int compare(final Item item, final Collation coll, final boolean transiti
174174
throw Util.notExpected();
175175
}
176176

177+
@Override
178+
public byte[] id() {
179+
final TokenBuilder tb = new TokenBuilder(Token.ID);
180+
for(JNode n = this; n != null; n = n.parent) {
181+
tb.addLong(n.parent != null ? n.index() + 1 : n.hashCode()).add('j');
182+
}
183+
return tb.removeLast().finish();
184+
}
185+
177186
@Override
178187
public GNode root() {
179188
return parent != null ? parent.root() : this;
@@ -213,7 +222,7 @@ public BasicNodeIter childIter(final Test test, final boolean descendant) {
213222
if(struct instanceof final XQMap map) {
214223
try {
215224
c = map.getOrNull(s);
216-
} catch(QueryException ex) {
225+
} catch(final QueryException ex) {
217226
throw Util.notExpected(ex);
218227
}
219228
} else {

0 commit comments

Comments
 (0)