[exo-jcr-commits] exo-jcr SVN: r4825 - in jcr/trunk/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/api/core/query and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Sep 1 05:40:54 EDT 2011


Author: sergiykarpenko
Date: 2011-09-01 05:40:53 -0400 (Thu, 01 Sep 2011)
New Revision: 4825

Added:
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/TestQueryMoveNode.java
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query/TestQueryChilds.java
Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ChildAxisQuery.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldNames.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldSelectors.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexFormatVersion.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java
Log:
EXOJCR-1239: patch from JCR-1579 committed (node path stored in lucene index)

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ChildAxisQuery.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ChildAxisQuery.java	2011-09-01 09:31:23 UTC (rev 4824)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ChildAxisQuery.java	2011-09-01 09:40:53 UTC (rev 4825)
@@ -721,59 +721,69 @@
             //NodeId id = new NodeId(UUID.fromString(uuid));
             try
             {
-               long time = 0;
-               if (log.isDebugEnabled())
+               if (nameTest != null && version.getVersion() >= IndexFormatVersion.V4.getVersion())
                {
-                  time = System.currentTimeMillis();
-               }
-               NodeData state = (NodeData)itemMgr.getItemData(uuid);
-               if (log.isDebugEnabled())
-               {
-                  time = System.currentTimeMillis() - time;
-                  log.debug("got NodeState with id {} in {} ms.", uuid, new Long(time));                  
-               }
-               Iterator<NodeData> entries;
-               if (nameTest != null)
-               {
-                  //NodeData childNodeData = (NodeData)itemMgr.getItemData(state, new QPathEntry(nameTest, 1));
-                  // //state.getChildNodeEntries(nameTest).iterator();
-                  List<NodeData> childs = itemMgr.getChildNodesData(state);
-
-                  List<NodeData> datas = new ArrayList<NodeData>();
-                  if (childs != null)
+                  StringBuilder path = new StringBuilder(256);
+                  path.append(uuid == null ? "" : uuid).append('/').append(nameTest.getAsString());
+                  TermDocs docs = reader.termDocs(new Term(FieldNames.PATH, path.toString()));
+                  try
                   {
-                     for (NodeData nodeData : childs)
+                     while (docs.next())
                      {
-                        if (nameTest.equals(nodeData.getQPath().getName()))
-                        {
-                           datas.add(nodeData);
-                        }
+                        childrenHits.set(docs.doc());
                      }
 
                   }
-                  entries = datas.iterator();//itemMgr.getChildNodesData(childNodeData).iterator();
+                  finally
+                  {
+                     docs.close();
+                  }
                }
                else
                {
-                  // get all children
-                  entries = itemMgr.getChildNodesData(state).iterator();
-               }
-               while (entries.hasNext())
-               {
-                  String childId = entries.next().getIdentifier();
-                  Term uuidTerm = new Term(FieldNames.UUID, childId);
-                  TermDocs docs = reader.termDocs(uuidTerm);
-                  try
+                  long time = System.currentTimeMillis();
+                  NodeData state = (NodeData)itemMgr.getItemData(uuid);
+                  time = System.currentTimeMillis() - time;
+                  log.debug("got NodeState with id {} in {} ms.", uuid, new Long(time));
+                  Iterator<NodeData> entries;
+                  if (nameTest != null)
                   {
-                     if (docs.next())
+                     //NodeData childNodeData = (NodeData)itemMgr.getItemData(state, new QPathEntry(nameTest, 1));//state.getChildNodeEntries(nameTest).iterator();
+                     List<NodeData> childs = itemMgr.getChildNodesData(state);
+
+                     List<NodeData> datas = new ArrayList<NodeData>();
+                     if (childs != null)
                      {
-                        childrenHits.set(docs.doc());
+                        for (NodeData nodeData : childs)
+                        {
+                           if (nameTest.equals(nodeData.getQPath().getName()))
+                              datas.add(nodeData);
+                        }
                      }
+                     entries = datas.iterator();//itemMgr.getChildNodesData(childNodeData).iterator();
                   }
-                  finally
+                  else
                   {
-                     docs.close();
+                     // get all children
+                     entries = itemMgr.getChildNodesData(state).iterator();
                   }
+                  while (entries.hasNext())
+                  {
+                     String childId = entries.next().getIdentifier();
+                     Term uuidTerm = new Term(FieldNames.UUID, childId);
+                     TermDocs docs = reader.termDocs(uuidTerm);
+                     try
+                     {
+                        if (docs.next())
+                        {
+                           childrenHits.set(docs.doc());
+                        }
+                     }
+                     finally
+                     {
+                        docs.close();
+                     }
+                  }
                }
             }
             catch (RepositoryException e)

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldNames.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldNames.java	2011-09-01 09:31:23 UTC (rev 4824)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldNames.java	2011-09-01 09:40:53 UTC (rev 4825)
@@ -69,6 +69,11 @@
     public static final String INDEX = "_:INDEX".intern();
 
     /**
+     * Name of the field that contains the relative path of the item.
+     */
+    public static final String PATH = "_:PATH".intern();
+
+    /**
      * Name of the field that contains the namespace URI of the node name. Terms
      * are not tokenized.
      */

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldSelectors.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldSelectors.java	2011-09-01 09:31:23 UTC (rev 4824)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldSelectors.java	2011-09-01 09:40:53 UTC (rev 4825)
@@ -84,4 +84,20 @@
             }
         }
     };
