@@ -19,8 +19,8 @@ type mode struct {
19
19
20
20
func (m mode ) Value (ctx sqlite3.Context ) {
21
21
var (
22
- max = 0
23
22
typ = sqlite3 .NULL
23
+ max uint
24
24
i64 int64
25
25
f64 float64
26
26
str string
@@ -32,7 +32,6 @@ func (m mode) Value(ctx sqlite3.Context) {
32
32
i64 = k
33
33
}
34
34
}
35
- f64 = float64 (i64 )
36
35
for k , v := range m .reals {
37
36
if v > max || v == max && k < f64 {
38
37
typ = sqlite3 .FLOAT
@@ -66,33 +65,45 @@ func (m mode) Value(ctx sqlite3.Context) {
66
65
}
67
66
}
68
67
69
- func (b * mode ) Step (ctx sqlite3.Context , arg ... sqlite3.Value ) {
68
+ func (m * mode ) Step (ctx sqlite3.Context , arg ... sqlite3.Value ) {
70
69
switch arg [0 ].Type () {
71
70
case sqlite3 .INTEGER :
72
- b .ints .add (arg [0 ].Int64 ())
71
+ if m .reals == nil {
72
+ m .ints .add (arg [0 ].Int64 ())
73
+ break
74
+ }
75
+ fallthrough
73
76
case sqlite3 .FLOAT :
74
- b .reals .add (arg [0 ].Float ())
77
+ m .reals .add (arg [0 ].Float ())
78
+ for k , v := range m .ints {
79
+ m .reals [float64 (k )] += v
80
+ }
81
+ m .ints = nil
75
82
case sqlite3 .TEXT :
76
- b .texts .add (arg [0 ].Text ())
83
+ m .texts .add (arg [0 ].Text ())
77
84
case sqlite3 .BLOB :
78
- b .blobs .add (string (arg [0 ].RawBlob ()))
85
+ m .blobs .add (string (arg [0 ].RawBlob ()))
79
86
}
80
87
}
81
88
82
- func (b * mode ) Inverse (ctx sqlite3.Context , arg ... sqlite3.Value ) {
89
+ func (m * mode ) Inverse (ctx sqlite3.Context , arg ... sqlite3.Value ) {
83
90
switch arg [0 ].Type () {
84
91
case sqlite3 .INTEGER :
85
- b .ints .del (arg [0 ].Int64 ())
92
+ if m .reals == nil {
93
+ m .ints .del (arg [0 ].Int64 ())
94
+ break
95
+ }
96
+ fallthrough
86
97
case sqlite3 .FLOAT :
87
- b .reals .del (arg [0 ].Float ())
98
+ m .reals .del (arg [0 ].Float ())
88
99
case sqlite3 .TEXT :
89
- b .texts .del (arg [0 ].Text ())
100
+ m .texts .del (arg [0 ].Text ())
90
101
case sqlite3 .BLOB :
91
- b .blobs .del (string (arg [0 ].RawBlob ()))
102
+ m .blobs .del (string (arg [0 ].RawBlob ()))
92
103
}
93
104
}
94
105
95
- type counter [T comparable ] map [T ]int
106
+ type counter [T comparable ] map [T ]uint
96
107
97
108
func (c * counter [T ]) add (k T ) {
98
109
if (* c ) == nil {
@@ -102,11 +113,9 @@ func (c *counter[T]) add(k T) {
102
113
}
103
114
104
115
func (c counter [T ]) del (k T ) {
105
- switch n := c [k ]; n {
106
- default :
107
- c [k ] = n - 1
108
- case 1 :
116
+ if n := c [k ]; n == 1 {
109
117
delete (c , k )
110
- case 0 :
118
+ } else {
119
+ c [k ] = n - 1
111
120
}
112
121
}
0 commit comments