You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ds...@apache.org on 2023/08/09 04:36:32 UTC

[solr] branch main updated: SOLR-16360: Atomic update on boolean fields doesn't reflect when value starts with "1", "t" or "T" (#1816)

This is an automated email from the ASF dual-hosted git repository.

dsmiley pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 9b88eb8f564 SOLR-16360: Atomic update on boolean fields doesn't reflect when value starts with "1", "t" or "T" (#1816)
9b88eb8f564 is described below

commit 9b88eb8f5646d4c8745166ffb7f41cd35269fff3
Author: Rahul Goswami <ra...@gmail.com>
AuthorDate: Wed Aug 9 00:36:25 2023 -0400

    SOLR-16360: Atomic update on boolean fields doesn't reflect when value starts with "1", "t" or "T" (#1816)
    
    * StrUtils.parseBoolean() can accept a CharSequence
    
    ---------
    
    Co-authored-by: Rahul Goswami <rg...@commvault.com>
---
 solr/CHANGES.txt                                           |  2 ++
 solr/core/src/java/org/apache/solr/schema/BoolField.java   |  6 +++---
 .../src/test/org/apache/solr/schema/BooleanFieldTest.java  | 14 +++++++++++++-
 .../src/java/org/apache/solr/common/util/StrUtils.java     |  2 +-
 4 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index bbc85e009f4..d5d12bf7cf8 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -110,6 +110,8 @@ Bug Fixes
 
 * SOLR-16922: Scripts wrongly prohibit embedded zookeeper when solr port is between 55535 and 64535 (Tiziano Degaetano, Colvin Cowie)
 
+* SOLR-16360: Atomic update on boolean fields doesn't reflect when value starts with "1", "t" or "T" (Rahul Goswami, Justin Sweeney, David Smiley)
+
 Dependency Upgrades
 ---------------------
 (No changes)
diff --git a/solr/core/src/java/org/apache/solr/schema/BoolField.java b/solr/core/src/java/org/apache/solr/schema/BoolField.java
index 5a9146ce08b..65c86f919d6 100644
--- a/solr/core/src/java/org/apache/solr/schema/BoolField.java
+++ b/solr/core/src/java/org/apache/solr/schema/BoolField.java
@@ -40,6 +40,7 @@ import org.apache.lucene.util.CharsRefBuilder;
 import org.apache.lucene.util.mutable.MutableValue;
 import org.apache.lucene.util.mutable.MutableValueBool;
 import org.apache.solr.analysis.SolrAnalyzer;
+import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.response.TextResponseWriter;
 import org.apache.solr.search.QParser;
 import org.apache.solr.search.function.OrdFieldSource;
@@ -123,8 +124,7 @@ public class BoolField extends PrimitiveFieldType {
 
   @Override
   public String toInternal(String val) {
-    char ch = (val != null && val.length() > 0) ? val.charAt(0) : 0;
-    return (ch == '1' || ch == 't' || ch == 'T') ? "T" : "F";
+    return StrUtils.parseBoolean(val) ? "T" : "F";
   }
 
   @Override
@@ -211,7 +211,7 @@ public class BoolField extends PrimitiveFieldType {
   @Override
   public Object toNativeType(Object val) {
     if (val instanceof CharSequence) {
-      return Boolean.valueOf(val.toString());
+      return Boolean.valueOf(StrUtils.parseBoolean((CharSequence) val));
     }
     return super.toNativeType(val);
   }
diff --git a/solr/core/src/test/org/apache/solr/schema/BooleanFieldTest.java b/solr/core/src/test/org/apache/solr/schema/BooleanFieldTest.java
index fd183b29473..a2cbb5759bc 100644
--- a/solr/core/src/test/org/apache/solr/schema/BooleanFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/BooleanFieldTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.solr.schema;
 
+import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -24,7 +25,7 @@ import org.junit.Test;
 public class BooleanFieldTest extends SolrTestCaseJ4 {
   @BeforeClass
   public static void beforeClass() throws Exception {
-    initCore("solrconfig-basic.xml", "schema15.xml");
+    initCore("solrconfig-tlog.xml", "schema15.xml");
   }
 
   // Note, docValues-based boolean tests are tested elsewhere referring to more appropriate schemas
@@ -108,5 +109,16 @@ public class BooleanFieldTest extends SolrTestCaseJ4 {
         "//lst[@name='bindsto']/int[@name='true'][.='2']",
         "//lst[@name='bindstom']/int[@name='false'][.='2']",
         "//lst[@name='bindstom']/int[@name='true'][.='3']");
+
+    // SOLR-16360
+    assertU(adoc("id", "7", "bindsto", "false"));
+    assertU(commit());
+    // do atomic update
+    assertU(adoc(sdoc("id", "7", "bindsto", Map.of("set", "1"))));
+    assertQ(
+        req("qt", "/get", "id", "7"),
+        "count(//doc)=1",
+        "//doc/str[@name='id'][.='7']",
+        "//doc/bool[@name='bindsto'][.='true']");
   }
 }
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/StrUtils.java b/solr/solrj/src/java/org/apache/solr/common/util/StrUtils.java
index 0a6ed1464ca..9e813258cd3 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/StrUtils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/StrUtils.java
@@ -256,7 +256,7 @@ public class StrUtils {
   }
 
   /** Return if a string starts with '1', 't', or 'T' and return false otherwise. */
-  public static boolean parseBoolean(String s) {
+  public static boolean parseBoolean(CharSequence s) {
     char ch = s.length() > 0 ? s.charAt(0) : 0;
     return (ch == '1' || ch == 't' || ch == 'T');
   }