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