import { LogicalDataset, PlannerCapabilities } from "gscdump/query/plan"; import { SQL } from "drizzle-orm"; import { Dimension, InternalFilter, Metric } from "gscdump/query"; interface ResolverAdapter { readonly METRIC_NAMES: readonly Metric[]; readonly capabilities: PlannerCapabilities; readonly schema: Record; tableKeyForDataset: (dataset: LogicalDataset) => TableKey; inferTable: (dimensions: Dimension[], filterDims?: Dimension[]) => TableKey; dimColumn: (dim: Dimension, tableKey: TableKey) => string; isMetricDimension: (dim: string) => dim is Metric; tableRef: (tableKey: TableKey) => SQL; fromSql: (tableKey: TableKey, options?: { queryCanonical?: boolean; }) => SQL; dateColRef: (tableKey: TableKey) => SQL; urlToPathExpr: (col: string) => string; siteIdColRef?: (tableKey: TableKey) => SQL; searchTypeColRef?: (tableKey: TableKey) => SQL; dimExprSql: (dim: Dimension, tableKey: TableKey) => SQL; metricSql: (metric: Metric, tableKey: TableKey) => SQL; dimensionPredicates: (filters: InternalFilter[], tableKey: TableKey) => SQL[]; havingPredicates: (filters: InternalFilter[], tableKey: TableKey) => SQL[]; prefilterPredicates: (filters: InternalFilter[], tableKey: TableKey) => SQL[]; topLevelPredicate: (filters: InternalFilter[], tableKey: TableKey) => SQL | undefined; compile: (query: SQL) => { sql: string; params: unknown[]; }; } type ComparisonFilter = 'new' | 'lost' | 'improving' | 'declining'; interface ResolverOptions { adapter: ResolverAdapter; /** Optional site scope. Required for multi-tenant D1; omitted for parquet. */ siteId?: string | number; /** * Optional searchType scope. Required for multi-tenant Iceberg; omitted for * parquet. `number` is the int-encoded code (`SEARCH_TYPE_INT`) for catalogs * whose `search_type` partition column is INT — bound bare (unquoted) so the * int partition prunes; `string` for the default string-encoded catalogs. */ searchType?: string | number; /** * Optional non-comparison scan guard. When set, direct row/totals queries * add `impressions >= value` before aggregation. This can materially reduce * stored-row reads because zero-impression long-tail rows contribute * nothing to metric aggregates. Comparison SQL deliberately ignores it so * `lost`/`declining` rows remain observable. */ minimumImpressions?: number; } interface ResolvedSQL { sql: string; params: unknown[]; countSql: string; countParams: unknown[]; } interface ResolvedSQLOptimized { sql: string; params: unknown[]; } interface ResolvedComparisonSQL { sql: string; params: unknown[]; countSql: string; countParams: unknown[]; } interface ExtraQuery { key: string; sql: string; params: unknown[]; } export { ComparisonFilter, ExtraQuery, ResolvedComparisonSQL, ResolvedSQL, ResolvedSQLOptimized, ResolverAdapter, ResolverOptions };