import type { AgDataType } from '../../api/agDataType'; import type { AgCalculatedColumn, AgColumn, AgFieldIdentifier, AgMeasure } from '../../api/agField'; import type { AgFieldCardinality, AgFieldDataAccessor } from '../../api/agFieldDefinition'; import type { Fieldset } from '../schema/fieldset'; import type { CompiledExpression } from '../query/compiler'; export interface BaseDataField { externalId: string; fieldsetId: string; cardinality: AgFieldCardinality; accessor: AgFieldDataAccessor; } export interface ColumnDataField extends AgColumn, BaseDataField { } export interface CalculatedColumnDataField extends AgCalculatedColumn, BaseDataField { compiledExpression: CompiledExpression; } export interface MeasureDataField extends AgMeasure, BaseDataField { compiledExpression: CompiledExpression; } export type DataField = ColumnDataField | CalculatedColumnDataField | MeasureDataField; export type DataFields = Record; export interface DataFieldset extends Fieldset { fields: DataFields; /** * Map-based mirror of `fields` for hot-path lookups. Populated alongside * the Record at fieldset construction and kept in sync by the sanitiser. * V8 megamorphic-IC protection: dynamic-key access on `fields[fieldId]` * goes megamorphic once >4 distinct field IDs flow through one call site; * `fieldsById.get(fieldId)` stays monomorphic regardless of cardinality. * Iteration sites (`Object.values(fieldset.fields)`, etc.) continue to * use the Record — this Map exists solely for per-field lookups. */ fieldsById: Map; }