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