+
+    public static final FieldSelector PATH = new FieldSelector() {
+       /**
+        * Accepts {@link FieldNames#PATH}.
+        *
+        * @param fieldName the field name to check.
+        * @return result.
+        */
+       public FieldSelectorResult accept(String fieldName) {
+          if (FieldNames.PATH == fieldName) {
+             return FieldSelectorResult.LOAD;
+          } else {
+             return FieldSelectorResult.NO_LOAD;
+          }
+       }
+    };    
 }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexFormatVersion.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexFormatVersion.java	2011-09-01 09:31:23 UTC (rev 4824)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexFormatVersion.java	2011-09-01 09:40:53 UTC (rev 4825)
@@ -109,7 +109,7 @@
     public static IndexFormatVersion getVersion(IndexReader indexReader) {
         Collection fields = indexReader.getFieldNames(
                 IndexReader.FieldOption.ALL);
-        if (fields.contains(FieldNames.INDEX) || indexReader.numDocs() == 0) {
+        if ((fields.contains(FieldNames.INDEX) && fields.contains(FieldNames.PATH))|| indexReader.numDocs() == 0) {
            return IndexFormatVersion.V4;
         } else if (fields.contains(FieldNames.LOCAL_NAME)) {
             return IndexFormatVersion.V3;

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java	2011-09-01 09:31:23 UTC (rev 4824)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java	2011-09-01 09:40:53 UTC (rev 4825)
@@ -221,6 +221,11 @@
       {
          doc.add(new Field(FieldNames.INDEX, Integer.toString(node.getQPath().getIndex()), Field.Store.YES,
             Field.Index.NOT_ANALYZED_NO_NORMS));
+
+         StringBuilder path = new StringBuilder(256);
+         path.append(node.getParentIdentifier() == null ? "" : node.getParentIdentifier()).append('/')
+            .append(node.getQPath().getName().getAsString());
+         doc.add(new Field(FieldNames.PATH, path.toString(), Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS));
       }
 
       Collection<PropertyData> props = node.getChildPropertiesData();

Added: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/TestQueryMoveNode.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/TestQueryMoveNode.java	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/TestQueryMoveNode.java	2011-09-01 09:40:53 UTC (rev 4825)
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2003-2011 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.api.core.query;
+
+import org.exoplatform.services.jcr.usecases.BaseUsecasesTest;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+import javax.jcr.query.QueryResult;
+
+/**
+ * Created by The eXo Platform SAS.
+ * 
+ * <br/>Date: 
+ *
+ * @author <a href="karpenko.sergiy at gmail.com">Karpenko Sergiy</a> 
+ * @version $Id: TestQueryMoveNode.java 111 2011-28-01 11:11:11Z serg $
+ */
+public class TestQueryMoveNode extends BaseUsecasesTest
+{
+
+   public void testReordering() throws Exception
+   {
+      Node testRoot = this.root.addNode("testSameNameSiblingDelete");
+
+      Node subNode_1 = testRoot.addNode("node", "nt:unstructured"); // 1
+      subNode_1.addMixin("mix:referenceable");
+      session.save();
+
+      //check the index
+      String sqlQuery;
+      Query query;
+      QueryResult queryResult;
+      NodeIterator iterator;
+      Node node;
+      QueryManager qm = session.getWorkspace().getQueryManager();
+
+      sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path = '/testSameNameSiblingDelete/node[1]'";
+      query = qm.createQuery(sqlQuery, Query.SQL);
+      queryResult = query.execute();
+      iterator = queryResult.getNodes();
+      assertTrue("Node expected ", iterator.getSize() == 1);
+      node = iterator.nextNode();
+      assertEquals("Wrong id ", subNode_1.getUUID(), node.getUUID());
+      assertEquals("Wrong path ", subNode_1.getPath(), node.getPath());
+
+      // move
+      testRoot.addNode("folder");
+      session.save();
+      session.move("/testSameNameSiblingDelete/node", "/testSameNameSiblingDelete/folder/node");
+      session.save();
+
+      sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path = '/testSameNameSiblingDelete/node[1]'";
+      query = qm.createQuery(sqlQuery, Query.SQL);
+      queryResult = query.execute();
+      iterator = queryResult.getNodes();
+      assertTrue("There must be no node ", iterator.getSize() == 0);
+
+      sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path = '/testSameNameSiblingDelete/folder/node[1]'";
+      query = qm.createQuery(sqlQuery, Query.SQL);
+      queryResult = query.execute();
+      iterator = queryResult.getNodes();
+      assertTrue("Node expected ", iterator.getSize() == 1);
+      node = iterator.nextNode();
+      assertEquals("Wrong id ", subNode_1.getUUID(), node.getUUID());
+      assertEquals("Wrong path ", subNode_1.getPath(), node.getPath());
+   }
+
+}

Added: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query/TestQueryChilds.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query/TestQueryChilds.java	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/usecases/query/TestQueryChilds.java	2011-09-01 09:40:53 UTC (rev 4825)
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.usecases.query;
+
+import org.exoplatform.services.jcr.usecases.BaseUsecasesTest;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+import javax.jcr.query.QueryResult;
+
+/**
+ * @author <a href="mailto:skarpenko at exoplatform.com">Sergiy Karpenko</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 16 ????. 2011 skarpenko $
+ *
+ */
+public class TestQueryChilds extends BaseUsecasesTest
+{
+   public void testGetChilds() throws Exception
+   {
+      Node testRoot = this.root.addNode("testSameNameSiblingDelete");
+
+      Node subNode_1 = testRoot.addNode("node", "nt:unstructured"); // 1
+      Node subNode_1_1 = subNode_1.addNode("node1", "nt:unstructured");
+      Node subNode_1_2 = subNode_1.addNode("node2", "nt:unstructured");
+      Node subNode_1_1_1 = subNode_1_1.addNode("node11", "nt:unstructured");
+      //Node subNode_1_1_2 = subNode_1_1.addNode("node12", "nt:unstructured");
+      Node subNode_2 = testRoot.addNode("node", "nt:unstructured"); // 2
+      Node subNode_2_1 = subNode_2.addNode("node3", "nt:unstructured");
+      Node subNode_2_2 = subNode_2.addNode("node4", "nt:unstructured");
+
+      session.save();
+
+      //check the index
+      String sqlQuery;
+      Query query;
+      QueryResult queryResult;
+      NodeIterator iterator;
+      Node node;
+      QueryManager qm = session.getWorkspace().getQueryManager();
+
+      sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path LIKE '/testSameNameSiblingDelete/node/%'";
+      query = qm.createQuery(sqlQuery, Query.SQL);
+      queryResult = query.execute();
+      iterator = queryResult.getNodes();
+      assertTrue("Node expected ", iterator.getSize() == 3);
+      //      node = iterator.nextNode();
+      //      assertEquals("Wrong id ", subNode_1.getUUID(), node.getUUID());
+      //      assertEquals("Wrong path ", subNode_1.getPath(), node.getPath());
+      testNames(iterator, new String[]{"node1", "node2", "node11"}); //, "node3", "node4" 
+
+      //      // move
+      //      testRoot.addNode("folder");
+      //      session.save();
+      //      session.move("/testSameNameSiblingDelete/node", "/testSameNameSiblingDelete/folder/node");
+      //      session.save();
+      //
+      //      sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path = '/testSameNameSiblingDelete/node[1]'";
+      //      query = qm.createQuery(sqlQuery, Query.SQL);
+      //      queryResult = query.execute();
+      //      iterator = queryResult.getNodes();
+      //      assertTrue("There must be no node ", iterator.getSize() == 0);
+      //
+      //      sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path = '/testSameNameSiblingDelete/folder/node[1]'";
+      //      query = qm.createQuery(sqlQuery, Query.SQL);
+      //      queryResult = query.execute();
+      //      iterator = queryResult.getNodes();
+      //      assertTrue("Node expected ", iterator.getSize() == 1);
+      //      node = iterator.nextNode();
+      //      assertEquals("Wrong id ", subNode_1.getUUID(), node.getUUID());
+      //      assertEquals("Wrong path ", subNode_1.getPath(), node.getPath());
+   }
+
+}



More information about the exo-jcr-commits mailing list