@powerhousedao/analytics-engine-graphql 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,25 @@
1
+ import { AnalyticsQueryEngine } from "@powerhousedao/analytics-engine-core";
2
+ export type queryFilter = {
3
+ start?: Date;
4
+ end?: Date;
5
+ granularity?: string;
6
+ metrics: string[];
7
+ dimensions: [Record<string, string>];
8
+ currency?: string;
9
+ };
10
+ type CurrencyConversion = {
11
+ metric: string;
12
+ sourceCurrency: string;
13
+ };
14
+ type MultiCurrencyFilter = queryFilter & {
15
+ conversions: CurrencyConversion[];
16
+ };
17
+ export declare class AnalyticsModel {
18
+ readonly engine: AnalyticsQueryEngine;
19
+ constructor(engine: AnalyticsQueryEngine);
20
+ query(filter: queryFilter): Promise<import("@powerhousedao/analytics-engine-core").GroupedPeriodResults>;
21
+ multiCurrencyQuery(filter: MultiCurrencyFilter): Promise<import("@powerhousedao/analytics-engine-core").GroupedPeriodResults>;
22
+ getDimensions(): Promise<any>;
23
+ getCurrencies(): Promise<string[]>;
24
+ }
25
+ export {};
@@ -0,0 +1,128 @@
1
+ import { AnalyticsGranularity, AnalyticsPath, } from "@powerhousedao/analytics-engine-core";
2
+ import { DateTime } from "luxon";
3
+ export class AnalyticsModel {
4
+ engine;
5
+ constructor(engine) {
6
+ this.engine = engine;
7
+ //
8
+ }
9
+ async query(filter) {
10
+ if (!filter) {
11
+ return [];
12
+ }
13
+ const query = {
14
+ start: filter.start ? DateTime.fromJSDate(filter.start) : null,
15
+ end: filter.end ? DateTime.fromJSDate(filter.end) : null,
16
+ granularity: getGranularity(filter.granularity),
17
+ metrics: filter.metrics,
18
+ currency: getCurrency(filter.currency),
19
+ select: {},
20
+ lod: {},
21
+ };
22
+ if (query.start && !query.start.isValid) {
23
+ query.start = null;
24
+ }
25
+ if (query.end && !query.end.isValid) {
26
+ query.end = null;
27
+ }
28
+ if (filter.dimensions.length < 1) {
29
+ throw new Error("No dimensions provided");
30
+ }
31
+ else {
32
+ filter.dimensions.forEach((dimension) => {
33
+ query.select[dimension.name] = [
34
+ AnalyticsPath.fromString(dimension.select),
35
+ ];
36
+ query.lod[dimension.name] = Number(dimension.lod);
37
+ });
38
+ }
39
+ const results = await this.engine.execute(query);
40
+ return results;
41
+ // TODO: pull caching interface out into analytics module
42
+ //return measureAnalyticsQueryPerformance('analyticsQuery', 'analyticsQuery', query, false, "high");
43
+ }
44
+ async multiCurrencyQuery(filter) {
45
+ if (!filter) {
46
+ return [];
47
+ }
48
+ const query = {
49
+ start: filter.start ? DateTime.fromJSDate(filter.start) : null,
50
+ end: filter.end ? DateTime.fromJSDate(filter.end) : null,
51
+ granularity: getGranularity(filter.granularity),
52
+ metrics: filter.metrics,
53
+ currency: getCurrency(filter.currency),
54
+ select: {},
55
+ lod: {},
56
+ };
57
+ if (query.start && !query.start.isValid) {
58
+ query.start = null;
59
+ }
60
+ if (query.end && !query.end.isValid) {
61
+ query.end = null;
62
+ }
63
+ if (filter.dimensions.length < 1) {
64
+ throw new Error("No dimensions provided");
65
+ }
66
+ else {
67
+ filter.dimensions.forEach((dimension) => {
68
+ query.select[dimension.name] = [
69
+ AnalyticsPath.fromString(dimension.select),
70
+ ];
71
+ query.lod[dimension.name] = Number(dimension.lod);
72
+ });
73
+ }
74
+ return this.engine.executeMultiCurrency(query, {
75
+ targetCurrency: query.currency,
76
+ conversions: filter.conversions.map((c) => {
77
+ return {
78
+ metric: c.metric,
79
+ currency: getCurrency(c.sourceCurrency),
80
+ };
81
+ }),
82
+ });
83
+ }
84
+ async getDimensions() {
85
+ return await this.engine.getDimensions();
86
+ }
87
+ async getCurrencies() {
88
+ // todo: use knex inside of the analytics engine to select distinct currencies
89
+ return ["DAI", "FTE", "MKR", "USDC", "USDP", "USDT"];
90
+ }
91
+ }
92
+ const getGranularity = (granularity) => {
93
+ switch (granularity) {
94
+ case "hourly": {
95
+ return AnalyticsGranularity.Hourly;
96
+ }
97
+ case "daily": {
98
+ return AnalyticsGranularity.Daily;
99
+ }
100
+ case "weekly": {
101
+ return AnalyticsGranularity.Weekly;
102
+ }
103
+ case "monthly": {
104
+ return AnalyticsGranularity.Monthly;
105
+ }
106
+ case "quarterly": {
107
+ return AnalyticsGranularity.Quarterly;
108
+ }
109
+ case "semiAnnual": {
110
+ return AnalyticsGranularity.SemiAnnual;
111
+ }
112
+ case "annual": {
113
+ return AnalyticsGranularity.Annual;
114
+ }
115
+ case "total": {
116
+ return AnalyticsGranularity.Total;
117
+ }
118
+ default: {
119
+ return AnalyticsGranularity.Total;
120
+ }
121
+ }
122
+ };
123
+ const getCurrency = (currency) => {
124
+ return currency
125
+ ? AnalyticsPath.fromString(currency)
126
+ : AnalyticsPath.fromString("");
127
+ };
128
+ //# sourceMappingURL=AnalyticsModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsModel.js","sourceRoot":"","sources":["../src/AnalyticsModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const AnalyticsResolvers: any;
@@ -0,0 +1,60 @@
1
+ export const AnalyticsResolvers = {
2
+ Query: {
3
+ analytics: (_, __, { dataSources }) => {
4
+ return {};
5
+ },
6
+ },
7
+ AnalyticsQuery: {
8
+ series: async (parent, { filter }, { dataSources }) => {
9
+ const queryEngine = dataSources.db.Analytics;
10
+ const results = await queryEngine.query(filter);
11
+ return results.map((s) => ({
12
+ ...s,
13
+ rows: s.rows.map((r) => ({
14
+ ...r,
15
+ dimensions: Object.keys(r.dimensions).map((d) => ({
16
+ name: d,
17
+ path: r.dimensions[d]["path"],
18
+ icon: r.dimensions[d]["icon"],
19
+ label: r.dimensions[d]["label"],
20
+ description: r.dimensions[d]["description"],
21
+ })),
22
+ })),
23
+ }));
24
+ },
25
+ metrics: async (parent, { filter }, { dataSources }) => {
26
+ return [
27
+ "Budget",
28
+ "Forecast",
29
+ "Actuals",
30
+ "PaymentsOnChain",
31
+ "PaymentsOffChainIncluded",
32
+ ];
33
+ },
34
+ dimensions: async (_, { filter }, { dataSources }) => {
35
+ const queryEngine = dataSources.db.Analytics;
36
+ return await queryEngine.getDimensions();
37
+ },
38
+ currencies: async (_, { filter }, { dataSources }) => {
39
+ return ["MKR", "DAI"];
40
+ },
41
+ multiCurrencySeries: async (_, { filter }, { dataSources }) => {
42
+ const queryEngine = dataSources.db.Analytics;
43
+ const results = await queryEngine.multiCurrencyQuery(filter);
44
+ return results.map((s) => ({
45
+ ...s,
46
+ rows: s.rows.map((r) => ({
47
+ ...r,
48
+ dimensions: Object.keys(r.dimensions).map((d) => ({
49
+ name: d,
50
+ path: r.dimensions[d]["path"],
51
+ icon: r.dimensions[d]["icon"],
52
+ label: r.dimensions[d]["label"],
53
+ description: r.dimensions[d]["description"],
54
+ })),
55
+ })),
56
+ }));
57
+ },
58
+ },
59
+ };
60
+ //# sourceMappingURL=AnalyticsResolvers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsResolvers.js","sourceRoot":"","sources":["../src/AnalyticsResolvers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { AnalyticsResolvers } from "./AnalyticsResolvers";
2
+ export type { queryFilter, AnalyticsModel } from "./AnalyticsModel";
3
+ export { typedefs } from "./schema";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { AnalyticsResolvers } from "./AnalyticsResolvers";
2
+ export { typedefs } from "./schema";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const typedefs = "\ntype AnalyticsQuery {\n series(filter: AnalyticsFilter): [AnalyticsPeriod]\n multiCurrencySeries(filter: MultiCurrencyConversions): [AnalyticsPeriod]\n metrics: [String]\n dimensions: [Dimension]\n currencies: [String]\n}\n\ntype AnalyticsPeriod {\n period: String\n start: DateTime\n end: DateTime\n rows: [AnalyticsSeries]\n}\n\ntype AnalyticsSeries {\n dimensions: [AnalyticsSeriesDimension]\n metric: String\n unit: String\n value: Float\n sum: Float\n}\n\ntype AnalyticsSeriesDimension {\n name: String\n path: String\n label: String\n description: String\n icon: String\n}\n\ntype Dimension {\n name: String\n values: [Value]\n}\n\ntype Value {\n path: String\n label: String\n description: String\n icon: String\n}\n\nenum AnalyticsGranularity {\n hourly\n daily\n weekly\n monthly\n quarterly\n semiAnnual\n annual\n total\n}\n\ninput AnalyticsFilterDimension {\n name: String!\n select: String!\n lod: Int!\n}\n\ninput MultiCurrencyConversions {\n start: String\n end: String\n \"Period to group by\"\n granularity: AnalyticsGranularity\n \"List of metrics to filter by, such as 'budget' or 'actuals'\"\n metrics: [String]\n \"List of dimensions to filter by, such as 'budget' or 'project'\"\n dimensions: [AnalyticsFilterDimension]\n currency: String\n conversions: [CurrencyConversion]!\n}\n\ninput CurrencyConversion {\n metric: String!\n sourceCurrency: String!\n}\n\ninput AnalyticsFilter {\n start: String\n end: String\n \"Period to group by\"\n granularity: AnalyticsGranularity\n \"List of metrics to filter by, such as 'budget' or 'actuals'\"\n metrics: [String]\n \"List of dimensions to filter by, such as 'budget' or 'project'\"\n dimensions: [AnalyticsFilterDimension]\n currency: String\n}\n\nextend type Query {\n analytics: AnalyticsQuery\n}\n";
package/dist/schema.js ADDED
@@ -0,0 +1,96 @@
1
+ export const typedefs = `
2
+ type AnalyticsQuery {
3
+ series(filter: AnalyticsFilter): [AnalyticsPeriod]
4
+ multiCurrencySeries(filter: MultiCurrencyConversions): [AnalyticsPeriod]
5
+ metrics: [String]
6
+ dimensions: [Dimension]
7
+ currencies: [String]
8
+ }
9
+
10
+ type AnalyticsPeriod {
11
+ period: String
12
+ start: DateTime
13
+ end: DateTime
14
+ rows: [AnalyticsSeries]
15
+ }
16
+
17
+ type AnalyticsSeries {
18
+ dimensions: [AnalyticsSeriesDimension]
19
+ metric: String
20
+ unit: String
21
+ value: Float
22
+ sum: Float
23
+ }
24
+
25
+ type AnalyticsSeriesDimension {
26
+ name: String
27
+ path: String
28
+ label: String
29
+ description: String
30
+ icon: String
31
+ }
32
+
33
+ type Dimension {
34
+ name: String
35
+ values: [Value]
36
+ }
37
+
38
+ type Value {
39
+ path: String
40
+ label: String
41
+ description: String
42
+ icon: String
43
+ }
44
+
45
+ enum AnalyticsGranularity {
46
+ hourly
47
+ daily
48
+ weekly
49
+ monthly
50
+ quarterly
51
+ semiAnnual
52
+ annual
53
+ total
54
+ }
55
+
56
+ input AnalyticsFilterDimension {
57
+ name: String!
58
+ select: String!
59
+ lod: Int!
60
+ }
61
+
62
+ input MultiCurrencyConversions {
63
+ start: String
64
+ end: String
65
+ "Period to group by"
66
+ granularity: AnalyticsGranularity
67
+ "List of metrics to filter by, such as 'budget' or 'actuals'"
68
+ metrics: [String]
69
+ "List of dimensions to filter by, such as 'budget' or 'project'"
70
+ dimensions: [AnalyticsFilterDimension]
71
+ currency: String
72
+ conversions: [CurrencyConversion]!
73
+ }
74
+
75
+ input CurrencyConversion {
76
+ metric: String!
77
+ sourceCurrency: String!
78
+ }
79
+
80
+ input AnalyticsFilter {
81
+ start: String
82
+ end: String
83
+ "Period to group by"
84
+ granularity: AnalyticsGranularity
85
+ "List of metrics to filter by, such as 'budget' or 'actuals'"
86
+ metrics: [String]
87
+ "List of dimensions to filter by, such as 'budget' or 'project'"
88
+ dimensions: [AnalyticsFilterDimension]
89
+ currency: String
90
+ }
91
+
92
+ extend type Query {
93
+ analytics: AnalyticsQuery
94
+ }
95
+ `;
96
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FvB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@powerhousedao/analytics-engine-graphql",
3
+ "version": "0.1.0",
4
+ "license": "AGPL-3.0-only",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "dev": "tsc-watch",
13
+ "build": "rm -rf dist/ && tsc",
14
+ "test": "vitest"
15
+ },
16
+ "dependencies": {
17
+ "@powerhousedao/analytics-engine-core": "^0.3.0",
18
+ "luxon": "^3.5.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/luxon": "^3.4.2",
22
+ "tsc-watch": "^6.2.0",
23
+ "typescript": "^5.6.3",
24
+ "vitest": "^2.1.3"
25
+ }
26
+ }