1+ {% macro metric_get_intervals_between(start_date, end_date, datepart) - %}
2+ {{ return(adapter .dispatch (' metric_get_intervals_between' , ' metrics' )(start_date, end_date, datepart)) }}
3+ {%- endmacro %}
4+
5+ {% macro default__metric_get_intervals_between(start_date, end_date, datepart) - %}
6+ {%- call statement(' metric_get_intervals_between' , fetch_result= True) %}
7+
8+ select {{ datediff(start_date, end_date, datepart) }}
9+
10+ {%- endcall - %}
11+
12+ {%- set value_list = load_result(' metric_get_intervals_between' ) - %}
13+
14+ {%- if value_list and value_list[' data' ] - %}
15+ {%- set values = value_list[' data' ] | map(attribute= 0 ) | list %}
16+ {{ return(values [0 ]) }}
17+ {%- else - %}
18+ {{ return(1 ) }}
19+ {%- endif - %}
20+
21+ {%- endmacro %}
22+
23+
24+ {% macro metric_date_spine(datepart, start_date, end_date) %}
25+ {{ return(adapter .dispatch (' metric_date_spine' , ' metrics' )(datepart, start_date, end_date)) }}
26+ {%- endmacro %}
27+
28+ {% macro default__metric_date_spine(datepart, start_date, end_date) %}
29+
30+
31+ {# call as follows:
32+
33+ metric_date_spine(
34+ " day" ,
35+ " to_date('01/01/2016', 'mm/dd/yyyy')" ,
36+ " dateadd(week, 1, current_date)"
37+ ) # }
38+
39+
40+ with rawdata as (
41+
42+ {{metrics .metric_generate_series (
43+ metrics .metric_get_intervals_between (start_date, end_date, datepart)
44+ )}}
45+
46+ ),
47+
48+ all_periods as (
49+
50+ select (
51+ {{
52+ dateadd(
53+ datepart,
54+ " row_number() over (order by 1) - 1" ,
55+ start_date
56+ )
57+ }}
58+ ) as date_{{datepart}}
59+ from rawdata
60+
61+ ),
62+
63+ filtered as (
64+
65+ select *
66+ from all_periods
67+ where date_{{datepart}} <= {{ end_date }}
68+
69+ )
70+
71+ select * from filtered
72+
73+ {% endmacro %}
74+
75+
76+ {% macro metric_get_powers_of_two(upper_bound) %}
77+ {{ return(adapter .dispatch (' metric_get_powers_of_two' , ' metrics' )(upper_bound)) }}
78+ {% endmacro %}
79+
80+ {% macro default__metric_get_powers_of_two(upper_bound) %}
81+
82+ {% if upper_bound <= 0 %}
83+ {{ exceptions .raise_compiler_error (" upper bound must be positive" ) }}
84+ {% endif %}
85+
86+ {% for _ in range(1 , 100 ) %}
87+ {% if upper_bound <= 2 ** loop .index %}{{ return(loop .index ) }}{% endif %}
88+ {% endfor %}
89+
90+ {% endmacro %}
91+
92+
93+ {% macro metric_generate_series(upper_bound) %}
94+ {{ return(adapter .dispatch (' metric_generate_series' , ' metrics' )(upper_bound)) }}
95+ {% endmacro %}
96+
97+ {% macro default__metric_generate_series(upper_bound) %}
98+
99+ {% set n = metrics .metric_get_powers_of_two (upper_bound) %}
100+
101+ with p as (
102+ select 0 as generated_number union all select 1
103+ ), unioned as (
104+
105+ select
106+
107+ {% for i in range(n) %}
108+ p{{i}}.generated_number * power(2 , {{i}})
109+ {% if not loop .last %} + {% endif %}
110+ {% endfor %}
111+ + 1
112+ as generated_number
113+
114+ from
115+
116+ {% for i in range(n) %}
117+ p as p{{i}}
118+ {% if not loop .last %} cross join {% endif %}
119+ {% endfor %}
120+
121+ )
122+
123+ select *
124+ from unioned
125+ where generated_number <= {{upper_bound}}
126+ order by generated_number
127+
128+ {% endmacro %}
0 commit comments