Author: alexparvulescu Date: Fri May 27 14:39:26 2011 New Revision: 1128325 URL: http://svn.apache.org/viewvc?rev=1128325&view=rev Log: JCR-2980 Nodes that have properties marked for async extraction should be available for querying Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java (with props) Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java?rev=1128325&r1=1128324&r2=1128325&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java Fri May 27 14:39:26 2011 @@ -16,7 +16,18 @@ */ package org.apache.jackrabbit.core.query.lucene; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CountDownLatch; + import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Fieldable; @@ -30,16 +41,6 @@ import org.apache.tika.io.IOExceptionWit import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.BitSet; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.CountDownLatch; - /** * Implements common functionality for a lucene index. *
@@ -501,6 +502,9 @@ abstract class AbstractIndex { indexed, tv); } else if (f.isBinary()) { field = new Field(f.name(), f.getBinaryValue(), stored); + } else if (f.tokenStreamValue() != null) { + TokenStream ts = f.tokenStreamValue(); + field = new Field(f.name(), ts); } if (field != null) { field.setOmitNorms(f.getOmitNorms()); Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java?rev=1128325&r1=1128324&r2=1128325&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java (original) +++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java Fri May 27 14:39:26 2011 @@ -263,6 +263,13 @@ public class AbstractQueryTest extends A return qm.createQuery(statement, JCR_SQL2).execute(); } + protected void executeSQL2Query(String statement, Node[] nodes) + throws RepositoryException { + getSearchIndex().flush(); + QueryResult res = qm.createQuery(statement, JCR_SQL2).execute(); + checkResult(res, nodes); + } + /** * Returns a reference to the underlying search index. * Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java?rev=1128325&view=auto ============================================================================== --- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java (added) +++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java Fri May 27 14:39:26 2011 @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.core.query.lucene; + +import static javax.jcr.query.Query.JCR_SQL2; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.Calendar; + +import javax.jcr.Node; + +import org.apache.commons.io.input.NullInputStream; +import org.apache.jackrabbit.JcrConstants; +import org.apache.jackrabbit.commons.JcrUtils; +import org.apache.jackrabbit.core.query.AbstractIndexingTest; + +/** + *IndexingAggregateTest checks if the nt:file nt:resource
+ * aggregate defined in workspace indexing-test works properly.
+ */
+public class SQL2IndexingAggregateTest extends AbstractIndexingTest {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ for (Node c : JcrUtils.getChildNodes(testRootNode)) {
+ testRootNode.getSession().removeItem(c.getPath());
+ }
+ testRootNode.getSession().save();
+ }
+
+ public void testNtFileAggregate() throws Exception {
+
+ String sqlBase = "SELECT * FROM [nt:file] as f"
+ + " WHERE ISCHILDNODE([" + testRoot + "])";
+ String sqlCat = sqlBase + " AND CONTAINS (f.*, 'cat')";
+ String sqlDog = sqlBase + " AND CONTAINS (f.*, 'dog')";
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ Writer writer = new OutputStreamWriter(out, "UTF-8");
+ writer.write("the quick brown fox jumps over the lazy dog.");
+ writer.flush();
+
+ Node file = testRootNode.addNode("myFile", "nt:file");
+ Node resource = file.addNode("jcr:content", "nt:resource");
+ resource.setProperty("jcr:lastModified", Calendar.getInstance());
+ resource.setProperty("jcr:encoding", "UTF-8");
+ resource.setProperty("jcr:mimeType", "text/plain");
+ resource.setProperty("jcr:data", session.getValueFactory()
+ .createBinary(new ByteArrayInputStream(out.toByteArray())));
+ testRootNode.getSession().save();
+ executeSQL2Query(sqlDog, new Node[] { file });
+
+ // update jcr:data
+ out.reset();
+ writer.write("the quick brown fox jumps over the lazy cat.");
+ writer.flush();
+ resource.setProperty("jcr:data", session.getValueFactory()
+ .createBinary(new ByteArrayInputStream(out.toByteArray())));
+ testRootNode.getSession().save();
+ executeSQL2Query(sqlCat, new Node[] { file });
+
+ // replace jcr:content with unstructured
+ resource.remove();
+ Node unstrContent = file.addNode("jcr:content", "nt:unstructured");
+ Node foo = unstrContent.addNode("foo");
+ foo.setProperty("text", "the quick brown fox jumps over the lazy dog.");
+ testRootNode.getSession().save();
+ executeSQL2Query(sqlDog, new Node[] { file });
+
+ // remove foo
+ foo.remove();
+ testRootNode.getSession().save();
+
+ executeSQL2Query(sqlDog, new Node[] {});
+
+ // replace jcr:content again with resource
+ unstrContent.remove();
+ resource = file.addNode("jcr:content", "nt:resource");
+ resource.setProperty("jcr:lastModified", Calendar.getInstance());
+ resource.setProperty("jcr:encoding", "UTF-8");
+ resource.setProperty("jcr:mimeType", "text/plain");
+ resource.setProperty("jcr:data", session.getValueFactory()
+ .createBinary(new ByteArrayInputStream(out.toByteArray())));
+ testRootNode.getSession().save();
+ executeSQL2Query(sqlCat, new Node[] { file });
+
+ }
+
+ /**
+ * checks that while text extraction runs in the background, the node is
+ * available for query on any of its properties
+ *
+ * see JCR-2980
+ *
+ */
+ public void testAsyncIndexQuery() throws Exception {
+
+ Node n = testRootNode.addNode("justnode", JcrConstants.NT_UNSTRUCTURED);
+ n.setProperty("type", "testnode");
+ n.setProperty("jcr:encoding", "UTF-8");
+ n.setProperty("jcr:mimeType", "text/plain");
+ n.setProperty(
+ "jcr:data",
+ session.getValueFactory().createBinary(
+ new NullInputStream(1024 * 40)));
+ testRootNode.getSession().save();
+
+ String sql = "SELECT * FROM [nt:unstructured] as f "
+ + " WHERE ISCHILDNODE([" + testRoot
+ + "]) and type = 'testnode' ";
+ checkResult(qm.createQuery(sql, JCR_SQL2).execute(), 1);
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/lucene/SQL2IndexingAggregateTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain