You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2014/11/05 16:11:07 UTC

svn commit: r1636895 - /jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java

Author: thomasm
Date: Wed Nov  5 15:11:07 2014
New Revision: 1636895

URL: http://svn.apache.org/r1636895
Log:
OAK-2249 Query with mixed full-text, "and", "or" conditions fails

Modified:
    jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java

Modified: jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java?rev=1636895&r1=1636894&r2=1636895&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java (original)
+++ jackrabbit/oak/branches/1.0/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java Wed Nov  5 15:11:07 2014
@@ -16,13 +16,18 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.ImmutableList.of;
 import static com.google.common.collect.Lists.newArrayList;
+import static org.apache.jackrabbit.JcrConstants.JCR_CONTENT;
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
 import static org.apache.jackrabbit.JcrConstants.NT_FILE;
 import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
 import static org.apache.jackrabbit.oak.api.Type.NAME;
 import static org.apache.jackrabbit.oak.api.Type.STRING;
+import static org.apache.jackrabbit.oak.api.Type.STRINGS;
 import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
 import static org.junit.Assert.fail;
 
@@ -31,6 +36,8 @@ import java.io.InputStream;
 import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.api.ContentRepository;
 import org.apache.jackrabbit.oak.api.Root;
@@ -57,6 +64,7 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 
 public class LuceneIndexAggregationTest2 extends AbstractQueryTest {
@@ -217,4 +225,85 @@ public class LuceneIndexAggregationTest2
         // setTraversalEnabled(true);
     }
 
+    @Test
+    public void oak2249() throws Exception {
+        // setTraversalEnabled(false);
+        final String statement = "//element(*, test:Asset)[ " +
+            "( " +
+                "jcr:contains(., 'summer') " +
+                "or " + 
+                "jcr:content/metadata/@tags = 'namespace:season/summer' " +
+            ") and " +
+                "jcr:contains(jcr:content/metadata/@format, 'image') " +
+            "]"; 
+        
+        Tree content = root.getTree("/").addChild("content");
+        List<String> expected = newArrayList();
+        
+        Tree metadata = createAssetStructure(content, "tagged");
+        metadata.setProperty("tags", of("namespace:season/summer"), STRINGS);
+        metadata.setProperty("format", "image/jpeg", STRING);
+        expected.add("/content/tagged");
+        
+        metadata = createAssetStructure(content, "titled");
+        metadata.setProperty("title", "Lorem summer ipsum", STRING);
+        metadata.setProperty("format", "image/jpeg", STRING);
+        expected.add("/content/titled");
+
+        metadata = createAssetStructure(content, "summer-node");
+        metadata.setProperty("format", "image/jpeg", STRING);
+        expected.add("/content/summer-node");
+        
+        // the following is NOT expected
+        metadata = createAssetStructure(content, "winter-node");
+        metadata.setProperty("tags", of("namespace:season/winter"), STRINGS);
+        metadata.setProperty("title", "Lorem winter ipsum", STRING);
+        metadata.setProperty("format", "image/jpeg", STRING);
+
+        root.commit();
+        
+        assertQuery(statement, "xpath", expected);
+        // setTraversalEnabled(true);
+    }
+    
+    /**
+     * <p>
+     * convenience method that create an "asset" structure like
+     * </p>
+     * 
+     * <pre>
+     *  "parent" : {
+     *      "nodeName" : {
+     *          "jcr:primaryType" : "test:Asset",
+     *          "jcr:content" : {
+     *              "jcr:primaryType" : "test:AssetContent",
+     *              "metatada" : {
+     *                  "jcr:primaryType" : "nt:unstructured"
+     *              }
+     *          }
+     *      }
+     *  }
+     * </pre>
+     * 
+     * <p>
+     *  and returns the {@code metadata} node
+     * </p>
+     * 
+     * @param parent the parent under which creating the node
+     * @param nodeName the node name to be used
+     * @return the {@code metadata} node. See above for details
+     */
+    private static Tree createAssetStructure(@Nonnull final Tree parent, 
+                                             @Nonnull final String nodeName) {
+        checkNotNull(parent);
+        checkArgument(!Strings.isNullOrEmpty(nodeName), "nodeName cannot be null or empty");
+        
+        Tree node = parent.addChild(nodeName);
+        node.setProperty(JCR_PRIMARYTYPE, NT_TEST_ASSET, NAME);
+        node = node.addChild(JCR_CONTENT);
+        node.setProperty(JCR_PRIMARYTYPE, NT_TEST_ASSETCONTENT, NAME);
+        node = node.addChild("metadata");
+        node.setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME);
+        return node;
+    }
 }