diff --git a/exist-core/src/main/java/org/exist/storage/NativeBroker.java b/exist-core/src/main/java/org/exist/storage/NativeBroker.java index 88bd6ce72cd..485d263f41d 100644 --- a/exist-core/src/main/java/org/exist/storage/NativeBroker.java +++ b/exist-core/src/main/java/org/exist/storage/NativeBroker.java @@ -3033,7 +3033,7 @@ public Object start() { } }.run(); // create a copy of the old doc to copy the nodes into it - final DocumentImpl tempDoc = new DocumentImpl(null, null, doc.getCollection(), doc.getDocId(), doc.getFileURI()); + final DocumentImpl tempDoc = new DocumentImpl(null, doc.getDocId(), doc); tempDoc.copyOf(this, doc, doc); final StreamListener listener = getIndexController().getStreamListener(doc, ReindexMode.STORE); // copy the nodes diff --git a/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java b/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java index c39ea1f8452..cd54c9e7b4d 100644 --- a/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java +++ b/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java @@ -42,6 +42,7 @@ import java.io.IOException; import java.nio.file.Path; import java.util.Map; +import java.util.Properties; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @@ -98,6 +99,17 @@ public ExistXmldbEmbeddedServer(final boolean asGuest, final boolean disableAuto this.asGuest = asGuest; } + /** + * @param asGuest Use the guest account, default is the admin account + * @param disableAutoDeploy Whether auto-deployment of XARs should be disabled + * @param useTemporaryStorage Whether the data and journal folder should use temporary storage + * @param settings set properties + */ + public ExistXmldbEmbeddedServer(final boolean asGuest, final boolean disableAutoDeploy, final boolean useTemporaryStorage, final Properties settings) { + this.existEmbeddedServer = new ExistEmbeddedServer(null, null, settings, disableAutoDeploy, useTemporaryStorage); + this.asGuest = asGuest; + } + @Override protected void before() throws Throwable { startDb(); diff --git a/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefrag.java b/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefrag.java new file mode 100644 index 00000000000..398500a190c --- /dev/null +++ b/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefrag.java @@ -0,0 +1,57 @@ +package org.exist.xquery.update; + +import org.exist.test.ExistXmldbEmbeddedServer; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.modules.CollectionManagementService; +import org.xmldb.api.modules.XMLResource; +import org.xmldb.api.modules.XQueryService; + +import static org.exist.util.PropertiesBuilder.propertiesBuilder; +import static org.exist.storage.DBBroker.PROPERTY_XUPDATE_FRAGMENTATION_FACTOR; +import static org.exist.test.TestConstants.TEST_COLLECTION_URI; +import static org.exist.test.TestConstants.TEST_XML_URI; +import static org.junit.Assert.assertEquals; + +public class UpdateInsertTriggersDefrag { + @ClassRule + public static final ExistXmldbEmbeddedServer exist = new ExistXmldbEmbeddedServer(false, true, true, + propertiesBuilder().put(PROPERTY_XUPDATE_FRAGMENTATION_FACTOR, -1).build()); + private final String path = TEST_COLLECTION_URI + "/" + TEST_XML_URI.toString(); + private Collection testCollection; + private CollectionManagementService collectionService; + + @Before + public void setUp() throws Exception { + collectionService = (CollectionManagementService) exist.getRoot().getService("CollectionManagementService","1.0"); + + testCollection = collectionService.createCollection(TEST_COLLECTION_URI.lastSegment().toString()); + final XMLResource doc = (XMLResource) testCollection.createResource(TEST_XML_URI.toString(), XMLResource.RESOURCE_TYPE); + + doc.setContent("initial"); + testCollection.storeResource(doc); + } + + @After + public void tearDown() throws Exception { + collectionService.removeCollection(testCollection.getName()); + testCollection.close(); + } + + @Test + public void triggerDefragAfterUpdate() throws Exception { + final XQueryService queryService = (XQueryService) testCollection.getService("XPathQueryService", "1.0"); + + final String update = "update insert new node into doc('" + path + "')//list"; + final ResourceSet updateResult = queryService.queryResource(path, update); + assertEquals("Update expression returns an empty sequence", 0, updateResult.getSize()); + + final ResourceSet itemResult = queryService.queryResource(path, "//item"); + assertEquals("Both items are returned", 2, itemResult.getSize()); + } + +} diff --git a/exist-distribution/pom.xml b/exist-distribution/pom.xml index 2f8871b21d0..ab8c8933564 100644 --- a/exist-distribution/pom.xml +++ b/exist-distribution/pom.xml @@ -715,6 +715,18 @@ true + + + commons-io + commons-io + 2.11.0 + + + org.codehaus.plexus + plexus-utils + 1.1 + + autodeploy-expath-pkgs-for-appassembler