Skip to content

Commit ab4e41b

Browse files
authored
Merge pull request #164 from evolvedbinary/6.x.x/hotfix/axes-navigation
[6.x.x] Improvements to XPath Axes navigation
2 parents e470cb5 + 11d0683 commit ab4e41b

File tree

20 files changed

+719
-178
lines changed

20 files changed

+719
-178
lines changed

exist-core/pom.xml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,7 @@
776776
<include>src/test/resources/log4j2.xml</include>
777777
<include>src/test/resources/standalone-webapp/WEB-INF/web.xml</include>
778778
<include>src/main/xjb/rest-api.xjb</include>
779+
<include>src/test/xquery/parenthesizedLocationStep.xml</include>
779780
<include>src/test/xquery/tail-recursion.xml</include>
780781
<include>src/test/xquery/maps/maps.xqm</include>
781782
<include>src/test/xquery/numbers/format-numbers.xql</include>
@@ -888,6 +889,7 @@
888889
<include>src/main/java/org/exist/dom/persistent/DocumentSet.java</include>
889890
<include>src/main/java/org/exist/dom/persistent/DocumentTypeImpl.java</include>
890891
<include>src/main/java/org/exist/dom/persistent/ElementImpl.java</include>
892+
<include>src/main/java/org/exist/dom/persistent/EmptyNodeSet.java</include>
891893
<include>src/main/java/org/exist/dom/persistent/LockToken.java</include>
892894
<include>src/main/java/org/exist/dom/persistent/Match.java</include>
893895
<include>src/main/java/org/exist/dom/persistent/NewArrayNodeSet.java</include>
@@ -950,6 +952,7 @@
950952
<include>src/main/java/org/exist/management/impl/JMXAgent.java</include>
951953
<include>src/main/java/org/exist/management/impl/SanityReport.java</include>
952954
<include>src/main/java/org/exist/numbering/DLN.java</include>
955+
<include>src/main/java/org/exist/numbering/DLNBase.java</include>
953956
<include>src/main/java/org/exist/numbering/DLNFactory.java</include>
954957
<include>src/test/java/org/exist/numbering/DLNStorageTest.java</include>
955958
<include>src/main/java/org/exist/numbering/NodeId.java</include>
@@ -1179,12 +1182,14 @@
11791182
<include>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java</include>
11801183
<include>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java.java</include>
11811184
<include>src/main/java/org/exist/xquery/ErrorCodes.java</include>
1185+
<include>src/main/java/org/exist/xquery/Except.java</include>
11821186
<include>src/main/java/org/exist/xquery/ExternalModuleImpl.java</include>
11831187
<include>src/main/java/org/exist/xquery/FilteredExpression.java</include>
11841188
<include>src/test/java/org/exist/xquery/ForwardReferenceTest.java</include>
11851189
<include>src/main/java/org/exist/xquery/Function.java</include>
11861190
<include>src/main/java/org/exist/xquery/FunctionFactory.java</include>
11871191
<include>src/test/java/org/exist/xquery/InternalModuleTest.java</include>
1192+
<include>src/main/java/org/exist/xquery/Intersect.java</include>
11881193
<include>src/test/java/org/exist/xquery/LexerTest.java</include>
11891194
<include>src/main/java/org/exist/xquery/LocationStep.java</include>
11901195
<include>src/main/java/org/exist/xquery/Module.java</include>
@@ -1193,6 +1198,7 @@
11931198
<include>src/test/java/org/exist/xquery/NodeTypeTest.java</include>
11941199
<include>src/main/java/org/exist/xquery/Optimizer.java</include>
11951200
<include>src/main/java/org/exist/xquery/Option.java</include>
1201+
<include>src/main/java/org/exist/xquery/PathExpr.java</include>
11961202
<include>src/main/java/org/exist/xquery/PerformanceStats.java</include>
11971203
<include>src/test/java/org/exist/xquery/RestBinariesTest.java</include>
11981204
<include>src/test/java/org/exist/xquery/StoredModuleTest.java</include>
@@ -1269,6 +1275,7 @@
12691275
<include>src/main/java/org/exist/xquery/functions/fn/FunInsertBefore.java</include>
12701276
<include>src/main/java/org/exist/xquery/functions/fn/FunIRIToURI.java</include>
12711277
<include>src/main/java/org/exist/xquery/functions/fn/FunLang.java</include>
1278+
<include>src/test/java/org/exist/xquery/functions/fn/FunLangTest.java</include>
12721279
<include>src/main/java/org/exist/xquery/functions/fn/FunLast.java</include>
12731280
<include>src/main/java/org/exist/xquery/functions/fn/FunLocalName.java</include>
12741281
<include>src/main/java/org/exist/xquery/functions/fn/FunMax.java</include>
@@ -1409,13 +1416,15 @@
14091416
<include>src/main/java/org/exist/xquery/value/GYearMonthValue.java</include>
14101417
<include>src/main/java/org/exist/xquery/value/GYearValue.java</include>
14111418
<include>src/main/java/org/exist/xquery/value/IntegerValue.java</include>
1419+
<include>src/main/java/org/exist/xquery/value/MemoryNodeSet.java</include>
14121420
<include>src/main/java/org/exist/xquery/value/QNameValue.java</include>
14131421
<include>src/main/java/org/exist/xquery/value/SequenceType.java</include>
14141422
<include>src/main/java/org/exist/xquery/value/StringValue.java</include>
14151423
<include>src/test/java/org/exist/xquery/value/TimeTest.java</include>
14161424
<include>src/main/java/org/exist/xquery/value/TimeUtils.java</include>
14171425
<include>src/main/java/org/exist/xquery/value/TimeValue.java</include>
14181426
<include>src/main/java/org/exist/xquery/value/Type.java</include>
1427+
<include>src/main/java/org/exist/xquery/value/ValueSequence.java</include>
14191428
<include>src/test/java/org/exist/xquery/value/YearMonthDurationTest.java</include>
14201429
<include>src/main/java/org/exist/xquery/value/YearMonthDurationValue.java</include>
14211430
<include>src/main/java/org/exist/xslt/EXistURIResolver.java</include>
@@ -1460,6 +1469,7 @@
14601469
<exclude>src/test/resources/standalone-webapp/WEB-INF/web.xml</exclude>
14611470
<exclude>src/main/xjb/rest-api.xjb</exclude>
14621471
<exclude>src/test/xquery/binary-value.xqm</exclude>
1472+
<exclude>src/test/xquery/parenthesizedLocationStep.xml</exclude>
14631473
<exclude>src/test/xquery/pi.xqm</exclude>
14641474
<exclude>src/test/xquery/tail-recursion.xml</exclude>
14651475
<exclude>src/test/xquery/maps/maps.xqm</exclude>
@@ -1583,6 +1593,7 @@
15831593
<exclude>src/main/java/org/exist/dom/persistent/DocumentSet.java</exclude>
15841594
<exclude>src/main/java/org/exist/dom/persistent/DocumentTypeImpl.java</exclude>
15851595
<exclude>src/main/java/org/exist/dom/persistent/ElementImpl.java</exclude>
1596+
<exclude>src/main/java/org/exist/dom/persistent/EmptyNodeSet.java</exclude>
15861597
<exclude>src/main/java/org/exist/dom/persistent/LockToken.java</exclude>
15871598
<exclude>src/main/java/org/exist/dom/persistent/Match.java</exclude>
15881599
<exclude>src/main/java/org/exist/dom/persistent/NewArrayNodeSet.java</exclude>
@@ -1649,6 +1660,7 @@
16491660
<exclude>src/main/java/org/exist/mediatype/MediaTypeService.java</exclude>
16501661
<exclude>src/main/java/org/exist/mediatype/MediaTypeUtil.java</exclude>
16511662
<exclude>src/main/java/org/exist/numbering/DLN.java</exclude>
1663+
<exclude>src/main/java/org/exist/numbering/DLNBase.java</exclude>
16521664
<exclude>src/main/java/org/exist/numbering/DLNFactory.java</exclude>
16531665
<exclude>src/test/java/org/exist/numbering/DLNStorageTest.java</exclude>
16541666
<exclude>src/main/java/org/exist/numbering/NodeId.java</exclude>
@@ -1953,6 +1965,7 @@
19531965
<exclude>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java</exclude>
19541966
<exclude>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java.java</exclude>
19551967
<exclude>src/main/java/org/exist/xquery/ErrorCodes.java</exclude>
1968+
<exclude>src/main/java/org/exist/xquery/Except.java</exclude>
19561969
<exclude>src/main/java/org/exist/xquery/ExternalModuleImpl.java</exclude>
19571970
<exclude>src/main/java/org/exist/xquery/FilteredExpression.java</exclude>
19581971
<exclude>src/test/java/org/exist/xquery/ForwardReferenceTest.java</exclude>
@@ -1962,6 +1975,7 @@
19621975
<exclude>src/test/java/org/exist/xquery/ImportFromPkgTest.java</exclude>
19631976
<exclude>src/test/java/org/exist/xquery/ImportModuleTest.java</exclude>
19641977
<exclude>src/test/java/org/exist/xquery/InternalModuleTest.java</exclude>
1978+
<exclude>src/main/java/org/exist/xquery/Intersect.java</exclude>
19651979
<exclude>src/main/java/org/exist/xquery/JavaBinding.java</exclude>
19661980
<exclude>src/test/resources-filtered/org/exist/xquery/JavaBindingTest.conf.xml</exclude>
19671981
<exclude>src/test/java/org/exist/xquery/JavaBindingTest.java</exclude>
@@ -1974,6 +1988,7 @@
19741988
<exclude>src/test/java/org/exist/xquery/NodeTypeTest.java</exclude>
19751989
<exclude>src/main/java/org/exist/xquery/Optimizer.java</exclude>
19761990
<exclude>src/main/java/org/exist/xquery/Option.java</exclude>
1991+
<exclude>src/main/java/org/exist/xquery/PathExpr.java</exclude>
19771992
<exclude>src/main/java/org/exist/xquery/PerformanceStats.java</exclude>
19781993
<exclude>src/test/java/org/exist/xquery/RestBinariesTest.java</exclude>
19791994
<exclude>src/test/java/org/exist/xquery/StoredModuleTest.java</exclude>
@@ -2054,6 +2069,7 @@
20542069
<exclude>src/main/java/org/exist/xquery/functions/fn/FunInsertBefore.java</exclude>
20552070
<exclude>src/main/java/org/exist/xquery/functions/fn/FunIRIToURI.java</exclude>
20562071
<exclude>src/main/java/org/exist/xquery/functions/fn/FunLang.java</exclude>
2072+
<exclude>src/test/java/org/exist/xquery/functions/fn/FunLangTest.java</exclude>
20572073
<exclude>src/main/java/org/exist/xquery/functions/fn/FunLast.java</exclude>
20582074
<exclude>src/main/java/org/exist/xquery/functions/fn/FunLocalName.java</exclude>
20592075
<exclude>src/main/java/org/exist/xquery/functions/fn/FunMax.java</exclude>
@@ -2217,6 +2233,7 @@
22172233
<exclude>src/main/java/org/exist/xquery/value/GYearValue.java</exclude>
22182234
<exclude>src/main/java/org/exist/xquery/value/IntegerValue.java</exclude>
22192235
<exclude>src/main/java/org/exist/xquery/value/ItemComparator.java</exclude>
2236+
<exclude>src/main/java/org/exist/xquery/value/MemoryNodeSet.java</exclude>
22202237
<exclude>src/main/java/org/exist/xquery/value/QNameValue.java</exclude>
22212238
<exclude>src/main/java/org/exist/xquery/value/SequenceComparator.java</exclude>
22222239
<exclude>src/main/java/org/exist/xquery/value/SequenceType.java</exclude>
@@ -2228,6 +2245,7 @@
22282245
<exclude>src/main/java/org/exist/xquery/value/TimeUtils.java</exclude>
22292246
<exclude>src/main/java/org/exist/xquery/value/TimeValue.java</exclude>
22302247
<exclude>src/main/java/org/exist/xquery/value/Type.java</exclude>
2248+
<exclude>src/main/java/org/exist/xquery/value/ValueSequence.java</exclude>
22312249
<exclude>src/test/java/org/exist/xquery/value/YearMonthDurationTest.java</exclude>
22322250
<exclude>src/main/java/org/exist/xquery/value/YearMonthDurationValue.java</exclude>
22332251
<exclude>src/main/java/org/exist/xslt/EXistURIResolver.java</exclude>
@@ -2715,4 +2733,4 @@ The BaseX Team. The original license statement is also included below.]]></pream
27152733
</profile>
27162734
</profiles>
27172735

