[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