core/analyzers/schema.analyzer.ts
core/analyzers/schema.analyzer.ts is a file in GovLab Patterns. 31 lines of code and 6 definitions.
import { DataLoadError } from "#core/classifiers/schema.classifier";
import { FieldAccumulator } from "#core/aggregators/field.aggregator";
import type { FieldSchema } from "#types/schema.types";
import { isRecord } from "#core/predicates/record.predicate";
import { notAnObject } from "#configuration/strings/schema.strings";
const accumulatorFor = function accumulatorFor(fields: Map<string, FieldAccumulator>, key: string): FieldAccumulator {
const existing = fields.get(key);
if (existing) {
return existing;
}
const created = new FieldAccumulator();
fields.set(key, created);
return created;
};
export const detectSchema = function detectSchema(
records: Iterable<unknown>,
floatFields: ReadonlySet<string> = new Set(),
): FieldSchema[] {
const fields = new Map<string, FieldAccumulator>();
let count = 0;
for (const record of records) {
if (!isRecord(record)) {
throw new DataLoadError(notAnObject(JSON.stringify(record)));
}
count += 1;
for (const [key, value] of Object.entries(record)) {
accumulatorFor(fields, key).observe(value, floatFields.has(key));
}
}
return [...fields.entries()].map(([name, accumulator]) => accumulator.result(name, count));
};