2718-
</project>
2736+
</project>

exist-core/src/main/antlr/org/exist/xquery/parser/XQueryTree.g

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2801,19 +2801,38 @@ throws PermissionDeniedException, EXistException, XPathException
28012801
rs.setAxis(Constants.DESCENDANT_AXIS);
28022802
} else if (rs.getAxis() == Constants.SELF_AXIS) {
28032803
rs.setAxis(Constants.DESCENDANT_SELF_AXIS);
2804-
} else {
2804+
} else if (rs.getAxis() == Constants.CHILD_AXIS || rs.getAxis() == Constants.UNKNOWN_AXIS) {
2805+
// For CHILD_AXIS or UNKNOWN_AXIS, change to descendant-or-self
28052806
rs.setAxis(Constants.DESCENDANT_SELF_AXIS);
28062807
rs.setAbbreviated(true);
2808+
} else {
2809+
// For other explicit axes (following, preceding, ancestor, etc.)
2810+
// insert a separate descendant-or-self::node() step before this step
2811+
final LocationStep dsStep = new LocationStep(context, Constants.DESCENDANT_SELF_AXIS, new AnyNodeTest());
2812+
path.insertBeforeLast(dsStep);
28072813
}
28082814

28092815
} else {
2810-
rightStep.setPrimaryAxis(Constants.DESCENDANT_SELF_AXIS);
2811-
if(rightStep instanceof VariableReference) {
2812-
rightStep = new SimpleStep(context, Constants.DESCENDANT_SELF_AXIS, rightStep);
2813-
path.replaceLastExpression(rightStep);
2814-
} else if (rightStep instanceof FilteredExpression)
2815-
((FilteredExpression)rightStep).setAbbreviated(true);
2816+
if (rightStep instanceof Function) {
2817+
// For non-LocationStep expressions (function calls, etc.)
2818+
// insert a separate descendant-or-self::node() step before this step
2819+
final LocationStep dsStep = new LocationStep(context, Constants.DESCENDANT_SELF_AXIS, new AnyNodeTest());
2820+
path.insertBeforeLast(dsStep);
2821+
} else {
2822+
if (rightStep.getPrimaryAxis() == Constants.ATTRIBUTE_AXIS) {
2823+
rightStep.setPrimaryAxis(Constants.DESCENDANT_ATTRIBUTE_AXIS);
2824+
} else {
2825+
rightStep.setPrimaryAxis(Constants.DESCENDANT_SELF_AXIS);
2826+
}
28162827

2828+
if(rightStep instanceof VariableReference) {
2829+
// VariableReference needs special handling
2830+
rightStep = new SimpleStep(context, Constants.DESCENDANT_SELF_AXIS, rightStep);
2831+
path.replaceLastExpression(rightStep);
2832+
} else if (rightStep instanceof FilteredExpression) {
2833+
((FilteredExpression)rightStep).setAbbreviated(true);
2834+
}
2835+
}
28172836
}
28182837
}
28192838
)?

