Hi,

I'm using Solr version 4.1.
I found a bug in group.ngroups. So could anyone kindly take a look at my bug 
report?

If I specify the type Double as group.field, the value of group.ngroups is set 
to be an incorrect value.

[condition]
- Double is defined in group.field
- Documents without the field which is defined as group.field,

[Sample query and Example]
-------------------------------
solr/select?q=*:*&group=true&group.ngroups=true&group.field=Double_Field

* "Double_Field" is defined "solr.TrieDoubleField" type.
-------------------------------
When documents with group.field are 4 and documents without group.field are 6,
then it turns out 10 of group.ngroups as result of the query.

But I think that group.ngroups should be 5 rightly in this case.

[Root Cause]
It seems there is a bug in the source code of Lucene.
There is a function that compares a list of whether these groups contain the 
same group.field,
It calls MutableValueDouble.compareSameType().

See below the point which seems to be a root cause.
-----------------------------
    if (!exists) return -1;
    if (!b.exists) return 1;
-----------------------------
If "exists" is false, it return -1.

But I think it should return 0, when "exists" and "b.exists" are equal.

[Similar problem]
There is a similar problem to MutableValueBool.compareSameType().
Therefore, when you grouping the field of type Boolean (solr.BoolField), 
value of group.ngroups is always 0 or 1 .

[Solution]
I propose the following modifications: MutableValueDouble.compareSameType()

===================================================================
--- MutableValueDouble.java     
+++ MutableValueDouble.java     
@@ -54,9 +54,8 @@
     MutableValueDouble b = (MutableValueDouble)other;
     int c = Double.compare(value, b.value);
     if (c != 0) return c;
-    if (!exists) return -1;
-    if (!b.exists) return 1;
-    return 0;
+    if (exists == b.exists) return 0;
+    return exists ? 1 : -1;
   }
===================================================================

I propose the following modifications: MutableValueBool.compareSameType()

===================================================================
--- MutableValueBool.java       
+++ MutableValueBool.java       
@@ -52,7 +52,7 @@
   @Override
   public int compareSameType(Object other) {
     MutableValueBool b = (MutableValueBool)other;
-    if (value != b.value) return value ? 1 : 0;
+    if (value != b.value) return value ? 1 : -1;
     if (exists == b.exists) return 0;
     return exists ? 1 : -1;
   }
===================================================================


Thanks,

Ebisawa

Reply via email to