Skip to content

Commit

Permalink
Merge pull request #995 from go-kivik/reducelevel0
Browse files Browse the repository at this point in the history
Support group_level=0 in reduce pkg
  • Loading branch information
flimzy committed Jun 16, 2024
2 parents ea3d422 + a7b88a3 commit 709d2a4
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 13 deletions.
26 changes: 13 additions & 13 deletions x/sqlite/reduce/reduce.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,21 +181,21 @@ func reduce(rows Reducer, fn Func, groupLevel int, cb Callback) (*Rows, error) {
return nil, err
}

if groupLevel != 0 {
switch {
case targetKey != nil && (!reflect.DeepEqual(targetKey, truncateKey(row.Key, groupLevel)) || rereduce != (row.ID == "")):
if err := callReduce(keys, values, rereduce, targetKey); err != nil {
return nil, err
}

keys = keys[:0]
values = values[:0]
fallthrough
case targetKey == nil:
targetKey = truncateKey(row.Key, groupLevel)
rereduce = row.ID == ""
switch {
case (groupLevel == 0 && rereduce != (row.ID == "")) ||
(targetKey != nil && (!reflect.DeepEqual(targetKey, truncateKey(row.Key, groupLevel)) || rereduce != (row.ID == ""))):
if err := callReduce(keys, values, rereduce, targetKey); err != nil {
return nil, err
}

keys = keys[:0]
values = values[:0]
fallthrough
case targetKey == nil:
targetKey = truncateKey(row.Key, groupLevel)
rereduce = row.ID == ""
}

if first == 0 {
first = row.First
}
Expand Down
35 changes: 35 additions & 0 deletions x/sqlite/reduce/reduce_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,41 @@ func TestReduce(t *testing.T) {
{{Key: []any{1.0, 2.0, 3.0}, Value: 5.0, First: 1, Last: 5}}, // Merge of the first two reduce outputs, final
},
})
tests.Add("group level 0", test{
input: &Rows{
{ID: "a", Key: []any{1.0, 2.0, 3.0}, Value: nil, First: 1, Last: 1},
{ID: "b", Key: []any{1.0, 2.0, 3.0}, Value: nil, First: 2, Last: 2},
{ID: "c", Key: []any{1.0, 2.0, 4.0}, Value: nil, First: 3, Last: 3},
{ID: "d", Key: []any{1.0, 2.0, 5.0}, Value: nil, First: 4, Last: 4},
},
groupLevel: 0,
javascript: "_count",
want: []Row{
{Key: nil, Value: 4.0, First: 1, Last: 4},
},
})
tests.Add("group level 0, cached", test{
input: &Rows{
{Key: nil, Value: 4.0, First: 1, Last: 4},
},
groupLevel: 0,
javascript: "_count",
want: []Row{
{Key: nil, Value: 4.0, First: 1, Last: 4},
},
})
tests.Add("group level 0, partially cached", test{
input: &Rows{
{Key: nil, Value: 4.0, First: 1, Last: 4},
{ID: "e", Key: []any{1.0, 2.0, 4.0}, Value: nil, First: 5, Last: 5},
{ID: "f", Key: []any{1.0, 2.0, 5.0}, Value: nil, First: 6, Last: 6},
},
groupLevel: 0,
javascript: "_count",
want: []Row{
{Key: nil, Value: 6.0, First: 1, Last: 6},
},
})

tests.Run(t, func(t *testing.T, tt test) {
var cache [][]Row
Expand Down

0 comments on commit 709d2a4

Please sign in to comment.