exist-core/src/main/java/org/exist/dom/persistent/EmptyNodeSet.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,28 @@
11
/*
2+
* Elemental
3+
* Copyright (C) 2024, Evolved Binary Ltd
4+
*
5+
* admin@evolvedbinary.com
6+
* https://www.evolvedbinary.com | https://www.elemental.xyz
7+
*
8+
* This library is free software; you can redistribute it and/or
9+
* modify it under the terms of the GNU Lesser General Public
10+
* License as published by the Free Software Foundation; version 2.1.
11+
*
12+
* This library is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+
* Lesser General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU Lesser General Public
18+
* License along with this library; if not, write to the Free Software
19+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+
*
21+
* NOTE: Parts of this file contain code from 'The eXist-db Authors'.
22+
* The original license header is included below.
23+
*
24+
* =====================================================================
25+
*
226
* eXist-db Open Source Native XML Database
327
* Copyright (C) 2001 The eXist-db Authors
428
*
@@ -67,10 +91,12 @@ public boolean hasOne() {
6791

6892
@Override
6993
public void add(final NodeProxy proxy) {
94+
throw new IllegalStateException("Cannot add a NodeProxy to an EmptyNodeSet because it is immutable");
7095
}
7196

7297
@Override
7398
public void addAll(final NodeSet other) {
99+
throw new IllegalStateException("Cannot add a NodeSet to an EmptyNodeSet because it is immutable");
74100
}
75101

76102
@Override

exist-core/src/main/java/org/exist/numbering/DLNBase.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,28 @@
11
/*
2+
* Elemental
3+
* Copyright (C) 2024, Evolved Binary Ltd
4+
*
5+
* admin@evolvedbinary.com
6+
* https://www.evolvedbinary.com | https://www.elemental.xyz
7+
*
8+
* This library is free software; you can redistribute it and/or
9+
* modify it under the terms of the GNU Lesser General Public
10+
* License as published by the Free Software Foundation; version 2.1.
11+
*
12+
* This library is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+
* Lesser General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU Lesser General Public
18+
* License along with this library; if not, write to the Free Software
19+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+
*
21+
* NOTE: Parts of this file contain code from 'The eXist-db Authors'.
22+
* The original license header is included below.
23+
*
24+
* =====================================================================
25+
*
226
* eXist-db Open Source Native XML Database
327
* Copyright (C) 2001 The eXist-db Authors
428
*
@@ -495,7 +519,14 @@ public boolean equals(final Object o) {
495519
return Arrays.equals(bits, other.bits);
496520
}
497521

498-
// public int compareTo(final DLNBase other) {
522+
@Override
523+
public int hashCode() {
524+
int result = Arrays.hashCode(bits);
525+
result = 31 * result + bitIndex;
526+
return result;
527+
}
528+
529+
// public int compareTo(final DLNBase other) {
499530
// if (other == null)
500531
// return 1;
501532
// final int a1len = bits.length;

0 commit comments

Comments
 (0)