Skip to content

Commit ec8fa10

Browse files
author
Faith Chikwekwe
committedSep 3, 2020
feat(execute): support duration for agg window
1 parent fdaccd9 commit ec8fa10

17 files changed

+154
-119
lines changed
 

‎execute/bounds.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (b Bounds) Shift(d Duration) Bounds {
7878

7979
func (b Bounds) Duration() Duration {
8080
if b.IsEmpty() {
81-
return values.ConvertDuration(0)
81+
return values.ConvertDurationNsecs(0)
8282
}
8383
return b.Stop.Sub(b.Start)
8484
}

‎execute/window_test.go

+73-49
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ import (
1414
func TestNewWindow(t *testing.T) {
1515
t.Run("normal offset", func(t *testing.T) {
1616
want := execute.Window{
17-
Every: values.ConvertDuration(time.Minute),
18-
Period: values.ConvertDuration(time.Minute),
19-
Offset: values.ConvertDuration(time.Second),
17+
Every: values.ConvertDurationNsecs(time.Minute),
18+
Period: values.ConvertDurationNsecs(time.Minute),
19+
Offset: values.ConvertDurationNsecs(time.Second),
2020
}
21-
got := MustWindow(values.ConvertDuration(time.Minute), values.ConvertDuration(time.Minute), values.ConvertDuration(time.Second))
21+
got := MustWindow(values.ConvertDurationNsecs(time.Minute), values.ConvertDurationNsecs(time.Minute), values.ConvertDurationNsecs(time.Second))
2222
if !cmp.Equal(want, got) {
2323
t.Errorf("window different; -want/+got:\n%v\n", cmp.Diff(want, got))
2424
}
@@ -27,14 +27,14 @@ func TestNewWindow(t *testing.T) {
2727
// offset larger than "every" duration will be normalized
2828
t.Run("larger offset", func(t *testing.T) {
2929
want := execute.Window{
30-
Every: values.ConvertDuration(time.Minute),
31-
Period: values.ConvertDuration(time.Minute),
32-
Offset: values.ConvertDuration(30 * time.Second),
30+
Every: values.ConvertDurationNsecs(time.Minute),
31+
Period: values.ConvertDurationNsecs(time.Minute),
32+
Offset: values.ConvertDurationNsecs(30 * time.Second),
3333
}
3434
got := MustWindow(
35-
values.ConvertDuration(time.Minute),
36-
values.ConvertDuration(time.Minute),
37-
values.ConvertDuration(2*time.Minute+30*time.Second))
35+
values.ConvertDurationNsecs(time.Minute),
36+
values.ConvertDurationNsecs(time.Minute),
37+
values.ConvertDurationNsecs(2*time.Minute+30*time.Second))
3838
if !cmp.Equal(want, got) {
3939
t.Errorf("window different; -want/+got:\n%v\n", cmp.Diff(want, got))
4040
}
@@ -43,14 +43,14 @@ func TestNewWindow(t *testing.T) {
4343
// Negative offset will be normalized
4444
t.Run("negative offset", func(t *testing.T) {
4545
want := execute.Window{
46-
Every: values.ConvertDuration(time.Minute),
47-
Period: values.ConvertDuration(time.Minute),
48-
Offset: values.ConvertDuration(30 * time.Second),
46+
Every: values.ConvertDurationNsecs(time.Minute),
47+
Period: values.ConvertDurationNsecs(time.Minute),
48+
Offset: values.ConvertDurationNsecs(30 * time.Second),
4949
}
5050
got := MustWindow(
51-
values.ConvertDuration(time.Minute),
52-
values.ConvertDuration(time.Minute),
53-
values.ConvertDuration(-2*time.Minute+30*time.Second))
51+
values.ConvertDurationNsecs(time.Minute),
52+
values.ConvertDurationNsecs(time.Minute),
53+
values.ConvertDurationNsecs(-2*time.Minute+30*time.Second))
5454
if !cmp.Equal(want, got) {
5555
t.Errorf("window different; -want/+got:\n%v\n", cmp.Diff(want, got))
5656
}
@@ -93,9 +93,9 @@ func TestWindow_GetEarliestBounds(t *testing.T) {
9393
{
9494
name: "simple",
9595
w: MustWindow(
96-
values.ConvertDuration(5*time.Minute),
97-
values.ConvertDuration(5*time.Minute),
98-
values.ConvertDuration(0)),
96+
values.ConvertDurationNsecs(5*time.Minute),
97+
values.ConvertDurationNsecs(5*time.Minute),
98+
values.ConvertDurationNsecs(0)),
9999
t: execute.Time(6 * time.Minute),
100100
want: execute.Bounds{
101101
Start: execute.Time(5 * time.Minute),
@@ -105,21 +105,45 @@ func TestWindow_GetEarliestBounds(t *testing.T) {
105105
{
106106
name: "simple with offset",
107107
w: MustWindow(
108-
values.ConvertDuration(5*time.Minute),
109-
values.ConvertDuration(5*time.Minute),
110-
values.ConvertDuration(30*time.Second)),
108+
values.ConvertDurationNsecs(5*time.Minute),
109+
values.ConvertDurationNsecs(5*time.Minute),
110+
values.ConvertDurationNsecs(30*time.Second)),
111111
t: execute.Time(5 * time.Minute),
112112
want: execute.Bounds{
113113
Start: execute.Time(30 * time.Second),
114114
Stop: execute.Time(5*time.Minute + 30*time.Second),
115115
},
116116
},
117+
{
118+
name: "simple months",
119+
w: MustWindow(
120+
values.ConvertDurationMonths(5),
121+
values.ConvertDurationMonths(5),
122+
values.ConvertDurationMonths(0)),
123+
t: values.ConvertTime(time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)),
124+
want: execute.Bounds{
125+
Start: values.ConvertTime(time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)),
126+
Stop: values.ConvertTime(time.Date(1970, time.June, 1, 0, 0, 0, 0, time.UTC)),
127+
},
128+
},
129+
{
130+
name: "simple months with offset",
131+
w: MustWindow(
132+
values.ConvertDurationMonths(5),
133+
values.ConvertDurationMonths(5),
134+
values.ConvertDurationMonths(5)),
135+
t: values.ConvertTime(time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)),
136+
want: execute.Bounds{
137+
Start: values.ConvertTime(time.Date(1970, time.January, 2, 4, 30, 0, 0, time.UTC)),
138+
Stop: values.ConvertTime(time.Date(1970, time.June, 2, 4, 30, 0, 0, time.UTC)),
139+
},
140+
},
117141
{
118142
name: "underlapping",
119143
w: MustWindow(
120-
values.ConvertDuration(2*time.Minute),
121-
values.ConvertDuration(1*time.Minute),
122-
values.ConvertDuration(30*time.Second)),
144+
values.ConvertDurationNsecs(2*time.Minute),
145+
values.ConvertDurationNsecs(1*time.Minute),
146+
values.ConvertDurationNsecs(30*time.Second)),
123147
t: execute.Time(3 * time.Minute),
124148
want: execute.Bounds{
125149
Start: execute.Time(3*time.Minute + 30*time.Second),
@@ -129,9 +153,9 @@ func TestWindow_GetEarliestBounds(t *testing.T) {
129153
{
130154
name: "underlapping not contained",
131155
w: MustWindow(
132-
values.ConvertDuration(2*time.Minute),
133-
values.ConvertDuration(1*time.Minute),
134-
values.ConvertDuration(30*time.Second)),
156+
values.ConvertDurationNsecs(2*time.Minute),
157+
values.ConvertDurationNsecs(1*time.Minute),
158+
values.ConvertDurationNsecs(30*time.Second)),
135159
t: execute.Time(2*time.Minute + 45*time.Second),
136160
want: execute.Bounds{
137161
Start: execute.Time(3*time.Minute + 30*time.Second),
@@ -141,9 +165,9 @@ func TestWindow_GetEarliestBounds(t *testing.T) {
141165
{
142166
name: "overlapping",
143167
w: MustWindow(
144-
values.ConvertDuration(1*time.Minute),
145-
values.ConvertDuration(2*time.Minute),
146-
values.ConvertDuration(30*time.Second)),
168+
values.ConvertDurationNsecs(1*time.Minute),
169+
values.ConvertDurationNsecs(2*time.Minute),
170+
values.ConvertDurationNsecs(30*time.Second)),
147171
t: execute.Time(30 * time.Second),
148172
want: execute.Bounds{
149173
Start: execute.Time(-30 * time.Second),
@@ -153,9 +177,9 @@ func TestWindow_GetEarliestBounds(t *testing.T) {
153177
{
154178
name: "partially overlapping",
155179
w: MustWindow(
156-
values.ConvertDuration(1*time.Minute),
157-
values.ConvertDuration(3*time.Minute+30*time.Second),
158-
values.ConvertDuration(30*time.Second)),
180+
values.ConvertDurationNsecs(1*time.Minute),
181+
values.ConvertDurationNsecs(3*time.Minute+30*time.Second),
182+
values.ConvertDurationNsecs(30*time.Second)),
159183
t: execute.Time(5*time.Minute + 45*time.Second),
160184
want: execute.Bounds{
161185
Start: execute.Time(3 * time.Minute),
@@ -165,9 +189,9 @@ func TestWindow_GetEarliestBounds(t *testing.T) {
165189
{
166190
name: "partially overlapping (t on boundary)",
167191
w: MustWindow(
168-
values.ConvertDuration(1*time.Minute),
169-
values.ConvertDuration(3*time.Minute+30*time.Second),
170-
values.ConvertDuration(30*time.Second)),
192+
values.ConvertDurationNsecs(1*time.Minute),
193+
values.ConvertDurationNsecs(3*time.Minute+30*time.Second),
194+
values.ConvertDurationNsecs(30*time.Second)),
171195
t: execute.Time(5 * time.Minute),
172196
want: execute.Bounds{
173197
Start: execute.Time(2 * time.Minute),
@@ -198,8 +222,8 @@ func TestWindow_GetOverlappingBounds(t *testing.T) {
198222
{
199223
name: "simple",
200224
w: execute.Window{
201-
Every: values.ConvertDuration(time.Minute),
202-
Period: values.ConvertDuration(time.Minute),
225+
Every: values.ConvertDurationNsecs(time.Minute),
226+
Period: values.ConvertDurationNsecs(time.Minute),
203227
},
204228
b: execute.Bounds{
205229
Start: execute.Time(5 * time.Minute),
@@ -214,9 +238,9 @@ func TestWindow_GetOverlappingBounds(t *testing.T) {
214238
{
215239
name: "simple with offset",
216240
w: execute.Window{
217-
Every: values.ConvertDuration(time.Minute),
218-
Period: values.ConvertDuration(time.Minute),
219-
Offset: values.ConvertDuration(15 * time.Second),
241+
Every: values.ConvertDurationNsecs(time.Minute),
242+
Period: values.ConvertDurationNsecs(time.Minute),
243+
Offset: values.ConvertDurationNsecs(15 * time.Second),
220244
},
221245
b: execute.Bounds{
222246
Start: execute.Time(5 * time.Minute),
@@ -240,8 +264,8 @@ func TestWindow_GetOverlappingBounds(t *testing.T) {
240264
{
241265
name: "underlapping, bounds in gap",
242266
w: execute.Window{
243-
Every: values.ConvertDuration(2 * time.Minute),
244-
Period: values.ConvertDuration(time.Minute),
267+
Every: values.ConvertDurationNsecs(2 * time.Minute),
268+
Period: values.ConvertDurationNsecs(time.Minute),
245269
},
246270
b: execute.Bounds{
247271
Start: execute.Time(30 * time.Second),
@@ -252,9 +276,9 @@ func TestWindow_GetOverlappingBounds(t *testing.T) {
252276
{
253277
name: "underlapping",
254278
w: execute.Window{
255-
Every: values.ConvertDuration(2 * time.Minute),
256-
Period: values.ConvertDuration(time.Minute),
257-
Offset: values.ConvertDuration(30 * time.Second),
279+
Every: values.ConvertDurationNsecs(2 * time.Minute),
280+
Period: values.ConvertDurationNsecs(time.Minute),
281+
Offset: values.ConvertDurationNsecs(30 * time.Second),
258282
},
259283
b: execute.Bounds{
260284
Start: execute.Time(time.Minute + 45*time.Second),
@@ -274,8 +298,8 @@ func TestWindow_GetOverlappingBounds(t *testing.T) {
274298
{
275299
name: "overlapping",
276300
w: execute.Window{
277-
Every: values.ConvertDuration(1 * time.Minute),
278-
Period: values.ConvertDuration(2*time.Minute + 15*time.Second),
301+
Every: values.ConvertDurationNsecs(1 * time.Minute),
302+
Period: values.ConvertDurationNsecs(2*time.Minute + 15*time.Second),
279303
},
280304
b: execute.Bounds{
281305
Start: execute.Time(10 * time.Minute),

‎internal/gen/input.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func Input(ctx context.Context, schema Schema) (flux.TableIterator, error) {
147147

148148
g := &dataGenerator{
149149
Context: ctx,
150-
Period: values.ConvertDuration(period),
150+
Period: values.ConvertDurationNsecs(period),
151151
NumPoints: numPoints,
152152
Nulls: schema.Nulls,
153153
Allocator: alloc,

‎plan/bounds_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ func TestBounds_ComputePlanBounds(t *testing.T) {
390390
spec: &plantest.PlanSpec{
391391
Nodes: []plan.Node{
392392
plantest.CreatePhysicalMockNode("0"),
393-
makeShiftNode("1", values.ConvertDuration(5)),
393+
makeShiftNode("1", values.ConvertDurationNsecs(5)),
394394
plantest.CreatePhysicalMockNode("2"),
395395
},
396396
Edges: [][2]int{
@@ -412,7 +412,7 @@ func TestBounds_ComputePlanBounds(t *testing.T) {
412412
plantest.CreatePhysicalMockNode("0"),
413413
makeBoundsNode("1", bounds(5, 10)),
414414
plantest.CreatePhysicalMockNode("2"),
415-
makeShiftNode("3", values.ConvertDuration(5)),
415+
makeShiftNode("3", values.ConvertDurationNsecs(5)),
416416
plantest.CreatePhysicalMockNode("4"),
417417
},
418418
Edges: [][2]int{

‎stdlib/experimental/http/http_experimental.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ var get = values.NewFunction(
4343
}
4444

4545
// http.NewDefaultClient() does default to 30
46-
var theTimeout = values.ConvertDuration(30 * time.Second)
46+
var theTimeout = values.ConvertDurationNsecs(30 * time.Second)
4747
tv, ok := args.Get("timeout")
4848
if !ok {
4949
// default timeout

‎stdlib/sql/to_privates_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -297,11 +297,11 @@ func TestMssqlTranslation(t *testing.T) {
297297

298298
func TestBigQueryTranslation(t *testing.T) {
299299
bigqueryTypeTranslations := map[string]flux.ColType{
300-
"FLOAT64": flux.TFloat,
301-
"INT64": flux.TInt,
302-
"STRING": flux.TString,
303-
"TIMESTAMP": flux.TTime,
304-
"BOOL": flux.TBool,
300+
"FLOAT64": flux.TFloat,
301+
"INT64": flux.TInt,
302+
"STRING": flux.TString,
303+
"TIMESTAMP": flux.TTime,
304+
"BOOL": flux.TBool,
305305
}
306306

307307
columnLabel := "apples"

‎stdlib/universe/sleep_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func TestSleep(t *testing.T) {
1717
args := values.NewObjectWithValues(
1818
map[string]values.Value{
1919
"v": myval,
20-
"duration": values.NewDuration(values.ConvertDuration(time.Microsecond)),
20+
"duration": values.NewDuration(values.ConvertDurationNsecs(time.Microsecond)),
2121
},
2222
)
2323
v, err := sleepFunc.Call(ctx, args)
@@ -38,7 +38,7 @@ func TestSleep(t *testing.T) {
3838
args := values.NewObjectWithValues(
3939
map[string]values.Value{
4040
"v": myval,
41-
"duration": values.NewDuration(values.ConvertDuration(200 * time.Millisecond)),
41+
"duration": values.NewDuration(values.ConvertDurationNsecs(200 * time.Millisecond)),
4242
},
4343
)
4444
_, err := sleepFunc.Call(ctx, args)

‎stdlib/universe/typeconv.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -659,9 +659,9 @@ func (c *durationConv) Call(ctx context.Context, args values.Object) (values.Val
659659
}
660660
d = n
661661
case semantic.Int:
662-
d = values.ConvertDuration(time.Duration(v.Int()))
662+
d = values.ConvertDurationNsecs(time.Duration(v.Int()))
663663
case semantic.UInt:
664-
d = values.ConvertDuration(time.Duration(v.UInt()))
664+
d = values.ConvertDurationNsecs(time.Duration(v.UInt()))
665665
case semantic.Duration:
666666
d = v.Duration()
667667
default:

‎stdlib/universe/typeconv_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func TestTypeconv_String(t *testing.T) {
5050
},
5151
{
5252
name: "string(v:7)",
53-
v: values.ConvertDuration(184000000000),
53+
v: values.ConvertDurationNsecs(184000000000),
5454
want: "3m4s",
5555
},
5656
{
@@ -144,7 +144,7 @@ func TestTypeconv_Int(t *testing.T) {
144144
},
145145
{
146146
name: "int64(v:6)",
147-
v: values.ConvertDuration(123456789),
147+
v: values.ConvertDurationNsecs(123456789),
148148
want: int64(123456789),
149149
},
150150
{
@@ -229,7 +229,7 @@ func TestTypeconv_UInt(t *testing.T) {
229229
},
230230
{
231231
name: "uint64(v:6)",
232-
v: values.ConvertDuration(123456789),
232+
v: values.ConvertDurationNsecs(123456789),
233233
want: uint64(123456789),
234234
},
235235
{
@@ -545,27 +545,27 @@ func TestTypeconv_Duration(t *testing.T) {
545545
{
546546
name: "duration(v:1)",
547547
v: int64(123456789),
548-
want: values.ConvertDuration(123456789),
548+
want: values.ConvertDurationNsecs(123456789),
549549
},
550550
{
551551
name: "duration(v:2)",
552552
v: uint64(123456789),
553-
want: values.ConvertDuration(123456789),
553+
want: values.ConvertDurationNsecs(123456789),
554554
},
555555
{
556556
name: "duration(v:3)",
557557
v: "4s2ns",
558-
want: values.ConvertDuration(4000000002),
558+
want: values.ConvertDurationNsecs(4000000002),
559559
},
560560
{
561561
name: "duration(v:4s2ns)",
562-
v: values.ConvertDuration(4000000002),
563-
want: values.ConvertDuration(4000000002),
562+
v: values.ConvertDurationNsecs(4000000002),
563+
want: values.ConvertDurationNsecs(4000000002),
564564
},
565565
{
566566
name: "duration(error)",
567567
v: "not_a_duration",
568-
want: values.ConvertDuration(0),
568+
want: values.ConvertDurationNsecs(0),
569569
expectErr: errors.New("invalid duration not_a_duration"),
570570
},
571571
{

‎stdlib/universe/window.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type WindowOpSpec struct {
2525
CreateEmpty bool `json:"createEmpty"`
2626
}
2727

28-
var infinityVar = values.NewDuration(values.ConvertDuration(math.MaxInt64))
28+
var infinityVar = values.NewDuration(values.ConvertDurationNsecs(math.MaxInt64))
2929

3030
func init() {
3131
windowSignature := runtime.MustLookupBuiltinType("universe", "window")

0 commit comments

Comments
 (0)