@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,58 @@
1
+ import { AnalyticsDimension, AnalyticsGranularity, AnalyticsSeries } from "./AnalyticsQuery.js";
2
+ import { AnalyticsPeriod } from "./AnalyticsTimeSlicer.js";
3
+ import { DateTime } from "luxon";
4
+ export declare const getQuarter: (date: DateTime) => number;
5
+ export type GroupedPeriodResult = {
6
+ period: string;
7
+ start: DateTime;
8
+ end: DateTime;
9
+ rows: Array<{
10
+ dimensions: Record<string, AnalyticsDimension>;
11
+ metric: string;
12
+ unit: string | null;
13
+ value: number;
14
+ /**
15
+ * The sum of all metric values over this period?
16
+ */
17
+ sum: number;
18
+ }>;
19
+ };
20
+ export type GroupedPeriodResults = Array<GroupedPeriodResult>;
21
+ export declare class AnalyticsDiscretizer {
22
+ static discretize(series: AnalyticsSeries<string>[], dimensions: string[], start: DateTime | null, end: DateTime | null, granularity: AnalyticsGranularity): GroupedPeriodResults;
23
+ private static _calculateRange;
24
+ static _groupResultsByPeriod(periods: AnalyticsPeriod[], dimensionedResults: DimensionedSeries[]): GroupedPeriodResults;
25
+ static _getPeriodString(p: AnalyticsPeriod): string;
26
+ static _discretizeNode(node: DiscretizerIndexNode, dimensionValues: Record<string, string>, remainingDimensions: string[], periods: AnalyticsPeriod[]): DimensionedSeries[];
27
+ static _discretizeLeaf(leaf: DiscretizerIndexLeaf, periods: AnalyticsPeriod[], metric: string, dimensionValues: Record<string, string>): DimensionedSeries[];
28
+ static _discretizeSeries(series: AnalyticsSeries<string>[], periods: AnalyticsPeriod[]): Series;
29
+ static _getValue(series: AnalyticsSeries<string>, when: DateTime): number;
30
+ static _getSingleValue(series: AnalyticsSeries<string>, when: DateTime): number;
31
+ static _getVestValue(series: AnalyticsSeries<string>, when: DateTime): number;
32
+ static _buildIndex(series: AnalyticsSeries<string>[], dimensions: string[]): DiscretizerIndexNode;
33
+ static _buildMetricsIndex(series: AnalyticsSeries<string>[]): DiscretizerIndexNode;
34
+ static _buildUnitIndex(series: AnalyticsSeries<string>[]): DiscretizerIndexLeaf;
35
+ }
36
+ type DiscretizerIndexLeaf = {
37
+ [k: string]: AnalyticsSeries<string>[];
38
+ };
39
+ type DiscretizerIndexNode = {
40
+ [k: string]: DiscretizerIndexNode | DiscretizerIndexLeaf;
41
+ };
42
+ type Series = Record<string, {
43
+ /**
44
+ * How much the metric increased from the beginning of the series to the end of the specified period.
45
+ */
46
+ inc: number;
47
+ /**
48
+ * The sum of all metric values from the beginning of the series to the end of the specified period.
49
+ */
50
+ sum: number;
51
+ }>;
52
+ type DimensionedSeries = {
53
+ unit: string;
54
+ metric: string;
55
+ dimensions: Record<string, AnalyticsDimension>;
56
+ series: Series;
57
+ };
58
+ export {};
@@ -0,0 +1,236 @@
1
+ import { getPeriodSeriesArray, } from "./AnalyticsTimeSlicer.js";
2
+ import { DateTime, Interval } from "luxon";
3
+ export const getQuarter = (date) => {
4
+ return Math.floor((date.month - 1) / 3) + 1;
5
+ };
6
+ export class AnalyticsDiscretizer {
7
+ static discretize(series, dimensions, start, end, granularity) {
8
+ const index = this._buildIndex(series, dimensions);
9
+ const periods = getPeriodSeriesArray(this._calculateRange(start, end, granularity, series));
10
+ const disretizedResults = this._discretizeNode(index, {}, dimensions, periods);
11
+ const groupedResults = this._groupResultsByPeriod(periods, disretizedResults);
12
+ return groupedResults;
13
+ }
14
+ static _calculateRange(start, end, granularity, results) {
15
+ let calculatedStart = start || null;
16
+ let calculatedEnd = end || null;
17
+ if (calculatedStart == null || calculatedEnd == null) {
18
+ for (const r of results) {
19
+ if (calculatedStart == null) {
20
+ calculatedStart = r.start;
21
+ }
22
+ const endValue = r.end || r.start;
23
+ if (calculatedEnd == null || calculatedEnd < endValue) {
24
+ calculatedEnd = endValue;
25
+ }
26
+ }
27
+ }
28
+ if (calculatedStart == null || calculatedEnd == null) {
29
+ throw new Error("Cannot determine query start and/or end.");
30
+ }
31
+ return {
32
+ start: calculatedStart,
33
+ end: calculatedEnd,
34
+ granularity,
35
+ };
36
+ }
37
+ static _groupResultsByPeriod(periods, dimensionedResults) {
38
+ const result = {};
39
+ for (const p of periods) {
40
+ const id = p.start.toISO() + "-" + p.period;
41
+ const period = AnalyticsDiscretizer._getPeriodString(p);
42
+ result[id] = {
43
+ period: period,
44
+ start: p.start,
45
+ end: p.end,
46
+ rows: [],
47
+ };
48
+ }
49
+ for (const r of dimensionedResults) {
50
+ for (const period of Object.keys(r.series)) {
51
+ result[period].rows.push({
52
+ dimensions: r.dimensions,
53
+ metric: r.metric,
54
+ unit: r.unit == "__NULL__" ? null : r.unit,
55
+ value: r.series[period].inc,
56
+ sum: r.series[period].sum,
57
+ });
58
+ }
59
+ }
60
+ return Object.values(result);
61
+ }
62
+ static _getPeriodString(p) {
63
+ switch (p.period) {
64
+ case "annual":
65
+ return p.start.year.toString();
66
+ case "semiAnnual":
67
+ return `${p.start.year}/${p.start.month < 7 ? "H1" : "H2"}`;
68
+ case "quarterly":
69
+ return `${p.start.year}/Q${getQuarter(p.start)}`;
70
+ case "monthly":
71
+ const month = p.start.toUTC().month;
72
+ const formattedMonth = month < 10 ? `0${month}` : `${month}`;
73
+ return `${p.start.year}/${formattedMonth}`;
74
+ case "weekly":
75
+ return `${p.start.weekYear}/W${p.start.weekNumber}`;
76
+ case "daily":
77
+ const monthD = p.start.month;
78
+ const day = p.start.day;
79
+ const formattedMonthD = monthD < 10 ? `0${monthD}` : `${monthD}`;
80
+ const formattedDay = day < 10 ? `0${day}` : `${day}`;
81
+ return `${p.start.year}/${formattedMonthD}/${formattedDay}`;
82
+ case "hourly":
83
+ const monthH = p.start.month;
84
+ const dayH = p.start.day;
85
+ const hourH = p.start.hour;
86
+ const formattedMonthH = monthH < 10 ? `0${monthH}` : `${monthH}`;
87
+ const formattedDayH = dayH < 10 ? `0${dayH}` : `${dayH}`;
88
+ const formattedHourH = hourH < 10 ? `0${hourH}` : `${hourH}`;
89
+ return `${p.start.year}/${formattedMonthH}/${formattedDayH}/${formattedHourH}`;
90
+ default:
91
+ return p.period;
92
+ }
93
+ }
94
+ static _discretizeNode(node, dimensionValues, remainingDimensions, periods) {
95
+ const result = [];
96
+ if (remainingDimensions.length > 0) {
97
+ const subdimension = remainingDimensions[0];
98
+ Object.keys(node).forEach((subdimensionValue, index, arr) => {
99
+ const newDimensionValues = { ...dimensionValues };
100
+ newDimensionValues[subdimension] = subdimensionValue;
101
+ result.push(...this._discretizeNode(node[subdimensionValue], newDimensionValues, remainingDimensions.slice(1), periods));
102
+ });
103
+ }
104
+ else {
105
+ Object.keys(node).forEach((metric) => {
106
+ result.push(...this._discretizeLeaf(node[metric], periods, metric, dimensionValues));
107
+ });
108
+ }
109
+ return result;
110
+ }
111
+ static _discretizeLeaf(leaf, periods, metric, dimensionValues) {
112
+ const result = [];
113
+ Object.keys(leaf).forEach((unit) => {
114
+ const metaDimensions = {};
115
+ Object.keys(dimensionValues).forEach((k) => {
116
+ metaDimensions[k] = {
117
+ path: leaf[unit][0].dimensions[k],
118
+ icon: leaf[unit][0].dimensions.icon,
119
+ label: leaf[unit][0].dimensions.label,
120
+ description: leaf[unit][0].dimensions.description,
121
+ };
122
+ });
123
+ result.push({
124
+ unit,
125
+ metric,
126
+ dimensions: metaDimensions,
127
+ series: this._discretizeSeries(leaf[unit], periods),
128
+ });
129
+ });
130
+ return result;
131
+ }
132
+ static _discretizeSeries(series, periods) {
133
+ const result = {};
134
+ for (const s of series) {
135
+ let oldSum = this._getValue(s, periods[0].start);
136
+ for (const p of periods) {
137
+ const newSum = this._getValue(s, p.end);
138
+ const id = `${p.start.toISO()}-${p.period}`;
139
+ // const id = p.period;
140
+ if (result[id]) {
141
+ result[id].inc += newSum - oldSum;
142
+ result[id].sum += newSum;
143
+ }
144
+ else {
145
+ result[id] = {
146
+ inc: newSum - oldSum,
147
+ sum: newSum,
148
+ };
149
+ }
150
+ oldSum = newSum;
151
+ }
152
+ }
153
+ return result;
154
+ }
155
+ static _getValue(series, when) {
156
+ switch (series.fn) {
157
+ case "Single":
158
+ return this._getSingleValue(series, when);
159
+ case "DssVest":
160
+ return this._getVestValue(series, when);
161
+ default:
162
+ // todo: logging interface
163
+ //console.error(`Unknown analytics series function: '${series.fn}'`);
164
+ return 0.0;
165
+ }
166
+ }
167
+ static _getSingleValue(series, when) {
168
+ return when >= series.start ? series.value : 0.0;
169
+ }
170
+ static _getVestValue(series, when) {
171
+ const now = when;
172
+ const start = series.start;
173
+ const end = series.end;
174
+ const cliff = series.params?.cliff
175
+ ? DateTime.fromISO(series.params.cliff)
176
+ : null;
177
+ if (now < start || (cliff && now < cliff)) {
178
+ return 0.0;
179
+ }
180
+ else if (end && now >= end) {
181
+ return series.value;
182
+ }
183
+ const a = Interval.fromDateTimes(start, now);
184
+ const b = Interval.fromDateTimes(start, end || now);
185
+ return (a.length() / b.length()) * series.value;
186
+ }
187
+ static _buildIndex(series, dimensions) {
188
+ const result = {};
189
+ const map = {};
190
+ const dimName = dimensions[0] || "";
191
+ for (const s of series) {
192
+ const dimValue = s.dimensions[dimName];
193
+ if (undefined === map[dimValue]) {
194
+ map[dimValue] = [];
195
+ }
196
+ map[dimValue].push(s);
197
+ }
198
+ if (dimensions.length > 1) {
199
+ const newDimensions = dimensions.slice(1);
200
+ Object.keys(map).forEach((k) => {
201
+ result[k] = this._buildIndex(map[k], newDimensions);
202
+ });
203
+ }
204
+ else {
205
+ Object.keys(map).forEach((k) => {
206
+ result[k] = this._buildMetricsIndex(map[k]);
207
+ });
208
+ }
209
+ return result;
210
+ }
211
+ static _buildMetricsIndex(series) {
212
+ const result = {};
213
+ const map = {};
214
+ for (const s of series) {
215
+ const metric = s.metric;
216
+ if (undefined === map[metric]) {
217
+ map[metric] = [];
218
+ }
219
+ map[metric].push(s);
220
+ }
221
+ Object.keys(map).forEach((k) => (result[k] = this._buildUnitIndex(map[k])));
222
+ return result;
223
+ }
224
+ static _buildUnitIndex(series) {
225
+ const result = {};
226
+ for (const s of series) {
227
+ const unit = s.unit || "__NULL__";
228
+ if (undefined === result[unit]) {
229
+ result[unit] = [];
230
+ }
231
+ result[unit].push(s);
232
+ }
233
+ return result;
234
+ }
235
+ }
236
+ //# sourceMappingURL=AnalyticsDiscretizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsDiscretizer.js","sourceRoot":"","sources":["../src/AnalyticsDiscretizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { AnalyticsSerializerTypes } from "./AnalyticsPeriod.js";
2
+ export declare class AnalyticsPath {
3
+ get segments(): AnalyticsPathSegment[];
4
+ private _segments;
5
+ static fromString(path: string): AnalyticsPath;
6
+ static fromJSON(json: any): AnalyticsPath;
7
+ constructor(segments: AnalyticsPathSegment[]);
8
+ toJSON(): {
9
+ _t: AnalyticsSerializerTypes;
10
+ _v: string;
11
+ };
12
+ toString(tail?: string): string;
13
+ firstSegment(): AnalyticsPathSegment;
14
+ reduce(): AnalyticsPath;
15
+ applyLod(levelOfDetail: number): AnalyticsPath;
16
+ }
17
+ export declare class AnalyticsPathSegment {
18
+ get filters(): NullableStrings;
19
+ get groups(): NullableStrings;
20
+ private _filters;
21
+ private _groups;
22
+ static fromString(segment: string): AnalyticsPathSegment;
23
+ static escape(segment: string): string;
24
+ static unescape(segment: string): string;
25
+ constructor(filters?: NullableStrings, groups?: NullableStrings);
26
+ toJSON(): {
27
+ _t: AnalyticsSerializerTypes;
28
+ _v: string;
29
+ };
30
+ toString(): string;
31
+ }
32
+ type NullableStrings = string[] | null;
33
+ export {};
@@ -0,0 +1,160 @@
1
+ import { AnalyticsSerializerTypes } from "./AnalyticsPeriod.js";
2
+ export class AnalyticsPath {
3
+ get segments() {
4
+ return this._segments;
5
+ }
6
+ _segments;
7
+ static fromString(path) {
8
+ const segments = parseSeparatedList(path, "/").map((segment) => AnalyticsPathSegment.fromString(segment));
9
+ return new AnalyticsPath(segments);
10
+ }
11
+ static fromJSON(json) {
12
+ const segments = json._v
13
+ .split("/")
14
+ .map((segment) => AnalyticsPathSegment.fromString(segment));
15
+ return new AnalyticsPath(segments);
16
+ }
17
+ constructor(segments) {
18
+ this._segments = segments;
19
+ }
20
+ toJSON() {
21
+ return {
22
+ _t: AnalyticsSerializerTypes.AnalyticsPath,
23
+ _v: this.toString(),
24
+ };
25
+ }
26
+ toString(tail = "") {
27
+ return this._segments.map((s) => s.toString()).join("/") + tail;
28
+ }
29
+ firstSegment() {
30
+ return this._segments.length > 0
31
+ ? this._segments[0]
32
+ : new AnalyticsPathSegment();
33
+ }
34
+ reduce() {
35
+ const result = this._segments.slice(1);
36
+ if (result.length < 1) {
37
+ result.push(new AnalyticsPathSegment());
38
+ }
39
+ return new AnalyticsPath(result);
40
+ }
41
+ applyLod(levelOfDetail) {
42
+ const segments = [...this._segments];
43
+ while (segments.length < levelOfDetail) {
44
+ segments.push(new AnalyticsPathSegment());
45
+ }
46
+ return new AnalyticsPath(segments.slice(0, levelOfDetail));
47
+ }
48
+ }
49
+ export class AnalyticsPathSegment {
50
+ get filters() {
51
+ return this._filters;
52
+ }
53
+ get groups() {
54
+ return this._groups;
55
+ }
56
+ _filters = null;
57
+ _groups = null;
58
+ static fromString(segment) {
59
+ const elements = parseSeparatedList(segment, ":");
60
+ let filtersArg;
61
+ if (elements[0] === "*") {
62
+ filtersArg = null;
63
+ }
64
+ else {
65
+ filtersArg = parseSeparatedList(elements[0], ",").map((f) => AnalyticsPathSegment.unescape(f));
66
+ }
67
+ let groupsArg;
68
+ if (elements[1] === undefined || elements[1].length < 1) {
69
+ groupsArg = [];
70
+ }
71
+ else if (elements[1] === "*") {
72
+ groupsArg = null;
73
+ }
74
+ else {
75
+ groupsArg = parseSeparatedList(elements[1], ",").map((g) => AnalyticsPathSegment.unescape(g));
76
+ }
77
+ return new AnalyticsPathSegment(filtersArg, groupsArg);
78
+ }
79
+ static escape(segment) {
80
+ // Put a backslash in front of the control characters \ : / and ,
81
+ return segment.replace(/(\\|:|\/|,)/gi, "\\$1");
82
+ }
83
+ static unescape(segment) {
84
+ // Remove backslashes in front of any character
85
+ return segment.replace(/\\(.)/gi, "$1");
86
+ }
87
+ constructor(filters = null, groups = []) {
88
+ this._filters = filters;
89
+ this._groups = groups;
90
+ }
91
+ toJSON() {
92
+ return {
93
+ _t: AnalyticsSerializerTypes.AnalyticsPathSegment,
94
+ _v: this.toString(),
95
+ };
96
+ }
97
+ toString() {
98
+ let result = "";
99
+ if (this._filters === null) {
100
+ result += "*";
101
+ }
102
+ else {
103
+ result += this._filters
104
+ .map((f) => AnalyticsPathSegment.escape(f))
105
+ .join(",");
106
+ }
107
+ if (this._groups === null) {
108
+ result += ":*";
109
+ }
110
+ else if (this._groups.length > 0) {
111
+ result +=
112
+ ":" + this._groups.map((g) => AnalyticsPathSegment.escape(g)).join(",");
113
+ }
114
+ return result;
115
+ }
116
+ }
117
+ // Defining constant regexes instead of dynamic patterns for compiler optimization
118
+ const unescapedSeparatorPattern = {
119
+ ":": /(?<!\\):/,
120
+ ",": /(?<!\\),/,
121
+ "/": /(?<!\\)\//,
122
+ };
123
+ function parseSeparatedList(list, separator) {
124
+ /*
125
+ The basic mechanism is that we split the string by commas that
126
+ aren't escaped with a backslash, using the unescapedSeparatorPattern:
127
+
128
+ - abc,def becomes ['abc', 'def']
129
+ - abc\,def becomes ['abc,def']
130
+
131
+ However, we need to deal with an edge case where the backslash
132
+ itself is escaped with a backslash:
133
+
134
+ - abc\\,def must result in ['abc\\', 'def']
135
+ - whereas unescapedCommaPattern would result in ['abc\\,def']
136
+
137
+ For this edge case, we are first replacing all double backslashes with @@
138
+
139
+ - abc\\,def is first transformed to abc@@,def
140
+ - unescapedCommaPattern would now result in ['abc@@', 'def']
141
+ - substituting @@ with \\ again now gives the intended result ['abc\\', 'def']
142
+
143
+ However, we still want to support the literal string @@ in the input too.
144
+ So, instead of always using @@ as a replacement, we're going to determine a unique
145
+ string first by adding as many @ as needed.
146
+
147
+ - If the original string has @@ in it, we'll use @@@
148
+ - If the original string has @@ and @@@ in it, we'll use @@@@
149
+ - Etc.
150
+ */
151
+ let substituteString = "@@";
152
+ while (list.indexOf(substituteString) > -1) {
153
+ substituteString += "@";
154
+ }
155
+ return list
156
+ .replaceAll("\\\\", substituteString)
157
+ .split(unescapedSeparatorPattern[separator])
158
+ .map((e) => e.replaceAll(substituteString, "\\\\"));
159
+ }
160
+ //# sourceMappingURL=AnalyticsPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsPath.js","sourceRoot":"","sources":["../src/AnalyticsPath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export declare enum AnalyticsSerializerTypes {
2
+ AnalyticsPath = 0,
3
+ AnalyticsPathSegment = 1,
4
+ AnalyticsPeriod = 2
5
+ }
6
+ export declare enum AnalyticsPeriodType {
7
+ Year = 0,
8
+ Quarter = 1,
9
+ Month = 2
10
+ }
11
+ export declare class AnalyticsPeriod {
12
+ get type(): AnalyticsPeriodType;
13
+ get year(): number;
14
+ get quarter(): number | null;
15
+ get month(): number | null;
16
+ private _type;
17
+ private _year;
18
+ private _quarter;
19
+ private _month;
20
+ toJSON(): {
21
+ _t: AnalyticsSerializerTypes;
22
+ _v: string;
23
+ };
24
+ static fromString(period: string): AnalyticsPeriod;
25
+ static fillRange(p1: AnalyticsPeriod | string, p2: AnalyticsPeriod | string): AnalyticsPeriod[];
26
+ static normalizeQuarters(year: number, quarter: number): PeriodTriple;
27
+ static normalizeMonths(year: number, month: number): PeriodTriple;
28
+ constructor(year: number, quarter?: number, month?: number);
29
+ equals(period: AnalyticsPeriod | string): boolean;
30
+ toString(): string;
31
+ startAsSqlDate(): string;
32
+ comesAfter(period: AnalyticsPeriod): boolean;
33
+ comesBefore(period: AnalyticsPeriod): boolean;
34
+ contains(period: AnalyticsPeriod): boolean;
35
+ firstMonth(): AnalyticsPeriod;
36
+ lastMonth(): AnalyticsPeriod;
37
+ nextPeriod(n?: number): AnalyticsPeriod;
38
+ previousPeriod(n?: number): AnalyticsPeriod;
39
+ private _start;
40
+ private _end;
41
+ private _getNumericComparator;
42
+ private _addPeriods;
43
+ private _initAsYear;
44
+ private _initAsQuarter;
45
+ private _initAsMonth;
46
+ }
47
+ type PeriodTriple = [number, number | undefined, number | undefined];
48
+ export {};