Repository navigation
Expand file tree
/
Copy pathaccess.ts
More file actions
109 lines (101 loc) · 3.06 KB
/
Copy pathaccess.ts
File metadata and controls
109 lines (101 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import { validateExpression, type ExpressionReference } from "./expressions";
import type {
ModelDatabase,
Observation,
ObservationPoint,
ObservationSeries,
ProvenanceRecord,
ResolvedProvenanceRecord,
Transformation,
} from "./types";
export function observations(database: ModelDatabase): Observation[] {
return database.observationSeries.flatMap((series) =>
series.points.map((point) => resolveObservation(series, point)),
);
}
export function groupObservationSeries(items: Observation[]): ObservationSeries[] {
const groups = new Map<string, ObservationSeries>();
for (const observation of items) {
const key = JSON.stringify([
observation.modelId,
observation.metricId,
observation.entityId,
observation.asOf,
observation.versionId,
]);
let series = groups.get(key);
if (!series) {
series = {
modelId: observation.modelId,
metricId: observation.metricId,
entityId: observation.entityId,
asOf: observation.asOf,
versionId: observation.versionId,
points: [],
};
groups.set(key, series);
}
const {
modelId: _modelId,
metricId: _metricId,
entityId: _entityId,
asOf: _asOf,
versionId: _versionId,
...point
} = observation;
series.points.push(point);
}
return [...groups.values()];
}
export function resolveObservation(
series: ObservationSeries,
point: ObservationPoint,
): Observation {
const { points: _points, ...context } = series;
return { ...context, ...point };
}
export function findObservationPoint(
database: ModelDatabase,
observationId: string,
): { series: ObservationSeries; point: ObservationPoint } | undefined {
for (const series of database.observationSeries) {
const point = series.points.find((candidate) => candidate.id === observationId);
if (point) return { series, point };
}
return undefined;
}
export function transformationReferences(
transformation: Transformation,
): ExpressionReference[] {
if (transformation.status !== "supported") return [];
return validateExpression(transformation.expression).references;
}
export function transformationDependencyMetricIds(
transformation: Transformation,
): string[] {
return [...new Set(
transformationReferences(transformation).map((reference) => reference.metricId),
)].sort();
}
export function sourceExpressionFor(
transformation: Transformation,
periodId: string,
): string | undefined {
return transformation.sourceExpressions[periodId];
}
export function resolveProvenanceRecord(
database: ModelDatabase,
record: ProvenanceRecord,
): ResolvedProvenanceRecord {
const context = database.provenanceContexts.find(
(candidate) => candidate.id === record.contextId,
);
if (!context) throw new Error(`Unknown provenance context ${record.contextId}`);
return {
...record,
sourceArtifactId: context.sourceArtifactId,
extractionRunId: context.extractionRunId,
confidence: record.confidence ?? context.confidence,
reviewStatus: record.reviewStatus ?? context.reviewStatus,
};
}