You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mk...@apache.org on 2015/08/03 19:24:31 UTC
svn commit: r1693941 - in /lucene/dev/branches/branch_5x: ./ lucene/
lucene/join/ lucene/join/src/java/org/apache/lucene/search/join/ solr/
solr/core/ solr/core/src/java/org/apache/solr/search/
solr/core/src/java/org/apache/solr/search/join/ solr/core/...
Author: mkhl
Date: Mon Aug 3 17:24:30 2015
New Revision: 1693941
URL: http://svn.apache.org/r1693941
Log:
SOLR-5882: introducing local param {!parent score=..}..
fixing ScoreMode.Min for ToParentBlockJoinQuery
fixing ScoreMode parsing exception in ScoreJoinQParserPlugin
Added:
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/ScoreModeParser.java
- copied unchanged from r1693926, lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/join/ScoreModeParser.java
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/lucene/ (props changed)
lucene/dev/branches/branch_5x/lucene/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_5x/lucene/join/ (props changed)
lucene/dev/branches/branch_5x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinChildQParser.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParserPlugin.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/TestScoreJoinQPScore.java
Modified: lucene/dev/branches/branch_5x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/CHANGES.txt?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/CHANGES.txt Mon Aug 3 17:24:30 2015
@@ -274,6 +274,8 @@ Bug fixes
* LUCENE-6704: GeoPointDistanceQuery was visiting too many term ranges,
consuming too much heap for a large radius (Nick Knize via Mike McCandless)
+
+* SOLR-5882: fix ScoreMode.Min at ToParentBlockJoinQuery (Mikhail Khludnev)
Changes in Runtime Behavior
Modified: lucene/dev/branches/branch_5x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java (original)
+++ lucene/dev/branches/branch_5x/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java Mon Aug 3 17:24:30 2015
@@ -297,7 +297,7 @@ public class ToParentBlockJoinQuery exte
pendingChildScores[childDocUpto] = childScore;
}
maxScore = Math.max(childScore, maxScore);
- minScore = Math.min(childFreq, minScore);
+ minScore = Math.min(childScore, minScore);
totalScore += childScore;
parentFreq += childFreq;
}
Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Mon Aug 3 17:24:30 2015
@@ -109,6 +109,8 @@ New Features
* SOLR-2522: new two argument option for the existing field() function; picks the min/max value of a
docValues field to use as a ValueSource: "field(field_name,min)" and "field(field_name,max)" (hossman)
+* SOLR-5882: score local parameter for block join query parser {!parent} (Andrey Kudryavtsev, Mikhail Khludnev)
+
Bug Fixes
----------------------
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinChildQParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinChildQParser.java?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinChildQParser.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinChildQParser.java Mon Aug 3 17:24:30 2015
@@ -28,7 +28,8 @@ public class BlockJoinChildQParser exten
super(qstr, localParams, params, req);
}
- protected Query createQuery(Query parentListQuery, Query query) {
+ @Override
+ protected Query createQuery(Query parentListQuery, Query query, String scoreMode) {
return new ToChildBlockJoinQuery(query, getFilter(parentListQuery).filter);
}
@@ -37,5 +38,3 @@ public class BlockJoinChildQParser exten
return "of";
}
}
-
-
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParser.java Mon Aug 3 17:24:30 2015
@@ -55,6 +55,7 @@ class BlockJoinParentQParser extends QPa
@Override
public Query parse() throws SyntaxError {
String filter = localParams.get(getParentFilterLocalParamName());
+ String scoreMode = localParams.get("score", ScoreMode.None.name());
QParser parentParser = subQuery(filter, null);
Query parentQ = parentParser.getQuery();
@@ -67,11 +68,12 @@ class BlockJoinParentQParser extends QPa
}
QParser childrenParser = subQuery(queryText, null);
Query childrenQuery = childrenParser.getQuery();
- return createQuery(parentQ, childrenQuery);
+ return createQuery(parentQ, childrenQuery, scoreMode);
}
- protected Query createQuery(Query parentList, Query query) {
- return new ToParentBlockJoinQuery(query, getFilter(parentList).filter, ScoreMode.None);
+ protected Query createQuery(Query parentList, Query query, String scoreMode) throws SyntaxError {
+ return new ToParentBlockJoinQuery(query, getFilter(parentList).filter,
+ ScoreModeParser.parse(scoreMode));
}
BitDocIdSetFilterWrapper getFilter(Query parentList) {
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParserPlugin.java?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParserPlugin.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/BlockJoinParentQParserPlugin.java Mon Aug 3 17:24:30 2015
@@ -17,6 +17,7 @@
package org.apache.solr.search.join;
+import org.apache.lucene.search.join.ScoreMode;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
@@ -25,7 +26,8 @@ import org.apache.solr.search.QParserPlu
/**
* Usage: {!parent which="PARENT:true"}CHILD_PRICE:10
- *
+ * supports optional <code>score</code> parameter with one of {@link ScoreMode} values:
+ * None,Avg,Total,Min,Max. Lowercase is also accepted.
**/
public class BlockJoinParentQParserPlugin extends QParserPlugin {
public static final String NAME = "parent";
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java Mon Aug 3 17:24:30 2015
@@ -18,10 +18,6 @@
package org.apache.solr.search.join;
import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
import org.apache.lucene.index.DocValuesType;
import org.apache.lucene.index.IndexReader;
@@ -207,15 +203,6 @@ public class ScoreJoinQParserPlugin exte
}
}
- final static Map<String, ScoreMode> lowercase = Collections.unmodifiableMap( new HashMap<String, ScoreMode>() {
- {
- for (ScoreMode s : ScoreMode.values()) {
- put(s.name().toLowerCase(Locale.ROOT), s);
- put(s.name(), s);
- }
- }
- });
-
@Override
public void init(NamedList args) {
}
@@ -229,7 +216,7 @@ public class ScoreJoinQParserPlugin exte
final String fromField = localParams.get("from");
final String fromIndex = localParams.get("fromIndex");
final String toField = localParams.get("to");
- final ScoreMode scoreMode = parseScore();
+ final ScoreMode scoreMode = ScoreModeParser.parse(getParam(SCORE));
final String v = localParams.get(CommonParams.VALUE);
@@ -279,16 +266,8 @@ public class ScoreJoinQParserPlugin exte
return new SameCoreJoinQuery(fromQuery, fromField, toField, scoreMode);
}
}
-
- private ScoreMode parseScore() {
-
- String score = getParam(SCORE);
- final ScoreMode scoreMode = lowercase.get(score);
- if (scoreMode == null) {
- throw new IllegalArgumentException("Unable to parse ScoreMode from: " + score);
- }
- return scoreMode;
- }
};
}
}
+
+
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/BJQParserTest.java Mon Aug 3 17:24:30 2015
@@ -17,9 +17,12 @@
package org.apache.solr.search.join;
+import org.apache.lucene.search.join.ScoreMode;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.SolrException;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.search.SolrCache;
+import org.apache.solr.util.BaseTestHarness;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -29,6 +32,10 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
+import java.util.Locale;
+
+import javax.xml.namespace.QName;
+import javax.xml.xpath.XPathConstants;
public class BJQParserTest extends SolrTestCaseJ4 {
@@ -164,7 +171,53 @@ public class BJQParserTest extends SolrT
"parent_s:(e b)", "chq", "child_s:l", "pq", "parent_s:[* TO *]"),
beParents);
}
+
+ public void testScoreNoneScoringForParent() throws Exception {
+ assertQ("score=none yields 0.0 score",
+ req("q", "{!parent which=\"parent_s:[* TO *]\" "+(
+ rarely()? "":(rarely()? "score=None":"score=none")
+ )+"}child_s:l","fl","score"),
+ "//*[@numFound='6']",
+ "(//float[@name='score'])["+(random().nextInt(6)+1)+"]=0.0");
+ }
+
+ public void testWrongScoreExceptionForParent() throws Exception {
+ final String aMode = ScoreMode.values()[random().nextInt(ScoreMode.values().length)].name();
+ final String wrongMode = rarely()? "":(rarely()? " ":
+ rarely()? aMode.substring(1):aMode.toUpperCase(Locale.ROOT));
+ assertQEx("wrong score mode",
+ req("q", "{!parent which=\"parent_s:[* TO *]\" score="+wrongMode+"}child_s:l","fl","score")
+ , SolrException.ErrorCode.BAD_REQUEST.code);
+ }
+
+ public void testScoresForParent() throws Exception{
+ final ArrayList<ScoreMode> noNone = new ArrayList<>(Arrays.asList(ScoreMode.values()));
+ noNone.remove(ScoreMode.None);
+ final String notNoneMode = (noNone.get(random().nextInt(noNone.size()))).name();
+
+ String leastScore = getLeastScore("child_s:l");
+ assertTrue(leastScore+" > 0.0", Float.parseFloat(leastScore)>0.0);
+ final String notNoneLower = usually() ? notNoneMode: notNoneMode.toLowerCase(Locale.ROOT);
+
+ assertQ(req("q", "{!parent which=\"parent_s:[* TO *]\" score="+notNoneLower+"}child_s:l","fl","score"),
+ "//*[@numFound='6']","(//float[@name='score'])["+(random().nextInt(6)+1)+"]>='"+leastScore+"'");
+ }
+ public void testScoresForChild() throws Exception{
+ String leastScore = getLeastScore("parent_s:a");
+ assertTrue(leastScore+" > 0.0", Float.parseFloat(leastScore)>0.0);
+ assertQ(
+ req("q", "{!child of=\"parent_s:[* TO *]\"}parent_s:a","fl","score"),
+ "//*[@numFound='6']","(//float[@name='score'])["+(random().nextInt(6)+1)+"]>='"+leastScore+"'");
+ }
+
+ private String getLeastScore(String query) throws Exception {
+ final String resp = h.query(req("q",query, "sort","score asc", "fl","score"));
+ return (String) BaseTestHarness.
+ evaluateXPath(resp,"(//float[@name='score'])[1]/text()",
+ XPathConstants.STRING);
+ }
+
@Test
public void testFq() {
assertQ(
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/TestScoreJoinQPScore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/TestScoreJoinQPScore.java?rev=1693941&r1=1693940&r2=1693941&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/TestScoreJoinQPScore.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/search/join/TestScoreJoinQPScore.java Mon Aug 3 17:24:30 2015
@@ -27,6 +27,7 @@ import java.util.Random;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.join.ScoreMode;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.SolrException;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestInfo;
@@ -245,14 +246,11 @@ public class TestScoreJoinQPScore extend
assertEquals("lowercase shouldn't change anything", resp, repeat);
- try {
- h.query(req("q", "{!join from=" + from + " to=" + to + " score=" + score.substring(0, score.length() - 1) +
- "}" + q, "fl", "id", "omitHeader", "true")
- );
- fail("excpecting exception");
- } catch (IllegalArgumentException e) {
- assertTrue(e.getMessage().contains("ScoreMode"));
- }
+ final String aMod = score.substring(0, score.length() - 1);
+ assertQEx("exception on "+aMod, "ScoreMode",
+ req("q", "{!join from=" + from + " to=" + to + " score=" + aMod +
+ "}" + q, "fl", "id", "omitHeader", "true"),
+ SolrException.ErrorCode.BAD_REQUEST);
}
// this queries are not overlap, with other in this test case.
// however it might be better to extract this method into the separate suite