1
1
package orc
2
2
3
3
import (
4
+ "time"
5
+
4
6
"github.com/scritchley/orc/proto"
5
7
)
6
8
@@ -14,6 +16,8 @@ func NewColumnStatistics(category Category) ColumnStatistics {
14
16
return NewStringStatistics ()
15
17
case CategoryBoolean :
16
18
return NewBucketStatistics ()
19
+ case CategoryTimestamp :
20
+ return NewTimestampStatistics ()
17
21
default :
18
22
return NewBaseStatistics ()
19
23
}
@@ -235,3 +239,71 @@ func NewBucketStatistics() *BucketStatistics {
235
239
// }
236
240
// b.BaseStatistics.Add(value)
237
241
// }
242
+
243
+ type TimestampStatistics struct {
244
+ BaseStatistics
245
+ minSet bool
246
+ }
247
+
248
+ func NewTimestampStatistics () * TimestampStatistics {
249
+ base := NewBaseStatistics ()
250
+ var max , min , maxUTC , minUTC int64
251
+
252
+ base .TimestampStatistics = & proto.TimestampStatistics {
253
+ Maximum : & max ,
254
+ Minimum : & min ,
255
+ MaximumUtc : & maxUTC ,
256
+ MinimumUtc : & minUTC ,
257
+ }
258
+ return & TimestampStatistics {
259
+ BaseStatistics : base ,
260
+ }
261
+ }
262
+
263
+ func (i * TimestampStatistics ) Merge (other ColumnStatistics ) {
264
+ if is , ok := other .(* TimestampStatistics ); ok {
265
+ if is .TimestampStatistics .GetMaximum () > i .TimestampStatistics .GetMaximum () {
266
+ i .TimestampStatistics .Maximum = is .TimestampStatistics .Maximum
267
+ i .TimestampStatistics .MaximumUtc = is .TimestampStatistics .MaximumUtc
268
+ }
269
+ if is .TimestampStatistics .GetMinimum () < i .TimestampStatistics .GetMinimum () {
270
+ i .TimestampStatistics .Minimum = is .TimestampStatistics .Minimum
271
+ i .TimestampStatistics .MinimumUtc = is .TimestampStatistics .MinimumUtc
272
+ }
273
+ i .BaseStatistics .Merge (is .BaseStatistics )
274
+ }
275
+ }
276
+
277
+ func (i * TimestampStatistics ) Add (value interface {}) {
278
+ if val , ok := value .(time.Time ); ok {
279
+ if i .TimestampStatistics .Maximum == nil {
280
+ valCopy := val .Unix ()
281
+ valUTCCopy := val .UTC ().Unix ()
282
+ i .TimestampStatistics .Maximum = & valCopy
283
+ i .TimestampStatistics .MaximumUtc = & valUTCCopy
284
+ } else if val .After (time .Unix (i .TimestampStatistics .GetMaximum (), 0 )) {
285
+ * i .TimestampStatistics .Maximum = val .Unix ()
286
+ * i .TimestampStatistics .MaximumUtc = val .UTC ().Unix ()
287
+ }
288
+ if ! i .minSet {
289
+ valCopy := val .Unix ()
290
+ valUTCCopy := val .UTC ().Unix ()
291
+ i .TimestampStatistics .Minimum = & valCopy
292
+ i .TimestampStatistics .MinimumUtc = & valUTCCopy
293
+ i .minSet = true
294
+ } else if val .Before (time .Unix (i .TimestampStatistics .GetMinimum (), 0 )) {
295
+ * i .TimestampStatistics .Minimum = val .Unix ()
296
+ * i .TimestampStatistics .MinimumUtc = val .UTC ().Unix ()
297
+
298
+ }
299
+ }
300
+ i .BaseStatistics .Add (value )
301
+ }
302
+
303
+ func (i * TimestampStatistics ) Statistics () * proto.ColumnStatistics {
304
+ return i .ColumnStatistics
305
+ }
306
+
307
+ func (i * TimestampStatistics ) Reset () {
308
+ * i = * NewTimestampStatistics ()
309
+ }
0 commit comments