@powerhousedao/analytics-engine-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnalyticsDiscretizer.d.ts +58 -0
- package/dist/AnalyticsDiscretizer.js +236 -0
- package/dist/AnalyticsDiscretizer.js.map +1 -0
- package/dist/AnalyticsPath.d.ts +33 -0
- package/dist/AnalyticsPath.js +160 -0
- package/dist/AnalyticsPath.js.map +1 -0
- package/dist/AnalyticsPeriod.d.ts +48 -0
- package/dist/AnalyticsPeriod.js +214 -0
- package/dist/AnalyticsPeriod.js.map +1 -0
- package/dist/AnalyticsProfiler.d.ts +30 -0
- package/dist/AnalyticsProfiler.js +76 -0
- package/dist/AnalyticsProfiler.js.map +1 -0
- package/dist/AnalyticsQuery.d.ts +85 -0
- package/dist/AnalyticsQuery.js +28 -0
- package/dist/AnalyticsQuery.js.map +1 -0
- package/dist/AnalyticsQueryEngine.d.ts +19 -0
- package/dist/AnalyticsQueryEngine.js +173 -0
- package/dist/AnalyticsQueryEngine.js.map +1 -0
- package/dist/AnalyticsQueryResult.d.ts +9 -0
- package/dist/AnalyticsQueryResult.js +2 -0
- package/dist/AnalyticsQueryResult.js.map +1 -0
- package/dist/AnalyticsTimeSlicer.d.ts +28 -0
- package/dist/AnalyticsTimeSlicer.js +212 -0
- package/dist/AnalyticsTimeSlicer.js.map +1 -0
- package/dist/IAnalyticsCache.d.ts +6 -0
- package/dist/IAnalyticsCache.js +2 -0
- package/dist/IAnalyticsCache.js.map +1 -0
- package/dist/IAnalyticsStore.d.ts +23 -0
- package/dist/IAnalyticsStore.js +2 -0
- package/dist/IAnalyticsStore.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
export var AnalyticsSerializerTypes;
|
|
2
|
+
(function (AnalyticsSerializerTypes) {
|
|
3
|
+
AnalyticsSerializerTypes[AnalyticsSerializerTypes["AnalyticsPath"] = 0] = "AnalyticsPath";
|
|
4
|
+
AnalyticsSerializerTypes[AnalyticsSerializerTypes["AnalyticsPathSegment"] = 1] = "AnalyticsPathSegment";
|
|
5
|
+
AnalyticsSerializerTypes[AnalyticsSerializerTypes["AnalyticsPeriod"] = 2] = "AnalyticsPeriod";
|
|
6
|
+
})(AnalyticsSerializerTypes || (AnalyticsSerializerTypes = {}));
|
|
7
|
+
export var AnalyticsPeriodType;
|
|
8
|
+
(function (AnalyticsPeriodType) {
|
|
9
|
+
AnalyticsPeriodType[AnalyticsPeriodType["Year"] = 0] = "Year";
|
|
10
|
+
AnalyticsPeriodType[AnalyticsPeriodType["Quarter"] = 1] = "Quarter";
|
|
11
|
+
AnalyticsPeriodType[AnalyticsPeriodType["Month"] = 2] = "Month";
|
|
12
|
+
})(AnalyticsPeriodType || (AnalyticsPeriodType = {}));
|
|
13
|
+
export class AnalyticsPeriod {
|
|
14
|
+
get type() {
|
|
15
|
+
return this._type;
|
|
16
|
+
}
|
|
17
|
+
get year() {
|
|
18
|
+
return this._year;
|
|
19
|
+
}
|
|
20
|
+
get quarter() {
|
|
21
|
+
return this._quarter;
|
|
22
|
+
}
|
|
23
|
+
get month() {
|
|
24
|
+
return this._month;
|
|
25
|
+
}
|
|
26
|
+
_type = AnalyticsPeriodType.Year;
|
|
27
|
+
_year = 1970;
|
|
28
|
+
_quarter = null;
|
|
29
|
+
_month = null;
|
|
30
|
+
toJSON() {
|
|
31
|
+
return {
|
|
32
|
+
_t: AnalyticsSerializerTypes.AnalyticsPeriod,
|
|
33
|
+
_v: this.toString(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
static fromString(period) {
|
|
37
|
+
let result;
|
|
38
|
+
if (period.length === 4) {
|
|
39
|
+
result = new AnalyticsPeriod(Number.parseInt(period));
|
|
40
|
+
}
|
|
41
|
+
else if (period.length === 7) {
|
|
42
|
+
if (period[4] !== "/") {
|
|
43
|
+
throw new Error(`Invalid period string: '${period}'`);
|
|
44
|
+
}
|
|
45
|
+
else if (period[5] === "Q") {
|
|
46
|
+
result = new AnalyticsPeriod(Number.parseInt(period.slice(0, 4)), Number.parseInt(period[6]));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
result = new AnalyticsPeriod(Number.parseInt(period.slice(0, 4)), undefined, Number.parseInt(period.slice(5)));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
throw new Error(`Invalid period string: '${period}'`);
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
static fillRange(p1, p2) {
|
|
58
|
+
const obj1 = typeof p1 === "string" ? AnalyticsPeriod.fromString(p1) : p1, obj2 = typeof p2 === "string" ? AnalyticsPeriod.fromString(p2) : p2;
|
|
59
|
+
if (obj1.type !== obj2.type) {
|
|
60
|
+
throw new Error(`Cannot fill range of different type periods ${obj1.toString()} and ${obj2.toString()}.`);
|
|
61
|
+
}
|
|
62
|
+
const [first, last] = obj1.comesBefore(obj2) ? [obj1, obj2] : [obj2, obj1];
|
|
63
|
+
const result = [first];
|
|
64
|
+
let next = first.nextPeriod();
|
|
65
|
+
while (next.comesBefore(last)) {
|
|
66
|
+
result.push(next);
|
|
67
|
+
next = next.nextPeriod();
|
|
68
|
+
}
|
|
69
|
+
if (!last.equals(first)) {
|
|
70
|
+
result.push(last);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
static normalizeQuarters(year, quarter) {
|
|
75
|
+
const newYear = year + Math.floor((quarter - 1) / 4);
|
|
76
|
+
const newQuarter = moduloButWithoutBugs(quarter - 1, 4) + 1;
|
|
77
|
+
return [newYear, newQuarter, undefined];
|
|
78
|
+
}
|
|
79
|
+
static normalizeMonths(year, month) {
|
|
80
|
+
const newYear = year + Math.floor((month - 1) / 12);
|
|
81
|
+
const newMonth = moduloButWithoutBugs(month - 1, 12) + 1;
|
|
82
|
+
const newQuarter = Math.floor((newMonth - 1) / 3) + 1;
|
|
83
|
+
return [newYear, newQuarter, newMonth];
|
|
84
|
+
}
|
|
85
|
+
constructor(year, quarter, month) {
|
|
86
|
+
this._initAsYear(year);
|
|
87
|
+
if (quarter !== undefined) {
|
|
88
|
+
this._initAsQuarter(quarter);
|
|
89
|
+
}
|
|
90
|
+
if (month !== undefined) {
|
|
91
|
+
this._initAsMonth(month);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
equals(period) {
|
|
95
|
+
return (this.toString() ===
|
|
96
|
+
(typeof period === "string" ? period : period.toString()));
|
|
97
|
+
}
|
|
98
|
+
toString() {
|
|
99
|
+
let result = this._year + (this._type === AnalyticsPeriodType.Year ? "" : "/");
|
|
100
|
+
if (this._type === AnalyticsPeriodType.Quarter) {
|
|
101
|
+
result += "Q" + this._quarter;
|
|
102
|
+
}
|
|
103
|
+
else if (this._type === AnalyticsPeriodType.Month) {
|
|
104
|
+
if (this._month < 10) {
|
|
105
|
+
result += "0";
|
|
106
|
+
}
|
|
107
|
+
result += this._month;
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
startAsSqlDate() {
|
|
112
|
+
let result = this._year + "-";
|
|
113
|
+
switch (this._type) {
|
|
114
|
+
case AnalyticsPeriodType.Month:
|
|
115
|
+
result += (this._month < 10 ? "0" : "") + this.month;
|
|
116
|
+
break;
|
|
117
|
+
case AnalyticsPeriodType.Quarter:
|
|
118
|
+
const firstMonth = (this._quarter - 1) * 3 + 1;
|
|
119
|
+
result += (firstMonth < 10 ? "0" : "") + firstMonth;
|
|
120
|
+
break;
|
|
121
|
+
case AnalyticsPeriodType.Year:
|
|
122
|
+
result += "01";
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
return result + "-01";
|
|
126
|
+
}
|
|
127
|
+
comesAfter(period) {
|
|
128
|
+
return this._start() > period._end();
|
|
129
|
+
}
|
|
130
|
+
comesBefore(period) {
|
|
131
|
+
return period._start() > this._end();
|
|
132
|
+
}
|
|
133
|
+
contains(period) {
|
|
134
|
+
return this._start() <= period._start() && this._end() >= period._end();
|
|
135
|
+
}
|
|
136
|
+
firstMonth() {
|
|
137
|
+
let month = this._month || 1;
|
|
138
|
+
if (this._type === AnalyticsPeriodType.Quarter) {
|
|
139
|
+
month = (this._quarter - 1) * 3 + 1;
|
|
140
|
+
}
|
|
141
|
+
return new AnalyticsPeriod(this._year, undefined, month);
|
|
142
|
+
}
|
|
143
|
+
lastMonth() {
|
|
144
|
+
let month = this._month || 12;
|
|
145
|
+
if (this._type === AnalyticsPeriodType.Quarter) {
|
|
146
|
+
month = this._quarter * 3;
|
|
147
|
+
}
|
|
148
|
+
return new AnalyticsPeriod(this._year, undefined, month);
|
|
149
|
+
}
|
|
150
|
+
nextPeriod(n = 1) {
|
|
151
|
+
return this._addPeriods(n);
|
|
152
|
+
}
|
|
153
|
+
previousPeriod(n = 1) {
|
|
154
|
+
return this._addPeriods(-n);
|
|
155
|
+
}
|
|
156
|
+
_start() {
|
|
157
|
+
return this._getNumericComparator(false);
|
|
158
|
+
}
|
|
159
|
+
_end() {
|
|
160
|
+
return this._getNumericComparator(true);
|
|
161
|
+
}
|
|
162
|
+
_getNumericComparator(endOfPeriod) {
|
|
163
|
+
const defaultQuarter = endOfPeriod ? 4 : 1, defaultMonth = ((this._quarter || defaultQuarter) - 1) * 3 + (endOfPeriod ? 3 : 1), result = this._year * 1000 +
|
|
164
|
+
(this._quarter || defaultQuarter) * 100 +
|
|
165
|
+
(this._month || defaultMonth);
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
_addPeriods(periods) {
|
|
169
|
+
let result;
|
|
170
|
+
if (this._type === AnalyticsPeriodType.Year) {
|
|
171
|
+
result = new AnalyticsPeriod(this._year + periods);
|
|
172
|
+
}
|
|
173
|
+
else if (this._type === AnalyticsPeriodType.Quarter) {
|
|
174
|
+
const [y, q] = AnalyticsPeriod.normalizeQuarters(this._year, this._quarter + periods);
|
|
175
|
+
result = new AnalyticsPeriod(y, q);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const [y, _, m] = AnalyticsPeriod.normalizeMonths(this._year, this._month + periods);
|
|
179
|
+
result = new AnalyticsPeriod(y, undefined, m);
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
_initAsYear(year) {
|
|
184
|
+
if (year < 1970 || year > 2100) {
|
|
185
|
+
throw new Error(`Invalid period year: '${year}'`);
|
|
186
|
+
}
|
|
187
|
+
this._year = year;
|
|
188
|
+
}
|
|
189
|
+
_initAsQuarter(quarter) {
|
|
190
|
+
if (quarter < 1 || quarter > 4) {
|
|
191
|
+
throw new Error(`Invalid period quarter: ${quarter}`);
|
|
192
|
+
}
|
|
193
|
+
this._quarter = quarter;
|
|
194
|
+
this._type = AnalyticsPeriodType.Quarter;
|
|
195
|
+
}
|
|
196
|
+
_initAsMonth(month) {
|
|
197
|
+
if (month < 1 || month > 12) {
|
|
198
|
+
throw new Error(`Invalid period month: ${month}`);
|
|
199
|
+
}
|
|
200
|
+
if (this.quarter == null) {
|
|
201
|
+
this._initAsQuarter(Math.floor((month - 1) / 3) + 1);
|
|
202
|
+
}
|
|
203
|
+
else if (this.quarter !== Math.floor((month - 1) / 3) + 1) {
|
|
204
|
+
throw new Error(`Period month ${month} outside of quarter ${this.quarter}`);
|
|
205
|
+
}
|
|
206
|
+
this._month = month;
|
|
207
|
+
this._type = AnalyticsPeriodType.Month;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// See https://stackoverflow.com/questions/4467539/javascript-modulo-gives-a-negative-result-for-negative-numbers
|
|
211
|
+
function moduloButWithoutBugs(base, n) {
|
|
212
|
+
return ((base % n) + n) % n;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=AnalyticsPeriod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsPeriod.js","sourceRoot":"","sources":["../src/AnalyticsPeriod.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface IAnalyticsProfiler {
|
|
2
|
+
get prefix(): string;
|
|
3
|
+
push: (system: string) => void;
|
|
4
|
+
pop: () => void;
|
|
5
|
+
popAndReturn: (result: any) => any;
|
|
6
|
+
record: <T>(metric: string, fn: () => Promise<T>) => Promise<T>;
|
|
7
|
+
recordSync: <T>(metric: string, fn: () => T) => T;
|
|
8
|
+
}
|
|
9
|
+
export declare class AnalyticsProfiler implements IAnalyticsProfiler {
|
|
10
|
+
private readonly _ns;
|
|
11
|
+
private readonly _logger;
|
|
12
|
+
private readonly _stack;
|
|
13
|
+
private _prefix;
|
|
14
|
+
constructor(_ns: string, _logger: (metricName: string, ms: number) => void);
|
|
15
|
+
get prefix(): string;
|
|
16
|
+
push(system: string): void;
|
|
17
|
+
pop(): void;
|
|
18
|
+
popAndReturn(result: any): any;
|
|
19
|
+
record<T>(metric: string, fn: () => Promise<T>): Promise<T>;
|
|
20
|
+
recordSync<T>(metric: string, fn: () => T): T;
|
|
21
|
+
updatePrefix(): void;
|
|
22
|
+
}
|
|
23
|
+
export declare class PassthroughAnalyticsProfiler implements IAnalyticsProfiler {
|
|
24
|
+
get prefix(): string;
|
|
25
|
+
push(system: string): void;
|
|
26
|
+
pop(): void;
|
|
27
|
+
popAndReturn(result: any): any;
|
|
28
|
+
record<T>(metric: string, fn: () => Promise<T>): Promise<T>;
|
|
29
|
+
recordSync<T>(metric: string, fn: () => T): T;
|
|
30
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export class AnalyticsProfiler {
|
|
2
|
+
_ns;
|
|
3
|
+
_logger;
|
|
4
|
+
_stack = [];
|
|
5
|
+
_prefix = "";
|
|
6
|
+
constructor(_ns, _logger) {
|
|
7
|
+
this._ns = _ns;
|
|
8
|
+
this._logger = _logger;
|
|
9
|
+
this._prefix = _ns;
|
|
10
|
+
}
|
|
11
|
+
get prefix() {
|
|
12
|
+
return this._prefix;
|
|
13
|
+
}
|
|
14
|
+
push(system) {
|
|
15
|
+
this._stack.push(system);
|
|
16
|
+
this.updatePrefix();
|
|
17
|
+
}
|
|
18
|
+
pop() {
|
|
19
|
+
if (this._stack.pop()) {
|
|
20
|
+
this.updatePrefix();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
popAndReturn(result) {
|
|
24
|
+
this.pop();
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
async record(metric, fn) {
|
|
28
|
+
const start = performance.now();
|
|
29
|
+
const fullMetric = `${this.prefix}.${metric}`;
|
|
30
|
+
try {
|
|
31
|
+
return await fn();
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
this._logger(fullMetric, performance.now() - start);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
recordSync(metric, fn) {
|
|
38
|
+
const start = performance.now();
|
|
39
|
+
const fullMetric = `${this.prefix}.${metric}`;
|
|
40
|
+
try {
|
|
41
|
+
return fn();
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
this._logger(fullMetric, performance.now() - start);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
updatePrefix() {
|
|
48
|
+
if (this._stack.length > 0) {
|
|
49
|
+
this._prefix = `${this._ns}.${this._stack.join(".")}`;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this._prefix = this._ns;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class PassthroughAnalyticsProfiler {
|
|
57
|
+
get prefix() {
|
|
58
|
+
return "";
|
|
59
|
+
}
|
|
60
|
+
push(system) {
|
|
61
|
+
//
|
|
62
|
+
}
|
|
63
|
+
pop() {
|
|
64
|
+
//
|
|
65
|
+
}
|
|
66
|
+
popAndReturn(result) {
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
async record(metric, fn) {
|
|
70
|
+
return await fn();
|
|
71
|
+
}
|
|
72
|
+
recordSync(metric, fn) {
|
|
73
|
+
return fn();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=AnalyticsProfiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsProfiler.js","sourceRoot":"","sources":["../src/AnalyticsProfiler.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,iBAAiB;IAKT;IACA;IALF,MAAM,GAAa,EAAE,CAAC;IAC/B,OAAO,GAAW,EAAE,CAAC;IAE7B,YACmB,GAAW,EACX,OAAiD;QADjD,QAAG,GAAH,GAAG,CAAQ;QACX,YAAO,GAAP,OAAO,CAA0C;QAElE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEzB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,GAAG;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,MAAW;QACtB,IAAI,CAAC,GAAG,EAAE,CAAC;QAEX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,MAAc,EAAE,EAAoB;QAClD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,UAAU,CAAI,MAAc,EAAE,EAAW;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,YAAY;QACV,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;QAC1B,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,4BAA4B;IACvC,IAAI,MAAM;QACR,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,EAAE;IACJ,CAAC;IAED,GAAG;QACD,EAAE;IACJ,CAAC;IAED,YAAY,CAAC,MAAW;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,MAAc,EAAE,EAAoB;QAClD,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAED,UAAU,CAAI,MAAc,EAAE,EAAW;QACvC,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
2
|
+
import { AnalyticsPath } from "./AnalyticsPath.js";
|
|
3
|
+
export type AnalyticsSeriesQuery = {
|
|
4
|
+
start: DateTime | null;
|
|
5
|
+
end: DateTime | null;
|
|
6
|
+
metrics: string[];
|
|
7
|
+
currency: AnalyticsPath;
|
|
8
|
+
select: Record<string, AnalyticsPath[]>;
|
|
9
|
+
};
|
|
10
|
+
export type AnalyticsQuery = AnalyticsSeriesQuery & {
|
|
11
|
+
granularity: AnalyticsGranularity;
|
|
12
|
+
lod: Record<string, number | null>;
|
|
13
|
+
};
|
|
14
|
+
export type AnalyticsSeries<D = string | AnalyticsDimension> = {
|
|
15
|
+
source: AnalyticsPath;
|
|
16
|
+
start: DateTime;
|
|
17
|
+
end: DateTime | null;
|
|
18
|
+
metric: string;
|
|
19
|
+
value: number;
|
|
20
|
+
unit: string | null;
|
|
21
|
+
fn: string;
|
|
22
|
+
params: Record<string, any> | null;
|
|
23
|
+
dimensions: Record<string, D>;
|
|
24
|
+
};
|
|
25
|
+
export type AnalyticsDimension = {
|
|
26
|
+
path: AnalyticsPath;
|
|
27
|
+
icon: string;
|
|
28
|
+
label: string;
|
|
29
|
+
description: string;
|
|
30
|
+
};
|
|
31
|
+
export declare enum AnalyticsMetric {
|
|
32
|
+
Budget = 0,
|
|
33
|
+
Forecast = 1,
|
|
34
|
+
Actuals = 2,
|
|
35
|
+
PaymentsOnChain = 3,
|
|
36
|
+
PaymentsOffChainIncluded = 4,
|
|
37
|
+
FTEs = 5
|
|
38
|
+
}
|
|
39
|
+
export type CompoundAnalyticsQuery = {
|
|
40
|
+
start: DateTime | null;
|
|
41
|
+
end: DateTime | null;
|
|
42
|
+
granularity: AnalyticsGranularity;
|
|
43
|
+
lod: Record<string, number | null>;
|
|
44
|
+
select: Record<string, AnalyticsPath[]>;
|
|
45
|
+
expression: CompoundAnalyticsExpression;
|
|
46
|
+
};
|
|
47
|
+
export type CompoundAnalyticsExpression = {
|
|
48
|
+
inputs: CompoundAnalyticsInputs;
|
|
49
|
+
operator: CompoundOperator;
|
|
50
|
+
operand: AnalyticsOperand;
|
|
51
|
+
resultCurrency: AnalyticsPath;
|
|
52
|
+
};
|
|
53
|
+
export type CompoundAnalyticsInputs = {
|
|
54
|
+
metrics: string[];
|
|
55
|
+
currency: AnalyticsPath;
|
|
56
|
+
};
|
|
57
|
+
export type AnalyticsOperand = {
|
|
58
|
+
metric: string;
|
|
59
|
+
currency: AnalyticsPath;
|
|
60
|
+
useSum: boolean;
|
|
61
|
+
};
|
|
62
|
+
export declare enum CompoundOperator {
|
|
63
|
+
VectorAdd = 0,
|
|
64
|
+
VectorSubtract = 1,
|
|
65
|
+
ScalarMultiply = 2,
|
|
66
|
+
ScalarDivide = 3
|
|
67
|
+
}
|
|
68
|
+
export type MultiCurrencyConversion = {
|
|
69
|
+
targetCurrency: AnalyticsPath;
|
|
70
|
+
conversions: ConversionMetric[];
|
|
71
|
+
};
|
|
72
|
+
export type ConversionMetric = {
|
|
73
|
+
metric: string;
|
|
74
|
+
currency: AnalyticsPath;
|
|
75
|
+
};
|
|
76
|
+
export declare enum AnalyticsGranularity {
|
|
77
|
+
Total = 0,
|
|
78
|
+
Annual = 1,
|
|
79
|
+
SemiAnnual = 2,
|
|
80
|
+
Quarterly = 3,
|
|
81
|
+
Monthly = 4,
|
|
82
|
+
Weekly = 5,
|
|
83
|
+
Daily = 6,
|
|
84
|
+
Hourly = 7
|
|
85
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export var AnalyticsMetric;
|
|
2
|
+
(function (AnalyticsMetric) {
|
|
3
|
+
AnalyticsMetric[AnalyticsMetric["Budget"] = 0] = "Budget";
|
|
4
|
+
AnalyticsMetric[AnalyticsMetric["Forecast"] = 1] = "Forecast";
|
|
5
|
+
AnalyticsMetric[AnalyticsMetric["Actuals"] = 2] = "Actuals";
|
|
6
|
+
AnalyticsMetric[AnalyticsMetric["PaymentsOnChain"] = 3] = "PaymentsOnChain";
|
|
7
|
+
AnalyticsMetric[AnalyticsMetric["PaymentsOffChainIncluded"] = 4] = "PaymentsOffChainIncluded";
|
|
8
|
+
AnalyticsMetric[AnalyticsMetric["FTEs"] = 5] = "FTEs";
|
|
9
|
+
})(AnalyticsMetric || (AnalyticsMetric = {}));
|
|
10
|
+
export var CompoundOperator;
|
|
11
|
+
(function (CompoundOperator) {
|
|
12
|
+
CompoundOperator[CompoundOperator["VectorAdd"] = 0] = "VectorAdd";
|
|
13
|
+
CompoundOperator[CompoundOperator["VectorSubtract"] = 1] = "VectorSubtract";
|
|
14
|
+
CompoundOperator[CompoundOperator["ScalarMultiply"] = 2] = "ScalarMultiply";
|
|
15
|
+
CompoundOperator[CompoundOperator["ScalarDivide"] = 3] = "ScalarDivide";
|
|
16
|
+
})(CompoundOperator || (CompoundOperator = {}));
|
|
17
|
+
export var AnalyticsGranularity;
|
|
18
|
+
(function (AnalyticsGranularity) {
|
|
19
|
+
AnalyticsGranularity[AnalyticsGranularity["Total"] = 0] = "Total";
|
|
20
|
+
AnalyticsGranularity[AnalyticsGranularity["Annual"] = 1] = "Annual";
|
|
21
|
+
AnalyticsGranularity[AnalyticsGranularity["SemiAnnual"] = 2] = "SemiAnnual";
|
|
22
|
+
AnalyticsGranularity[AnalyticsGranularity["Quarterly"] = 3] = "Quarterly";
|
|
23
|
+
AnalyticsGranularity[AnalyticsGranularity["Monthly"] = 4] = "Monthly";
|
|
24
|
+
AnalyticsGranularity[AnalyticsGranularity["Weekly"] = 5] = "Weekly";
|
|
25
|
+
AnalyticsGranularity[AnalyticsGranularity["Daily"] = 6] = "Daily";
|
|
26
|
+
AnalyticsGranularity[AnalyticsGranularity["Hourly"] = 7] = "Hourly";
|
|
27
|
+
})(AnalyticsGranularity || (AnalyticsGranularity = {}));
|
|
28
|
+
//# sourceMappingURL=AnalyticsQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsQuery.js","sourceRoot":"","sources":["../src/AnalyticsQuery.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAN,IAAY,eAOX;AAPD,WAAY,eAAe;IACzB,yDAAM,CAAA;IACN,6DAAQ,CAAA;IACR,2DAAO,CAAA;IACP,2EAAe,CAAA;IACf,6FAAwB,CAAA;IACxB,qDAAI,CAAA;AACN,CAAC,EAPW,eAAe,KAAf,eAAe,QAO1B;AA6BD,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,iEAAS,CAAA;IACT,2EAAc,CAAA;IACd,2EAAc,CAAA;IACd,uEAAY,CAAA;AACd,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;AAYD,MAAM,CAAN,IAAY,oBASX;AATD,WAAY,oBAAoB;IAC9B,iEAAK,CAAA;IACL,mEAAM,CAAA;IACN,2EAAU,CAAA;IACV,yEAAS,CAAA;IACT,qEAAO,CAAA;IACP,mEAAM,CAAA;IACN,iEAAK,CAAA;IACL,mEAAM,CAAA;AACR,CAAC,EATW,oBAAoB,KAApB,oBAAoB,QAS/B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { GroupedPeriodResults } from "./AnalyticsDiscretizer.js";
|
|
2
|
+
import { IAnalyticsProfiler } from "./AnalyticsProfiler.js";
|
|
3
|
+
import { AnalyticsQuery, CompoundAnalyticsQuery, MultiCurrencyConversion } from "./AnalyticsQuery.js";
|
|
4
|
+
import { IAnalyticsStore } from "./IAnalyticsStore.js";
|
|
5
|
+
export declare class AnalyticsQueryEngine {
|
|
6
|
+
private readonly _analyticsStore;
|
|
7
|
+
private readonly _profiler;
|
|
8
|
+
constructor(_analyticsStore: IAnalyticsStore, profiler?: IAnalyticsProfiler);
|
|
9
|
+
executeCompound(query: CompoundAnalyticsQuery): Promise<GroupedPeriodResults>;
|
|
10
|
+
execute(query: AnalyticsQuery): Promise<GroupedPeriodResults>;
|
|
11
|
+
executeMultiCurrency(query: AnalyticsQuery, mcc: MultiCurrencyConversion): Promise<GroupedPeriodResults>;
|
|
12
|
+
private _applyVectorOperator;
|
|
13
|
+
private _applyScalarOperator;
|
|
14
|
+
private _calculateOutputValue;
|
|
15
|
+
private _executeSeriesQuery;
|
|
16
|
+
private _applyLods;
|
|
17
|
+
private _applyDimensionsLods;
|
|
18
|
+
getDimensions(): Promise<any>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { AnalyticsDiscretizer, } from "./AnalyticsDiscretizer.js";
|
|
2
|
+
import { AnalyticsPath } from "./AnalyticsPath.js";
|
|
3
|
+
import { PassthroughAnalyticsProfiler, } from "./AnalyticsProfiler.js";
|
|
4
|
+
import { CompoundOperator, } from "./AnalyticsQuery.js";
|
|
5
|
+
export class AnalyticsQueryEngine {
|
|
6
|
+
_analyticsStore;
|
|
7
|
+
_profiler;
|
|
8
|
+
constructor(_analyticsStore, profiler) {
|
|
9
|
+
this._analyticsStore = _analyticsStore;
|
|
10
|
+
this._profiler = profiler ?? new PassthroughAnalyticsProfiler();
|
|
11
|
+
}
|
|
12
|
+
async executeCompound(query) {
|
|
13
|
+
let result;
|
|
14
|
+
const inputsQuery = {
|
|
15
|
+
start: query.start,
|
|
16
|
+
end: query.end,
|
|
17
|
+
granularity: query.granularity,
|
|
18
|
+
lod: query.lod,
|
|
19
|
+
select: query.select,
|
|
20
|
+
metrics: query.expression.inputs.metrics,
|
|
21
|
+
currency: query.expression.inputs.currency,
|
|
22
|
+
};
|
|
23
|
+
const operandQuery = {
|
|
24
|
+
start: query.start,
|
|
25
|
+
end: query.end,
|
|
26
|
+
granularity: query.granularity,
|
|
27
|
+
lod: { priceData: 1 },
|
|
28
|
+
select: { priceData: [AnalyticsPath.fromString("atlas")] },
|
|
29
|
+
metrics: [query.expression.operand.metric],
|
|
30
|
+
currency: query.expression.operand.currency,
|
|
31
|
+
};
|
|
32
|
+
const inputExecute = await this.execute(inputsQuery);
|
|
33
|
+
const operandExecute = await this.execute(operandQuery);
|
|
34
|
+
if ([CompoundOperator.VectorAdd, CompoundOperator.VectorSubtract].includes(query.expression.operator)) {
|
|
35
|
+
result = await this._profiler.record("ApplyVectorOperator", async () => await this._applyVectorOperator(inputExecute, operandExecute, query.expression.operator, query.expression.resultCurrency));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
result = await this._profiler.record("ApplyScalarOperator", async () => await this._applyScalarOperator(inputExecute, operandExecute, query.expression.operator, query.expression.operand.useSum, query.expression.resultCurrency));
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
async execute(query) {
|
|
43
|
+
const seriesResults = await this._executeSeriesQuery(query);
|
|
44
|
+
const normalizedSeriesResults = this._profiler.recordSync("ApplyLODs", () => this._applyLods(seriesResults, query.lod));
|
|
45
|
+
const dimensions = Object.keys(query.select);
|
|
46
|
+
const discretizedResult = this._profiler.recordSync("Discretize", () => normalizedSeriesResults.length < 1
|
|
47
|
+
? []
|
|
48
|
+
: AnalyticsDiscretizer.discretize(normalizedSeriesResults, dimensions, query.start, query.end, query.granularity));
|
|
49
|
+
return discretizedResult;
|
|
50
|
+
}
|
|
51
|
+
async executeMultiCurrency(query, mcc) {
|
|
52
|
+
const baseQuery = {
|
|
53
|
+
...query,
|
|
54
|
+
currency: mcc.targetCurrency,
|
|
55
|
+
};
|
|
56
|
+
let result = await this.execute(baseQuery);
|
|
57
|
+
for (const conversion of mcc.conversions) {
|
|
58
|
+
const nextQuery = {
|
|
59
|
+
start: query.start,
|
|
60
|
+
end: query.end,
|
|
61
|
+
granularity: query.granularity,
|
|
62
|
+
lod: query.lod,
|
|
63
|
+
select: query.select,
|
|
64
|
+
expression: {
|
|
65
|
+
inputs: {
|
|
66
|
+
metrics: baseQuery.metrics,
|
|
67
|
+
currency: conversion.currency,
|
|
68
|
+
},
|
|
69
|
+
operator: CompoundOperator.ScalarMultiply,
|
|
70
|
+
operand: {
|
|
71
|
+
metric: conversion.metric,
|
|
72
|
+
currency: mcc.targetCurrency,
|
|
73
|
+
useSum: true,
|
|
74
|
+
},
|
|
75
|
+
resultCurrency: mcc.targetCurrency,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const executedCompound = await this.executeCompound(nextQuery);
|
|
79
|
+
result = await this._applyVectorOperator(result, executedCompound, CompoundOperator.VectorAdd, mcc.targetCurrency);
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
async _applyVectorOperator(inputsA, inputsB, operator, resultCurrency) {
|
|
84
|
+
if ([CompoundOperator.ScalarMultiply, CompoundOperator.ScalarDivide].includes(operator)) {
|
|
85
|
+
throw new Error("Invalid operator for vector operation");
|
|
86
|
+
}
|
|
87
|
+
return inputsB;
|
|
88
|
+
}
|
|
89
|
+
async _applyScalarOperator(inputs, // expected input is the budget & actuals in 2022 monthly granularity in MKR
|
|
90
|
+
operand, // expected input is the daily mkr price change in 2022 monthly granularity in DAI
|
|
91
|
+
operator, // expected to me multiply and later addition
|
|
92
|
+
useOperandSum, resultCurrency // expected to be DAI
|
|
93
|
+
) {
|
|
94
|
+
if ([CompoundOperator.VectorAdd, CompoundOperator.VectorSubtract].includes(operator)) {
|
|
95
|
+
throw new Error("Invalid operator for scalar operation");
|
|
96
|
+
}
|
|
97
|
+
const result = [];
|
|
98
|
+
const operandMap = {};
|
|
99
|
+
const key = useOperandSum ? "sum" : "value";
|
|
100
|
+
for (const operandPeriod of operand) {
|
|
101
|
+
if (operandPeriod.rows.length > 0) {
|
|
102
|
+
operandMap[operandPeriod.period] = operandPeriod.rows[0][key];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// let previousValue: number = 1;
|
|
106
|
+
for (const inputPeriod of inputs) {
|
|
107
|
+
const outputPeriod = {
|
|
108
|
+
period: inputPeriod.period,
|
|
109
|
+
start: inputPeriod.start,
|
|
110
|
+
end: inputPeriod.end,
|
|
111
|
+
rows: inputPeriod.rows.map((row) => {
|
|
112
|
+
const newRow = {
|
|
113
|
+
dimensions: row.dimensions,
|
|
114
|
+
metric: row.metric,
|
|
115
|
+
unit: resultCurrency.toString(),
|
|
116
|
+
value: this._calculateOutputValue(row.value, operator, operandMap[inputPeriod.period]),
|
|
117
|
+
sum: -1,
|
|
118
|
+
};
|
|
119
|
+
return newRow;
|
|
120
|
+
}),
|
|
121
|
+
};
|
|
122
|
+
result.push(outputPeriod);
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
_calculateOutputValue(input, operator, operand) {
|
|
127
|
+
switch (operator) {
|
|
128
|
+
case CompoundOperator.VectorAdd:
|
|
129
|
+
return input + operand;
|
|
130
|
+
case CompoundOperator.VectorSubtract:
|
|
131
|
+
return input - operand;
|
|
132
|
+
case CompoundOperator.ScalarMultiply:
|
|
133
|
+
return input * operand;
|
|
134
|
+
case CompoundOperator.ScalarDivide:
|
|
135
|
+
return input / operand;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async _executeSeriesQuery(query) {
|
|
139
|
+
const seriesQuery = {
|
|
140
|
+
start: query.start,
|
|
141
|
+
end: query.end,
|
|
142
|
+
currency: query.currency,
|
|
143
|
+
select: query.select,
|
|
144
|
+
metrics: query.metrics,
|
|
145
|
+
};
|
|
146
|
+
return await this._analyticsStore.getMatchingSeries(seriesQuery);
|
|
147
|
+
}
|
|
148
|
+
_applyLods(series, lods) {
|
|
149
|
+
return series.map((result) => ({
|
|
150
|
+
...result,
|
|
151
|
+
dimensions: this._applyDimensionsLods(result.dimensions, lods),
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
_applyDimensionsLods(dimensionMap, lods) {
|
|
155
|
+
const result = {};
|
|
156
|
+
for (const [dimension, lod] of Object.entries(lods)) {
|
|
157
|
+
if (lod !== null && dimensionMap[dimension]) {
|
|
158
|
+
result[dimension] = dimensionMap[dimension]["path"]
|
|
159
|
+
.applyLod(lod)
|
|
160
|
+
.toString();
|
|
161
|
+
result["icon"] = dimensionMap[dimension]["icon"].toString();
|
|
162
|
+
result["label"] = dimensionMap[dimension]["label"].toString();
|
|
163
|
+
result["description"] =
|
|
164
|
+
dimensionMap[dimension]["description"].toString();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
async getDimensions() {
|
|
170
|
+
return await this._analyticsStore.getDimensions();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=AnalyticsQueryEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsQueryEngine.js","sourceRoot":"","sources":["../src/AnalyticsQueryEngine.ts"],"names":[],"mappings":"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"}
|