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);