@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.
@@ -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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"}