Skip to content

Commit d0a0958

Browse files
authored
Merge pull request #163 from evolvedbinary/7.x.x/hotfix/axes-navigation
[7.x.x] Improvements to XPath Axes navigation
2 parents 2af5ae7 + 608abe5 commit d0a0958

20 files changed

Lines changed: 719 additions & 178 deletions

File tree

exist-core/pom.xml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,7 @@
802802
<include>src/test/resources/log4j2.xml</include>
803803
<include>src/test/resources/standalone-webapp/WEB-INF/web.xml</include>
804804
<include>src/main/xjb/rest-api.xjb</include>
805+
<include>src/test/xquery/parenthesizedLocationStep.xml</include>
805806
<include>src/test/xquery/tail-recursion.xml</include>
806807
<include>src/test/xquery/maps/maps.xqm</include>
807808
<include>src/test/xquery/numbers/format-numbers.xql</include>
@@ -917,6 +918,7 @@
917918
<include>src/main/java/org/exist/dom/persistent/DocumentSet.java</include>
918919
<include>src/main/java/org/exist/dom/persistent/DocumentTypeImpl.java</include>
919920
<include>src/main/java/org/exist/dom/persistent/ElementImpl.java</include>
921+
<include>src/main/java/org/exist/dom/persistent/EmptyNodeSet.java</include>
920922
<include>src/main/java/org/exist/dom/persistent/LockToken.java</include>
921923
<include>src/main/java/org/exist/dom/persistent/NewArrayNodeSet.java</include>
922924
<include>src/main/java/org/exist/dom/persistent/NodeProxy.java</include>
@@ -979,6 +981,7 @@
979981
<include>src/main/java/org/exist/management/impl/JMXAgent.java</include>
980982
<include>src/main/java/org/exist/management/impl/SanityReport.java</include>
981983
<include>src/main/java/org/exist/numbering/DLN.java</include>
984+
<include>src/main/java/org/exist/numbering/DLNBase.java</include>
982985
<include>src/main/java/org/exist/numbering/DLNFactory.java</include>
983986
<include>src/test/java/org/exist/numbering/DLNStorageTest.java</include>
984987
<include>src/main/java/org/exist/numbering/NodeId.java</include>
@@ -1207,10 +1210,12 @@
12071210
<include>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java</include>
12081211
<include>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java.java</include>
12091212
<include>src/main/java/org/exist/xquery/ErrorCodes.java</include>
1213+
<include>src/main/java/org/exist/xquery/Except.java</include>
12101214
<include>src/main/java/org/exist/xquery/ExternalModuleImpl.java</include>
12111215
<include>src/test/java/org/exist/xquery/ForwardReferenceTest.java</include>
12121216
<include>src/main/java/org/exist/xquery/Function.java</include>
12131217
<include>src/main/java/org/exist/xquery/FunctionFactory.java</include>
1218+
<include>src/main/java/org/exist/xquery/Intersect.java</include>
12141219
<include>src/test/java/org/exist/xquery/LexerTest.java</include>
12151220
<include>src/main/java/org/exist/xquery/LocationStep.java</include>
12161221
<include>src/main/java/org/exist/xquery/Module.java</include>
@@ -1219,6 +1224,7 @@
12191224
<include>src/test/java/org/exist/xquery/NodeTypeTest.java</include>
12201225
<include>src/main/java/org/exist/xquery/Optimizer.java</include>
12211226
<include>src/main/java/org/exist/xquery/Option.java</include>
1227+
<include>src/main/java/org/exist/xquery/PathExpr.java</include>
12221228
<include>src/main/java/org/exist/xquery/PerformanceStatsImpl.java</include>
12231229
<include>src/test/java/org/exist/xquery/RestBinariesTest.java</include>
12241230
<include>src/test/java/org/exist/xquery/StoredModuleTest.java</include>
@@ -1296,6 +1302,7 @@
12961302
<include>src/main/java/org/exist/xquery/functions/fn/FunInsertBefore.java</include>
12971303
<include>src/main/java/org/exist/xquery/functions/fn/FunIRIToURI.java</include>
12981304
<include>src/main/java/org/exist/xquery/functions/fn/FunLang.java</include>
1305+
<include>src/test/java/org/exist/xquery/functions/fn/FunLangTest.java</include>
12991306
<include>src/main/java/org/exist/xquery/functions/fn/FunLast.java</include>
13001307
<include>src/main/java/org/exist/xquery/functions/fn/FunLocalName.java</include>
13011308
<include>src/main/java/org/exist/xquery/functions/fn/FunMax.java</include>
@@ -1435,13 +1442,15 @@
14351442
<include>src/main/java/org/exist/xquery/value/GYearMonthValue.java</include>
14361443
<include>src/main/java/org/exist/xquery/value/GYearValue.java</include>
14371444
<include>src/main/java/org/exist/xquery/value/IntegerValue.java</include>
1445+
<include>src/main/java/org/exist/xquery/value/MemoryNodeSet.java</include>
14381446
<include>src/main/java/org/exist/xquery/value/QNameValue.java</include>
14391447
<include>src/main/java/org/exist/xquery/value/SequenceType.java</include>
14401448
<include>src/main/java/org/exist/xquery/value/StringValue.java</include>
14411449
<include>src/test/java/org/exist/xquery/value/TimeTest.java</include>
14421450
<include>src/main/java/org/exist/xquery/value/TimeUtils.java</include>
14431451
<include>src/main/java/org/exist/xquery/value/TimeValue.java</include>
14441452
<include>src/main/java/org/exist/xquery/value/Type.java</include>
1453+
<include>src/main/java/org/exist/xquery/value/ValueSequence.java</include>
14451454
<include>src/test/java/org/exist/xquery/value/YearMonthDurationTest.java</include>
14461455
<include>src/main/java/org/exist/xquery/value/YearMonthDurationValue.java</include>
14471456
<include>src/main/java/org/exist/xslt/EXistURIResolver.java</include>
@@ -1489,6 +1498,7 @@
14891498
<exclude>src/test/xquery/instance-of.xqm</exclude>
14901499
<exclude>src/test/xquery/operator-mapping.xqm</exclude>
14911500
<exclude>src/test/xquery/order.xqm</exclude>
1501+
<exclude>src/test/xquery/parenthesizedLocationStep.xml</exclude>
14921502
<exclude>src/test/xquery/pi.xqm</exclude>
14931503
<exclude>src/test/xquery/tail-recursion.xml</exclude>
14941504
<exclude>src/test/xquery/type-promotion.xqm</exclude>
@@ -1620,6 +1630,7 @@
16201630
<exclude>src/main/java/org/exist/dom/persistent/DocumentSet.java</exclude>
16211631
<exclude>src/main/java/org/exist/dom/persistent/DocumentTypeImpl.java</exclude>
16221632
<exclude>src/main/java/org/exist/dom/persistent/ElementImpl.java</exclude>
1633+
<exclude>src/main/java/org/exist/dom/persistent/EmptyNodeSet.java</exclude>
16231634
<exclude>src/main/java/org/exist/dom/persistent/LockToken.java</exclude>
16241635
<exclude>src/main/java/org/exist/dom/persistent/NewArrayNodeSet.java</exclude>
16251636
<exclude>src/main/java/org/exist/dom/persistent/NodeProxy.java</exclude>
@@ -1687,6 +1698,7 @@
16871698
<exclude>src/main/java/org/exist/mediatype/MediaTypeService.java</exclude>
16881699
<exclude>src/main/java/org/exist/mediatype/MediaTypeUtil.java</exclude>
16891700
<exclude>src/main/java/org/exist/numbering/DLN.java</exclude>
1701+
<exclude>src/main/java/org/exist/numbering/DLNBase.java</exclude>
16901702
<exclude>src/main/java/org/exist/numbering/DLNFactory.java</exclude>
16911703
<exclude>src/test/java/org/exist/numbering/DLNStorageTest.java</exclude>
16921704
<exclude>src/main/java/org/exist/numbering/NodeId.java</exclude>
@@ -1994,13 +2006,15 @@
19942006
<exclude>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java</exclude>
19952007
<exclude>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java.java</exclude>
19962008
<exclude>src/main/java/org/exist/xquery/ErrorCodes.java</exclude>
2009+
<exclude>src/main/java/org/exist/xquery/Except.java</exclude>
19972010
<exclude>src/main/java/org/exist/xquery/ExternalModuleImpl.java</exclude>
19982011
<exclude>src/test/java/org/exist/xquery/ForwardReferenceTest.java</exclude>
19992012
<exclude>src/main/java/org/exist/xquery/Function.java</exclude>
20002013
<exclude>src/main/java/org/exist/xquery/FunctionFactory.java</exclude>
20012014
<exclude>src/test/resources-filtered/org/exist/xquery/import-from-pkg-test.conf.xml</exclude>
20022015
<exclude>src/test/java/org/exist/xquery/ImportFromPkgTest.java</exclude>
20032016
<exclude>src/test/java/org/exist/xquery/ImportModuleTest.java</exclude>
2017+
<exclude>src/main/java/org/exist/xquery/Intersect.java</exclude>
20042018
<exclude>src/main/java/org/exist/xquery/JavaBinding.java</exclude>
20052019
<exclude>src/test/resources-filtered/org/exist/xquery/JavaBindingTest.conf.xml</exclude>
20062020
<exclude>src/test/java/org/exist/xquery/JavaBindingTest.java</exclude>
@@ -2013,6 +2027,7 @@
20132027
<exclude>src/test/java/org/exist/xquery/NodeTypeTest.java</exclude>
20142028
<exclude>src/main/java/org/exist/xquery/Optimizer.java</exclude>
20152029
<exclude>src/main/java/org/exist/xquery/Option.java</exclude>
2030+
<exclude>src/main/java/org/exist/xquery/PathExpr.java</exclude>
20162031
<exclude>src/main/java/org/exist/xquery/PerformanceStatsImpl.java</exclude>
20172032
<exclude>src/test/java/org/exist/xquery/RestBinariesTest.java</exclude>
20182033
<exclude>src/test/java/org/exist/xquery/StoredModuleTest.java</exclude>
@@ -2094,6 +2109,7 @@
20942109
<exclude>src/main/java/org/exist/xquery/functions/fn/FunInsertBefore.java</exclude>
20952110
<exclude>src/main/java/org/exist/xquery/functions/fn/FunIRIToURI.java</exclude>
20962111
<exclude>src/main/java/org/exist/xquery/functions/fn/FunLang.java</exclude>
2112+
<exclude>src/test/java/org/exist/xquery/functions/fn/FunLangTest.java</exclude>
20972113
<exclude>src/main/java/org/exist/xquery/functions/fn/FunLast.java</exclude>
20982114
<exclude>src/main/java/org/exist/xquery/functions/fn/FunLocalName.java</exclude>
20992115
<exclude>src/main/java/org/exist/xquery/functions/fn/FunMax.java</exclude>
@@ -2256,6 +2272,7 @@
22562272
<exclude>src/main/java/org/exist/xquery/value/GYearValue.java</exclude>
22572273
<exclude>src/main/java/org/exist/xquery/value/IntegerValue.java</exclude>
22582274
<exclude>src/main/java/org/exist/xquery/value/ItemComparator.java</exclude>
2275+
<exclude>src/main/java/org/exist/xquery/value/MemoryNodeSet.java</exclude>
22592276
<exclude>src/main/java/org/exist/xquery/value/QNameValue.java</exclude>
22602277
<exclude>src/main/java/org/exist/xquery/value/SequenceComparator.java</exclude>
22612278
<exclude>src/main/java/org/exist/xquery/value/SequenceType.java</exclude>
@@ -2267,6 +2284,7 @@
22672284
<exclude>src/main/java/org/exist/xquery/value/TimeUtils.java</exclude>
22682285
<exclude>src/main/java/org/exist/xquery/value/TimeValue.java</exclude>
22692286
<exclude>src/main/java/org/exist/xquery/value/Type.java</exclude>
2287+
<exclude>src/main/java/org/exist/xquery/value/ValueSequence.java</exclude>
22702288
<exclude>src/test/java/org/exist/xquery/value/YearMonthDurationTest.java</exclude>
22712289
<exclude>src/main/java/org/exist/xquery/value/YearMonthDurationValue.java</exclude>
22722290
<exclude>src/main/java/org/exist/xslt/EXistURIResolver.java</exclude>
@@ -2789,4 +2807,4 @@ The BaseX Team. The original license statement is also included below.]]></pream
27892807
</profile>
27902808
</profiles>
27912809

