SOLR-15071: Fix ArrayIndexOutOfBoundsException in contrib/ltr SolrFeatureScorer (#2196)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index c07d251..5e8a254 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -366,6 +366,9 @@
* SOLR-15073: Fix ClassCastException in SystemInfoHandler.getSecurityInfo. (Nikolay Ivanov, Christine Poerschke)
+* SOLR-15071: Fix ArrayIndexOutOfBoundsException in contrib/ltr SolrFeatureScorer.
+ (Florin Babes, Ovidiu Mihalcea, David Smiley, Christine Poerschke)
+
Other Changes
---------------------
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/feature/Feature.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/feature/Feature.java
index bc7ff87..52a0cef 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/feature/Feature.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/feature/Feature.java
@@ -27,7 +27,6 @@
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryVisitor;
import org.apache.lucene.search.Scorer;
-import org.apache.lucene.search.TwoPhaseIterator;
import org.apache.lucene.search.Weight;
import org.apache.lucene.util.Accountable;
import org.apache.lucene.util.RamUsageEstimator;
@@ -365,10 +364,9 @@
return in.iterator();
}
- @Override
- public TwoPhaseIterator twoPhaseIterator() {
- return in.twoPhaseIterator();
- }
+ // Currently (Q1 2021) we intentionally don't delegate twoPhaseIterator()
+ // because it doesn't always work and we don't yet know why, please see
+ // SOLR-15071 for more details.
@Override
public int advanceShallow(int target) throws IOException {
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestEdisMaxSolrFeature.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestEdisMaxSolrFeature.java
index f9401eb..bbc8815 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestEdisMaxSolrFeature.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestEdisMaxSolrFeature.java
@@ -21,7 +21,6 @@
import org.apache.solr.ltr.model.LinearModel;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
public class TestEdisMaxSolrFeature extends TestRerankBase {
@@ -75,7 +74,6 @@
assertJQ("/query" + query.toQueryString(), "/response/numFound/==4");
}
- @Ignore("SOLR-15071")
@Test
public void testEdisMaxSolrFeatureCustomMM() throws Exception {
loadFeature(
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestFeature.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestFeature.java
index 15fc40d..6c4dc08 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestFeature.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestFeature.java
@@ -30,6 +30,9 @@
for (final Method scorerClassMethod : Scorer.class.getDeclaredMethods()) {
try {
+ // the FilterFeatureScorer may simply inherit Scorer's default implementation
+ if (scorerClassMethod.getName().equals("twoPhaseIterator")) continue;
+
// the FilterFeatureScorer's implementation does not influence its parent Weight
if (scorerClassMethod.getName().equals("getWeight")) continue;