You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ja...@apache.org on 2012/09/25 03:49:52 UTC

svn commit: r1389679 - in /lucene/dev/branches/lucene_solr_4_0: ./ solr/ solr/CHANGES.txt solr/core/ solr/core/src/java/org/apache/solr/schema/CurrencyField.java solr/core/src/test/org/apache/solr/schema/CurrencyFieldTest.java

Author: janhoy
Date: Tue Sep 25 01:49:51 2012
New Revision: 1389679

URL: http://svn.apache.org/viewvc?rev=1389679&view=rev
Log:
SOLR-3878: NPE in CurrencyValue.parse() while issuing wildcard range query on a CurrencyField (merge from 4.x)

Modified:
    lucene/dev/branches/lucene_solr_4_0/   (props changed)
    lucene/dev/branches/lucene_solr_4_0/solr/   (props changed)
    lucene/dev/branches/lucene_solr_4_0/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/lucene_solr_4_0/solr/core/   (props changed)
    lucene/dev/branches/lucene_solr_4_0/solr/core/src/java/org/apache/solr/schema/CurrencyField.java
    lucene/dev/branches/lucene_solr_4_0/solr/core/src/test/org/apache/solr/schema/CurrencyFieldTest.java

Modified: lucene/dev/branches/lucene_solr_4_0/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_0/solr/CHANGES.txt?rev=1389679&r1=1389678&r2=1389679&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_0/solr/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_4_0/solr/CHANGES.txt Tue Sep 25 01:49:51 2012
@@ -336,6 +336,8 @@ Bug Fixes
 * SOLR-3875: Fixed index boosts on multi-valued fields when docBoost is used 
   (hossman)
 
+* SOLR-3878: Exception when using open-ended range query with CurrencyField (janhoy)
+
 Other Changes
 ----------------------
 

Modified: lucene/dev/branches/lucene_solr_4_0/solr/core/src/java/org/apache/solr/schema/CurrencyField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_0/solr/core/src/java/org/apache/solr/schema/CurrencyField.java?rev=1389679&r1=1389678&r2=1389679&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_0/solr/core/src/java/org/apache/solr/schema/CurrencyField.java (original)
+++ lucene/dev/branches/lucene_solr_4_0/solr/core/src/java/org/apache/solr/schema/CurrencyField.java Tue Sep 25 01:49:51 2012
@@ -225,7 +225,7 @@ public class CurrencyField extends Field
       final CurrencyValue p1 = CurrencyValue.parse(part1, defaultCurrency);
       final CurrencyValue p2 = CurrencyValue.parse(part2, defaultCurrency);
 
-      if (!p1.getCurrencyCode().equals(p2.getCurrencyCode())) {
+      if (p1 != null && p2 != null && !p1.getCurrencyCode().equals(p2.getCurrencyCode())) {
           throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                   "Cannot parse range query " + part1 + " to " + part2 +
                           ": range queries only supported when upper and lower bound have same currency.");
@@ -235,11 +235,12 @@ public class CurrencyField extends Field
   }
 
   public Query getRangeQuery(QParser parser, SchemaField field, final CurrencyValue p1, final CurrencyValue p2, final boolean minInclusive, final boolean maxInclusive) {
-    String currencyCode = p1.getCurrencyCode();
+    String currencyCode = (p1 != null) ? p1.getCurrencyCode() :
+                          (p2 != null) ? p2.getCurrencyCode() : defaultCurrency;
     final CurrencyValueSource vs = new CurrencyValueSource(field, currencyCode, parser);
 
     return new SolrConstantScoreQuery(new ValueSourceRangeFilter(vs,
-            p1.getAmount() + "", p2.getAmount() + "", minInclusive, maxInclusive));
+            p1 == null ? null : p1.getAmount() + "" , p2 == null ? null : p2.getAmount() + "", minInclusive, maxInclusive));
   }
 
   @Override
@@ -661,6 +662,9 @@ class CurrencyValue {
    * @return The parsed CurrencyValue.
    */
   public static CurrencyValue parse(String externalVal, String defaultCurrency) {
+    if (externalVal == null) {
+      return null;
+    }
     String amount = externalVal;
     String code = defaultCurrency;
 
@@ -670,6 +674,10 @@ class CurrencyValue {
       code = amountAndCode[1];
     }
 
+    if (amount.equals("*")) {
+      return null;
+    }
+    
     Currency currency = java.util.Currency.getInstance(code);
 
     if (currency == null) {

Modified: lucene/dev/branches/lucene_solr_4_0/solr/core/src/test/org/apache/solr/schema/CurrencyFieldTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_0/solr/core/src/test/org/apache/solr/schema/CurrencyFieldTest.java?rev=1389679&r1=1389678&r2=1389679&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_0/solr/core/src/test/org/apache/solr/schema/CurrencyFieldTest.java (original)
+++ lucene/dev/branches/lucene_solr_4_0/solr/core/src/test/org/apache/solr/schema/CurrencyFieldTest.java Tue Sep 25 01:49:51 2012
@@ -140,7 +140,32 @@ public class CurrencyFieldTest extends S
     assertQ(req("fl", "*,score", "q",
             "amount:[24.99,EUR TO 25.01,EUR]"),
             "//*[@numFound='1']");
-  }
+    
+    // Open ended ranges without currency
+    assertQ(req("fl", "*,score", "q",
+            "amount:[* TO *]"),
+            "//*[@numFound='10']");
+    
+    // Open ended ranges with currency
+    assertQ(req("fl", "*,score", "q",
+            "amount:[*,EUR TO *,EUR]"),
+            "//*[@numFound='10']");
+
+    // Open ended start range without currency
+    assertQ(req("fl", "*,score", "q",
+            "amount:[* TO 5,USD]"),
+            "//*[@numFound='5']");
+
+    // Open ended start range with currency (currency for the * won't matter)
+    assertQ(req("fl", "*,score", "q",
+            "amount:[*,USD TO 5,USD]"),
+            "//*[@numFound='5']");
+
+    // Open ended end range
+    assertQ(req("fl", "*,score", "q",
+            "amount:[3 TO *]"),
+            "//*[@numFound='8']");
+}
 
   @Test
   public void testCurrencyPointQuery() throws Exception {