2792-
</project>
2810+
</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
@@ -3065,19 +3065,38 @@ throws PermissionDeniedException, EXistException, XPathException
30653065
rs.setAxis(Constants.DESCENDANT_AXIS);
30663066
} else if (rs.getAxis() == Constants.SELF_AXIS) {
30673067
rs.setAxis(Constants.DESCENDANT_SELF_AXIS);
3068-
} else {
3068+
} else if (rs.getAxis() == Constants.CHILD_AXIS || rs.getAxis() == Constants.UNKNOWN_AXIS) {
3069+
// For CHILD_AXIS or UNKNOWN_AXIS, change to descendant-or-self
30693070
rs.setAxis(Constants.DESCENDANT_SELF_AXIS);
30703071
rs.setAbbreviated(true);
3072+
} else {
3073+
// For other explicit axes (following, preceding, ancestor, etc.)
3074+
// insert a separate descendant-or-self::node() step before this step
3075+
final LocationStep dsStep = new LocationStep(context, Constants.DESCENDANT_SELF_AXIS, new AnyNodeTest());
3076+
path.insertBeforeLast(dsStep);
30713077
}
30723078

30733079
} else {
3074-
rightStep.setPrimaryAxis(Constants.DESCENDANT_SELF_AXIS);
3075-
if(rightStep instanceof VariableReference) {
3076-
rightStep = new SimpleStep(context, Constants.DESCENDANT_SELF_AXIS, rightStep);
3077-
path.replaceLastExpression(rightStep);
3078-
} else if (rightStep instanceof FilteredExpression)
3079-
((FilteredExpression)rightStep).setAbbreviated(true);
3080+
if (rightStep instanceof Function) {
3081+
// For non-LocationStep expressions (function calls, etc.)
3082+
// insert a separate descendant-or-self::node() step before this step
3083+
final LocationStep dsStep = new LocationStep(context, Constants.DESCENDANT_SELF_AXIS, new AnyNodeTest());
3084+
path.insertBeforeLast(dsStep);
3085+
} else {
3086+
if (rightStep.getPrimaryAxis() == Constants.ATTRIBUTE_AXIS) {
3087+
rightStep.setPrimaryAxis(Constants.DESCENDANT_ATTRIBUTE_AXIS);
3088+
} else {
3089+
rightStep.setPrimaryAxis(Constants.DESCENDANT_SELF_AXIS);
3090+
}
30803091

3092+
if(rightStep instanceof VariableReference) {
3093+
// VariableReference needs special handling
3094+
rightStep = new SimpleStep(context, Constants.DESCENDANT_SELF_AXIS, rightStep);
3095+
path.replaceLastExpression(rightStep);
3096+
} else if (rightStep instanceof FilteredExpression) {
3097+
((FilteredExpression)rightStep).setAbbreviated(true);
3098+
}
3099+
}
30813100
}
30823101
}
30833102
)?

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
*
@@ -494,7 +518,14 @@ public boolean equals(final Object o) {
494518
return Arrays.equals(bits, other.bits);
495519
}
496520

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

0 commit comments

Comments
 (0)