[exo-jcr-commits] exo-jcr SVN: r4352 - in jcr/branches/1.12.x: exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue May 10 00:34:28 EDT 2011


Author: paristote
Date: 2011-05-10 00:34:27 -0400 (Tue, 10 May 2011)
New Revision: 4352

Added:
   jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query/TestUpdateProperty.java
   jcr/branches/1.12.x/patch/1.12.9-GA/JCR-1594/readme.txt
Modified:
   jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerChangesFilter.java
Log:
JCR-1594

What is the problem to fix?
    Renaming folder in WebDAV takes a lot of time.

How is the problem fixed?
    Avoid unnecessary re-indexing operations for children nodes



Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerChangesFilter.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerChangesFilter.java	2011-05-10 04:16:39 UTC (rev 4351)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexerChangesFilter.java	2011-05-10 04:34:27 UTC (rev 4352)
@@ -163,66 +163,36 @@
    private void acceptChanges(final Set<String> removedNodes, final Set<String> addedNodes,
       final Map<String, List<ItemState>> updatedNodes, ItemState itemState)
    {
-      {
-         String uuid =
-            itemState.isNode() ? itemState.getData().getIdentifier() : itemState.getData().getParentIdentifier();
+      String uuid =
+         itemState.isNode() ? itemState.getData().getIdentifier() : itemState.getData().getParentIdentifier();
 
+      if (itemState.isNode())
+      {
          if (itemState.isAdded())
          {
-            if (itemState.isNode())
-            {
-               addedNodes.add(uuid);
-            }
-            else
-            {
-               if (!addedNodes.contains(uuid))
-               {
-                  createNewOrAdd(uuid, itemState, updatedNodes);
-               }
-            }
+            addedNodes.add(uuid);
          }
-         else if (itemState.isRenamed())
+         else if (itemState.isRenamed() || itemState.isUpdated() || itemState.isMixinChanged())
          {
-            if (itemState.isNode())
-            {
-               addedNodes.add(uuid);
-            }
-            else
-            {
-               createNewOrAdd(uuid, itemState, updatedNodes);
-            }
-         }
-         else if (itemState.isUpdated())
-         {
             createNewOrAdd(uuid, itemState, updatedNodes);
          }
-         else if (itemState.isMixinChanged())
+         else if (itemState.isDeleted())
          {
-            createNewOrAdd(uuid, itemState, updatedNodes);
+            addedNodes.remove(uuid);
+            removedNodes.add(uuid);
+
+            // remove all changes after node remove
+            updatedNodes.remove(uuid);
          }
-         else if (itemState.isDeleted())
+      }
+      else
+      {
+         if (itemState.isAdded() || itemState.isUpdated() || itemState.isDeleted())
          {
-            if (itemState.isNode())
+            if (!addedNodes.contains(uuid) && !removedNodes.contains(uuid) && !updatedNodes.containsKey(uuid))
             {
-               if (addedNodes.contains(uuid))
-               {
-                  addedNodes.remove(uuid);
-                  removedNodes.remove(uuid);
-               }
-               else
-               {
-                  removedNodes.add(uuid);
-               }
-               // remove all changes after node remove
-               updatedNodes.remove(uuid);
+               createNewOrAdd(uuid, itemState, updatedNodes);
             }
-            else
-            {
-               if (!removedNodes.contains(uuid) && !addedNodes.contains(uuid))
-               {
-                  createNewOrAdd(uuid, itemState, updatedNodes);
-               }
-            }
          }
       }
    }

Added: jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query/TestUpdateProperty.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query/TestUpdateProperty.java	                        (rev 0)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query/TestUpdateProperty.java	2011-05-10 04:34:27 UTC (rev 4352)
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2003-2007 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.usecases.query;
+
+import org.exoplatform.services.jcr.usecases.BaseUsecasesTest;
+
+import javax.jcr.Node;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+
+/**
+ * @author <a href="mailto:anatoliy.bazko at gmail.com">Anatoliy Bazko</a>
+ * @version $Id: TestUpdateProperty.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+public class TestUpdateProperty extends BaseUsecasesTest
+{
+
+   public void testAddUpdateRemoveProperty() throws Exception
+   {
+
+      Node node = root.addNode("testNode");
+      node.setProperty("prop1", "value1");
+      node.setProperty("prop2", "value2");
+      root.save();
+
+      QueryManager manager = session.getWorkspace().getQueryManager();
+      Query query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value2')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      // the main issue that the last state is property deleting
+      node.setProperty("prop1", "value1-2");
+      node.setProperty("prop3", "value3");
+      node.getProperty("prop2").remove();
+      root.save();
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1-2')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value2')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value3')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      // remove node
+      node.remove();
+      root.save();
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1-2')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value3')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+   }
+
+   public void testMoveNode() throws Exception
+   {
+
+      Node node = root.addNode("testNode");
+      node.setProperty("prop1", "value1");
+      node.setProperty("prop2", "value2");
+
+      node = node.addNode("subNode");
+      node.setProperty("prop21", "value21");
+      node.setProperty("prop22", "value22");
+      root.save();
+
+      QueryManager manager = session.getWorkspace().getQueryManager();
+      Query query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value2')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value21')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value22')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      session.move("/testNode", "/testNode2");
+      root.save();
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value2')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value21')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value22')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+   }
+
+   public void testSetRemovePropertyImmediatly() throws Exception
+   {
+
+      Node node = root.addNode("testNode");
+      node.setProperty("prop1", "value1");
+      node.getProperty("prop1").remove();
+      root.save();
+
+      QueryManager manager = session.getWorkspace().getQueryManager();
+      Query query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+   }
+
+   public void testSetRemoveProperty() throws Exception
+   {
+
+      Node node = root.addNode("testNode");
+      node.setProperty("prop1", "value1");
+      root.save();
+
+      QueryManager manager = session.getWorkspace().getQueryManager();
+      Query query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      node.getProperty("prop1").remove();
+      root.save();
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+   }
+
+   public void testRemoveNodeUpdateProperty() throws Exception
+   {
+
+      Node node = root.addNode("testNode");
+      node.setProperty("prop1", "value1");
+      root.save();
+
+      QueryManager manager = session.getWorkspace().getQueryManager();
+      Query query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      node.setProperty("prop1", "value2");
+      node.remove();
+      root.save();
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value2')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+   }
+
+   public void testRemoveNodeSetProperty() throws Exception
+   {
+
+      Node node = root.addNode("testNode");
+      node.setProperty("prop1", "value1");
+      root.save();
+
+      QueryManager manager = session.getWorkspace().getQueryManager();
+      Query query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      node.setProperty("prop2", "valu2");
+      node.remove();
+      root.save();
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value2')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+   }
+
+   public void testRemoveNodeRemoveProperty() throws Exception
+   {
+
+      Node node = root.addNode("testNode");
+      node.setProperty("prop1", "value1");
+      root.save();
+
+      QueryManager manager = session.getWorkspace().getQueryManager();
+      Query query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(1, query.execute().getNodes().getSize());
+
+      node.getProperty("prop1").remove();
+      node.remove();
+      root.save();
+
+      query = manager.createQuery("SELECT * FROM nt:base " + " WHERE CONTAINS(., 'value1')", Query.SQL);
+      assertEquals(0, query.execute().getNodes().getSize());
+   }
+
+}

Added: jcr/branches/1.12.x/patch/1.12.9-GA/JCR-1594/readme.txt
===================================================================
--- jcr/branches/1.12.x/patch/1.12.9-GA/JCR-1594/readme.txt	                        (rev 0)
+++ jcr/branches/1.12.x/patch/1.12.9-GA/JCR-1594/readme.txt	2011-05-10 04:34:27 UTC (rev 4352)
@@ -0,0 +1,67 @@
+Summary
+
+    Status: Problem of renaming large folder in Webdav
+    CCP Issue: CCP-812, Product Jira Issue: JCR-1594. Backport of JCR-1591.
+    Complexity: Low
+
+The Proposal
+Problem description
+
+What is the problem to fix?
+
+    Renaming folder in WebDAV takes a lot of time.
+
+Fix description
+
+How is the problem fixed?
+
+    Avoid unnecessary re-indexing operations for children nodes
+
+Patch information:
+Patch files: JCR-1594.patch
+
+Tests to perform
+
+Reproduction test
+
+    Run Tomcat AS and mount WebDAV folder. Create folder and copy pdf-files (more than 200mb).  Try to rename folder, you can see that it takes a lot of time due to reindexing content.
+
+Tests performed at DevLevel
+
+    TCK tests, functional tests, manual testing on Tomcat AS
+
+Tests performed at QA/Support Level
+*
+
+Documentation changes
+
+Documentation changes:
+    No 
+
+Configuration changes
+
+Configuration changes:
+    No
+
+Will previous configuration continue to work?
+    Yes
+
+Risks and impacts
+
+Can this bug fix have any side effects on current client projects?
+    No
+
+Is there a performance risk/cost?
+    No
+
+Validation (PM/Support/QA)
+
+PM Comment
+* Patch validated by PM
+
+Support Comment
+* Support review: Patch validated
+
+QA Feedbacks
+*
+



More information about the exo-jcr-commits mailing list