Author: amitj
Date: Wed Jun 24 06:04:20 2015
New Revision: 1687175

URL: http://svn.apache.org/r1687175
Log:
OAK-3020: Async Update fails after IllegalArgumentException

Ignore any multi-valued ordered property.

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java?rev=1687175&r1=1687174&r2=1687175&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
 Wed Jun 24 06:04:20 2015
@@ -461,6 +461,14 @@ public class LuceneIndexEditor implement
                                           PropertyState property,
                                           String pname,
                                           PropertyDefinition pd) throws 
CommitFailedException {
+        // Ignore and warn if property multi-valued as not supported
+        if (property.getType().isArray()) {
+            log.warn(
+                "Ignoring ordered property {} of type {} for path {} as 
multivalued ordered property not supported",
+                pname, Type.fromTag(property.getType().tag(), true), 
getPath());
+            return false;
+        }
+
         int tag = property.getType().tag();
         int idxDefinedTag = pd.getType();
         // Try converting type to the defined type in the index definition
@@ -475,37 +483,35 @@ public class LuceneIndexEditor implement
 
         String name = FieldNames.createDocValFieldName(pname);
         boolean fieldAdded = false;
-        for (int i = 0; i < property.count(); i++) {
-            Field f = null;
-            try {
-                if (tag == Type.LONG.tag()) {
-                    //TODO Distinguish fields which need to be used for search 
and for sort
-                    //If a field is only used for Sort then it can be stored 
with less precision
-                    f = new NumericDocValuesField(name, 
property.getValue(Type.LONG, i));
-                } else if (tag == Type.DATE.tag()) {
-                    String date = property.getValue(Type.DATE, i);
-                    f = new NumericDocValuesField(name, 
FieldFactory.dateToLong(date));
-                } else if (tag == Type.DOUBLE.tag()) {
-                    f = new DoubleDocValuesField(name, 
property.getValue(Type.DOUBLE, i));
-                } else if (tag == Type.BOOLEAN.tag()) {
-                    f = new SortedDocValuesField(name,
-                        new BytesRef(property.getValue(Type.BOOLEAN, 
i).toString()));
-                } else if (tag == Type.STRING.tag()) {
-                    f = new SortedDocValuesField(name,
-                        new BytesRef(property.getValue(Type.STRING, i)));
-                }
+        Field f = null;
+        try {
+            if (tag == Type.LONG.tag()) {
+                //TODO Distinguish fields which need to be used for search and 
for sort
+                //If a field is only used for Sort then it can be stored with 
less precision
+                f = new NumericDocValuesField(name, 
property.getValue(Type.LONG));
+            } else if (tag == Type.DATE.tag()) {
+                String date = property.getValue(Type.DATE);
+                f = new NumericDocValuesField(name, 
FieldFactory.dateToLong(date));
+            } else if (tag == Type.DOUBLE.tag()) {
+                f = new DoubleDocValuesField(name, 
property.getValue(Type.DOUBLE));
+            } else if (tag == Type.BOOLEAN.tag()) {
+                f = new SortedDocValuesField(name,
+                    new BytesRef(property.getValue(Type.BOOLEAN).toString()));
+            } else if (tag == Type.STRING.tag()) {
+                f = new SortedDocValuesField(name,
+                    new BytesRef(property.getValue(Type.STRING)));
+            }
 
-                if (f != null) {
-                    fields.add(f);
-                    fieldAdded = true;
-                }
-            } catch (Exception e) {
-                log.warn(
-                    "Ignoring ordered property. Could not convert property {} 
of type {} to type " +
-                        "{} for path {}",
-                    pname, Type.fromTag(property.getType().tag(), false),
-                    Type.fromTag(tag, false), getPath(), e);
+            if (f != null) {
+                fields.add(f);
+                fieldAdded = true;
             }
+        } catch (Exception e) {
+            log.warn(
+                "Ignoring ordered property. Could not convert property {} of 
type {} to type " +
+                    "{} for path {}",
+                pname, Type.fromTag(property.getType().tag(), false),
+                Type.fromTag(tag, false), getPath(), e);
         }
         return fieldAdded;
     }

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java?rev=1687175&r1=1687174&r2=1687175&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
 Wed Jun 24 06:04:20 2015
@@ -38,6 +38,7 @@ import static javax.jcr.PropertyType.TYP
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
 import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
 import static org.apache.jackrabbit.JcrConstants.NT_BASE;
 import static 
org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
@@ -66,6 +67,7 @@ import com.google.common.base.Function;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
 import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
@@ -753,6 +755,25 @@ public class LuceneIndexTest {
         assertEquals(1, 
copier.getIndexDir("/oak:index/lucene").listFiles().length);
     }
 
+    @Test
+    public void multiValuesForOrderedIndexShouldNotThrow() {
+        NodeBuilder index = 
newLuceneIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "lucene", null);
+        NodeBuilder singleProp = TestUtil.child(index, 
"indexRules/nt:base/properties/single");
+        singleProp.setProperty(LuceneIndexConstants.PROP_PROPERTY_INDEX, true);
+        singleProp.setProperty(LuceneIndexConstants.PROP_ORDERED, true);
+        singleProp.setProperty(LuceneIndexConstants.PROP_INCLUDED_TYPE, 
PropertyType.TYPENAME_STRING);
+
+        NodeState before = builder.getNodeState();
+        builder.setProperty("single", asList("baz", "bar"), Type.STRINGS);
+        NodeState after = builder.getNodeState();
+
+        try {
+            HOOK.processCommit(before, after, CommitInfo.EMPTY);
+        } catch (CommitFailedException e) {
+            fail("Exception thrown when indexing invalid content");
+        }
+    }
+
     @After
     public void cleanUp(){
         for (File d: dirs){

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1687175&r1=1687174&r2=1687175&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
 Wed Jun 24 06:04:20 2015
@@ -894,6 +894,37 @@ public class LucenePropertyIndexTest ext
         assertSortedString();
     }
 
+    @Test
+    public void sortQueriesWithStringIgnoredMulti_OrderedProps() throws 
Exception {
+        Tree idx = createIndex("test1", of("foo", "bar"));
+        idx.setProperty(createProperty(INCLUDE_PROPERTY_NAMES, of("bar"), 
STRINGS));
+        idx.setProperty(createProperty(ORDERED_PROP_NAMES, of("foo"), 
STRINGS));
+        idx.addChild(PROP_NODE).addChild("foo");
+        root.commit();
+
+        Tree test = root.getTree("/").addChild("test");
+        List<String> values = createStrings(NUMBER_OF_NODES);
+        List<Tuple> tuples = Lists.newArrayListWithCapacity(values.size());
+        for(int i = 0; i < values.size(); i++){
+            Tree child = test.addChild("n" + i);
+            child.setProperty("foo", values.get(i));
+            child.setProperty("bar", "baz");
+            tuples.add(new Tuple(values.get(i), child.getPath()));
+        }
+
+        //Add a wrong multi-valued property
+        Tree child = test.addChild("a");
+        child.setProperty("foo", of("w", "z"), Type.STRINGS);
+        child.setProperty("bar", "baz");
+        root.commit();
+
+        assertOrderedQuery("select [jcr:path] from [nt:base] where [bar] = 
'baz' order by [foo]", Lists
+            .newArrayList(Iterables.concat(Lists.newArrayList("/test/a"), 
getSortedPaths(tuples, OrderDirection.ASC))));
+        assertOrderedQuery("select [jcr:path] from [nt:base] where [bar] = 
'baz' order by [foo] DESC", Lists
+            .newArrayList(Iterables.concat(getSortedPaths(tuples, 
OrderDirection.DESC), Lists.newArrayList("/test/a")
+            )));
+    }
+
     void assertSortedString() throws CommitFailedException {
         Tree test = root.getTree("/").addChild("test");
         List<String> values = createStrings(NUMBER_OF_NODES);


Reply via email to