export type RowInclude = 'all' | 'matched' | 'unmatched'; export type EmptyValuesBehavior = 'include' | 'exclude'; /** * Field-level configuration options. * These control how fields behave within join operations and data presentation. */ export interface QueryFieldConfig { /** * How rows should be included when this field comes from a table being joined: * - `'matched'`: Only rows that match the join condition (inner join semantics) * - `'all'`: All rows from this table, even unmatched ones (left/right/full outer join semantics) * - `'unmatched'`: Only rows that don't match (anti-join semantics) * * When multiple fields from the same source have different rowInclude values, * the join type is determined by combining them during query planning. * * @example * 'employees.name' with rowInclude: 'all' means "show all employees, even those without departments" */ rowInclude?: RowInclude; /** * How empty/null values should be handled: * - `'include'`: Show null values (as empty cells in grids) * - `'exclude'`: Hide rows with null values for this field * * Applied after the join operation. */ emptyValues?: EmptyValuesBehavior; } /** * Map of field configurations for a specific widget. * Key is the field identifier (e.g., 'employees.name'), value is the configuration. */ export type QueryFieldConfigMap = Record;