forked from GoogleCloudPlatform/bigquery-utils
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cw_ts_overlap_buckets.sqlx
55 lines (54 loc) · 1.86 KB
/
cw_ts_overlap_buckets.sqlx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
config { hasOutput: true }
/*
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
Merges two periods together if they overlap and returns unique id for each merged bucket.
Coalesces meeting periods as well (not just overlapping periods) if includeMeets is true.
*/
CREATE OR REPLACE FUNCTION ${self()}(includeMeets BOOLEAN, inputs ARRAY<STRUCT<st TIMESTAMP, et TIMESTAMP>>)
RETURNS array<struct<bucketNo int64, st TIMESTAMP, et TIMESTAMP>>
LANGUAGE js
OPTIONS (
description="Merges two periods together if they overlap and returns unique id for each merged bucket. Coalesces meeting periods as well (not just overlapping periods) if includeMeets is true."
)
AS """
var ret = [ ]
var bucketNo = 1;
var st = null;
var et = null;
for ( var j = 0 ; j < inputs.length ; j ++ ) {
var t = inputs[j];
if (j == 0) {
st = t.st;
et = t.et;
} else if (t.st < et ||
(t.st != null && et != null &&
t.st.getTime() == et.getTime() && includeMeets)) {
if (et < t.et) {
et = t.et;
}
} else {
ret.push({ bucketNo, st, et });
st = t.st;
et = t.et;
bucketNo++;
}
}
if (inputs.length > 0) {
ret.push({ bucketNo, st, et });
}
return ret;
""";