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