Author: sergiykarpenko
Date: 2011-08-30 05:41:24 -0400 (Tue, 30 Aug 2011)
New Revision: 4806
Added:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/TestQueryIndexReordering.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-1571 committed (node index 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-08-30
08:15:45 UTC (rev 4805)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ChildAxisQuery.java 2011-08-30
09:41:24 UTC (rev 4806)
@@ -538,15 +538,14 @@
{
if (position != LocationStepQueryNode.NONE)
{
- Document node = reader.document(i, FieldSelectors.UUID_AND_PARENT);
+ Document node = reader.document(i,
FieldSelectors.UUID_AND_PARENT_AND_INDEX);
String parentId = node.get(FieldNames.PARENT);
String id = node.get(FieldNames.UUID);
try
{
- //NodeState state = (NodeState) itemMgr.getItemState(parentId);
- NodeData state = (NodeData)itemMgr.getItemData(parentId);
if (nameTest == null)
{
+ NodeData state = (NodeData)itemMgr.getItemData(parentId);
// only select this node if it is the child at
// specified position
if (position == LocationStepQueryNode.LAST)
@@ -574,6 +573,7 @@
// specified position
if (position == LocationStepQueryNode.LAST)
{
+ NodeData state = (NodeData)itemMgr.getItemData(parentId);
// only select last
if (state == null)
@@ -591,6 +591,11 @@
}
}
}
+ else if (version.getVersion() >=
IndexFormatVersion.V4.getVersion())
+ {
+ if (Integer.valueOf(node.get(FieldNames.INDEX)) != position)
+ return false;
+ }
else
{
NodeData nodeData = (NodeData)itemMgr.getItemData(id);
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-08-30
08:15:45 UTC (rev 4805)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldNames.java 2011-08-30
09:41:24 UTC (rev 4806)
@@ -64,6 +64,11 @@
public static final String LOCAL_NAME = "_:LOCAL_NAME".intern();
/**
+ * Name of the field that contains the index of the item.
+ */
+ public static final String INDEX = "_:INDEX".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-08-30
08:15:45 UTC (rev 4805)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/FieldSelectors.java 2011-08-30
09:41:24 UTC (rev 4806)
@@ -63,4 +63,25 @@
}
}
};
+
+ public static final FieldSelector UUID_AND_PARENT_AND_INDEX = new FieldSelector() {
+ /**
+ * Accepts {@link FieldNames#UUID}, {@link FieldNames#PARENT}
+ * and {@link FieldNames#INDEX}.
+ *
+ * @param fieldName the field name to check.
+ * @return result.
+ */
+ public FieldSelectorResult accept(String fieldName) {
+ if (FieldNames.UUID == fieldName) {
+ return FieldSelectorResult.LOAD;
+ } else if (FieldNames.PARENT == fieldName) {
+ return FieldSelectorResult.LOAD;
+ } else if (FieldNames.INDEX == 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-08-30
08:15:45 UTC (rev 4805)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexFormatVersion.java 2011-08-30
09:41:24 UTC (rev 4806)
@@ -16,10 +16,10 @@
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
+import org.apache.lucene.index.IndexReader;
+
import java.util.Collection;
-import org.apache.lucene.index.IndexReader;
-
/**
* This class indicates the lucene index format that is used.
* <ul>
@@ -52,11 +52,16 @@
public static final IndexFormatVersion V2 = new IndexFormatVersion(2);
/**
- * V3 is the index format for Jackrabbit releases >= 1.5
+ * V3 is the index format for Jackrabbit releases 1.5.x
*/
public static final IndexFormatVersion V3 = new IndexFormatVersion(3);
/**
+ * V4 is the index format for Jackrabbit releases >= 1.6
+ */
+ public static final IndexFormatVersion V4 = new IndexFormatVersion(4);
+
+ /**
* The used version of the index format
*/
private final int version;
@@ -104,7 +109,9 @@
public static IndexFormatVersion getVersion(IndexReader indexReader) {
Collection fields = indexReader.getFieldNames(
IndexReader.FieldOption.ALL);
- if (fields.contains(FieldNames.LOCAL_NAME) || indexReader.numDocs() == 0) {
+ if (fields.contains(FieldNames.INDEX) || indexReader.numDocs() == 0) {
+ return IndexFormatVersion.V4;
+ } else if (fields.contains(FieldNames.LOCAL_NAME)) {
return IndexFormatVersion.V3;
} else if (fields.contains(FieldNames.PROPERTIES_SET)) {
return IndexFormatVersion.V2;
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-08-30
08:15:45 UTC (rev 4805)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java 2011-08-30
09:41:24 UTC (rev 4806)
@@ -217,6 +217,12 @@
// unknown uri<->prefix mappings
}
+ if (indexFormatVersion.getVersion() >= IndexFormatVersion.V4.getVersion())
+ {
+ doc.add(new Field(FieldNames.INDEX,
Integer.toString(node.getQPath().getIndex()), Field.Store.YES,
+ Field.Index.NOT_ANALYZED_NO_NORMS));
+ }
+
Collection<PropertyData> props = node.getChildPropertiesData();
if (props == null)
{
@@ -334,7 +340,7 @@
if (encProp == null)
{
encProp =
- (PropertyData)stateProvider.getItemData(node, new
QPathEntry(Constants.JCR_ENCODING, 0),
+ (PropertyData)stateProvider.getItemData(node, new
QPathEntry(Constants.JCR_ENCODING, 0),
ItemType.PROPERTY);
}
Added:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/TestQueryIndexReordering.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/TestQueryIndexReordering.java
(rev 0)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/core/query/TestQueryIndexReordering.java 2011-08-30
09:41:24 UTC (rev 4806)
@@ -0,0 +1,124 @@
+/*
+ * 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(a)gmail.com">Karpenko Sergiy</a>
+ * @version $Id: TestIndexReordering.java 111 2008-11-11 11:11:11Z serg $
+ */
+public class TestQueryIndexReordering 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");
+ subNode_1.setProperty("prop", "data 1");
+ Node subNode_2 = testRoot.addNode("node", "nt:unstructured");
// 2
+ subNode_2.addMixin("mix:referenceable");
+ subNode_2.setProperty("prop", "data 2");
+ Node subNode_3 = testRoot.addNode("node", "nt:unstructured");
// 3
+ subNode_3.addMixin("mix:referenceable");
+ subNode_3.setProperty("prop", "data 3");
+ 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());
+
+ sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path =
'/testSameNameSiblingDelete/node[2]'";
+ 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_2.getUUID(), node.getUUID());
+ assertEquals("Wrong path ", subNode_2.getPath(), node.getPath());
+
+ sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path =
'/testSameNameSiblingDelete/node[3]'";
+ 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_3.getUUID(), node.getUUID());
+ assertEquals("Wrong path ", subNode_3.getPath(), node.getPath());
+
+ // usecase - order to the end,
+ // i.e. /testSameNameSiblingDelete/node[2] will be UPDATED to
+ // /testSameNameSiblingDelete/node[1]
+ // i.e. /testSameNameSiblingDelete/node[3] will be UPDATED to
+ // /testSameNameSiblingDelete/node[2]
+ subNode_1.getParent().orderBefore("node", null);
+ 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("Node expected ", iterator.getSize() == 1);
+ node = iterator.nextNode();
+ assertEquals("Wrong id ", subNode_2.getUUID(), node.getUUID());
+ assertEquals("Wrong path ", subNode_2.getPath(), node.getPath());
+
+ sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path =
'/testSameNameSiblingDelete/node[2]'";
+ 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_3.getUUID(), node.getUUID());
+ assertEquals("Wrong path ", subNode_3.getPath(), node.getPath());
+
+ sqlQuery = "SELECT * FROM nt:unstructured WHERE jcr:path =
'/testSameNameSiblingDelete/node[3]'";
+ 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());
+ }
+
+}