{"version":3,"sources":["../src/indexes/compiler.ts"],"names":["validateNodeIndexKeyContract","getDialect","getNodeScopeColumns","sql","parseNodeIndexKeyDirection","validateEdgeIndexKeysPresence","jsonPointer"],"mappings":"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","file":"chunk-RXL6R4AI.cjs","sourcesContent":["import { type ValueType } from \"../query/ast\";\nimport { getDialect } from \"../query/dialect\";\nimport { type SqlDialect } from \"../query/dialect/types\";\nimport { type JsonPointer, jsonPointer } from \"../query/json-pointer\";\nimport { sql, type SqlFragment } from \"../query/sql-fragment\";\nimport {\n  getNodeScopeColumns,\n  parseNodeIndexKeyDirection,\n  validateEdgeIndexKeysPresence,\n  validateNodeIndexKeyContract,\n} from \"./node-key-contract\";\nimport {\n  type EdgeIndexDeclaration,\n  type IndexWhereExpression,\n  type IndexWhereLiteral,\n  type IndexWhereOp,\n  type IndexWhereOperand,\n  type NodeIndexDeclaration,\n  type SystemColumnName,\n} from \"./types\";\n\n// ============================================================\n// Public Types\n// ============================================================\n\nexport type IndexCompilationContext = Readonly<{\n  dialect: SqlDialect;\n  propsColumn: SqlFragment;\n  systemColumn: (column: SystemColumnName) => SqlFragment;\n}>;\n\ntype CompiledIndexKeys = Readonly<{\n  /** SQL expressions in index key order */\n  keys: readonly SqlFragment[];\n}>;\n\n// ============================================================\n// Index Key Compilation\n// ============================================================\n\nexport function compileNodeIndexKeys(\n  index: NodeIndexDeclaration,\n  dialect: SqlDialect,\n  propsColumn: SqlFragment,\n  systemColumn: (column: SystemColumnName) => SqlFragment,\n): CompiledIndexKeys {\n  if (index.keys !== undefined) {\n    const contractError = validateNodeIndexKeyContract({\n      keys: index.keys,\n      fields: index.fields,\n      coveringFields: index.coveringFields,\n      keySystemColumns: index.keySystemColumns,\n      unique: index.unique,\n      scope: index.scope,\n      method: index.method,\n    })[0];\n    if (contractError !== undefined) throw new Error(contractError);\n  }\n  const adapter = getDialect(dialect);\n  const keys: SqlFragment[] = [];\n\n  const systemColumns = [\n    ...getNodeScopeColumns(index.scope),\n    ...(index.keySystemColumns ?? []),\n  ];\n  for (const column of systemColumns) {\n    keys.push(systemColumn(column));\n  }\n\n  for (const key of index.keys ?? []) {\n    const direction = compileIndexKeyDirection(key.direction);\n    if (key.type === \"system\") {\n      keys.push(sql`${systemColumn(key.column)} ${direction}`);\n      continue;\n    }\n    const extracted = compileIndexKeyValue(\n      adapter,\n      propsColumn,\n      key.pointer,\n      key.valueType,\n    );\n    keys.push(sql`(${extracted}) ${direction}`);\n  }\n\n  const allPointers = [...index.fields, ...index.coveringFields];\n  const allValueTypes = [\n    ...index.fieldValueTypes,\n    ...index.coveringFieldValueTypes,\n  ];\n\n  for (const [pointerIndex, pointer] of allPointers.entries()) {\n    const valueType = allValueTypes[pointerIndex];\n    const extracted = compileIndexKeyValue(\n      adapter,\n      propsColumn,\n      pointer,\n      valueType,\n    );\n    keys.push(sql`(${extracted})`);\n  }\n\n  return { keys };\n}\n\nfunction compileIndexKeyDirection(direction: unknown): SqlFragment {\n  const parsed = parseNodeIndexKeyDirection(direction);\n  if (parsed === undefined) {\n    throw new Error(`Invalid index key direction: ${String(direction)}`);\n  }\n  return parsed === \"asc\" ? sql.raw(\"ASC\") : sql.raw(\"DESC\");\n}\n\nexport function compileEdgeIndexKeys(\n  index: EdgeIndexDeclaration,\n  dialect: SqlDialect,\n  propsColumn: SqlFragment,\n  systemColumn: (column: SystemColumnName) => SqlFragment,\n): CompiledIndexKeys {\n  const edgeKeyError = validateEdgeIndexKeysPresence(index);\n  if (edgeKeyError !== undefined) throw new Error(edgeKeyError);\n  const adapter = getDialect(dialect);\n  const keys: SqlFragment[] = [];\n\n  for (const column of getEdgeScopeColumns(index.scope, index.direction)) {\n    keys.push(systemColumn(column));\n  }\n\n  const allPointers = [...index.fields, ...index.coveringFields];\n  const allValueTypes = [\n    ...index.fieldValueTypes,\n    ...index.coveringFieldValueTypes,\n  ];\n\n  for (const [pointerIndex, pointer] of allPointers.entries()) {\n    const valueType = allValueTypes[pointerIndex];\n    const extracted = compileIndexKeyValue(\n      adapter,\n      propsColumn,\n      pointer,\n      valueType,\n    );\n    keys.push(sql`(${extracted})`);\n  }\n\n  return { keys };\n}\n\n/**\n * Compiles the per-field key-extraction expressions for a node index's\n * **lookup keys** — `index.fields` only, excluding scope columns and\n * `coveringFields` (which are index payload, not part of the lookup key).\n *\n * Each expression is the exact extraction the index DDL builds for that\n * field (via the shared {@link compileIndexKeyValue}), so a runtime lookup\n * predicate stays byte-identical to the materialized index expression —\n * the single source of truth that lets the planner use the physical index.\n */\nexport function compileNodeIndexFieldKeys(\n  index: NodeIndexDeclaration,\n  ctx: IndexCompilationContext,\n): readonly SqlFragment[] {\n  const adapter = getDialect(ctx.dialect);\n  const keys: SqlFragment[] = [];\n  for (const [position, pointer] of index.fields.entries()) {\n    const extracted = compileIndexKeyValue(\n      adapter,\n      ctx.propsColumn,\n      pointer,\n      index.fieldValueTypes[position],\n    );\n    keys.push(sql`(${extracted})`);\n  }\n  return keys;\n}\n\nfunction compileIndexKeyValue(\n  dialect: ReturnType<typeof getDialect>,\n  propsColumn: SqlFragment,\n  pointer: JsonPointer,\n  valueType: ValueType | undefined,\n): SqlFragment {\n  switch (valueType) {\n    case \"number\": {\n      return dialect.jsonExtractNumber(propsColumn, pointer);\n    }\n    case \"boolean\": {\n      return dialect.jsonExtractBoolean(propsColumn, pointer);\n    }\n    case \"date\": {\n      return dialect.jsonExtractDate(propsColumn, pointer);\n    }\n    case \"string\":\n    case \"unknown\":\n    case undefined: {\n      return dialect.jsonExtractText(propsColumn, pointer);\n    }\n    case \"array\":\n    case \"object\":\n    case \"embedding\": {\n      // For advanced index types (GIN/json), callers should use dialect.jsonExtract\n      // or index the props column directly. We keep this as a conservative fallback.\n      return dialect.jsonExtract(propsColumn, pointer);\n    }\n  }\n}\n\nfunction getEdgeScopeColumns(\n  scope: EdgeIndexDeclaration[\"scope\"],\n  direction: EdgeIndexDeclaration[\"direction\"],\n): readonly SystemColumnName[] {\n  const base =\n    scope === \"graphAndKind\" ? ([\"graph_id\", \"kind\"] as const)\n    : scope === \"graph\" ? ([\"graph_id\"] as const)\n    : ([] as const);\n\n  if (direction === \"out\") {\n    return [...base, \"from_id\"];\n  }\n  if (direction === \"in\") {\n    return [...base, \"to_id\"];\n  }\n  return [...base];\n}\n\n// ============================================================\n// WHERE Clause Compilation\n// ============================================================\n\nfunction isIndexWhereLiteralList(\n  value: IndexWhereLiteral | readonly IndexWhereLiteral[],\n): value is readonly IndexWhereLiteral[] {\n  return Array.isArray(value);\n}\n\nexport function compileIndexWhere(\n  ctx: IndexCompilationContext,\n  expression: IndexWhereExpression,\n): SqlFragment {\n  switch (expression.__type) {\n    case \"index_where_and\": {\n      return sql`(${sql.join(\n        expression.predicates.map((p) => compileIndexWhere(ctx, p)),\n        sql` AND `,\n      )})`;\n    }\n    case \"index_where_or\": {\n      return sql`(${sql.join(\n        expression.predicates.map((p) => compileIndexWhere(ctx, p)),\n        sql` OR `,\n      )})`;\n    }\n    case \"index_where_not\": {\n      return sql`(NOT ${compileIndexWhere(ctx, expression.predicate)})`;\n    }\n    case \"index_where_null_check\": {\n      const operand = compileIndexWhereOperand(ctx, expression.operand);\n      return expression.op === \"isNull\" ?\n          sql`${operand} IS NULL`\n        : sql`${operand} IS NOT NULL`;\n    }\n    case \"index_where_comparison\": {\n      const left = compileIndexWhereOperand(ctx, expression.left);\n\n      const right = expression.right;\n      if (isIndexWhereLiteralList(right)) {\n        if (expression.op !== \"in\" && expression.op !== \"notIn\") {\n          throw new Error(\n            `Operator \"${expression.op}\" does not support list comparison in index WHERE clause`,\n          );\n        }\n        const values = right.map((literal) =>\n          compileIndexWhereLiteral(ctx.dialect, literal),\n        );\n        const operator = expression.op === \"in\" ? sql`IN` : sql`NOT IN`;\n        return sql`${left} ${operator} (${sql.join(values, sql`, `)})`;\n      }\n\n      if (expression.op === \"in\" || expression.op === \"notIn\") {\n        throw new Error(\n          `Operator \"${expression.op}\" requires a list of values in index WHERE clause`,\n        );\n      }\n\n      const rightLiteral = compileIndexWhereLiteral(ctx.dialect, right);\n      const opSql = compileComparisonOperator(expression.op);\n      return sql`${left} ${opSql} ${rightLiteral}`;\n    }\n  }\n}\n\nfunction compileIndexWhereOperand(\n  ctx: IndexCompilationContext,\n  operand: IndexWhereOperand,\n): SqlFragment {\n  if (operand.__type === \"index_operand_system\") {\n    return ctx.systemColumn(operand.column);\n  }\n\n  const adapter = getDialect(ctx.dialect);\n  const pointer = jsonPointer([operand.field]);\n\n  switch (operand.valueType) {\n    case \"number\": {\n      return adapter.jsonExtractNumber(ctx.propsColumn, pointer);\n    }\n    case \"boolean\": {\n      return adapter.jsonExtractBoolean(ctx.propsColumn, pointer);\n    }\n    case \"date\": {\n      return adapter.jsonExtractDate(ctx.propsColumn, pointer);\n    }\n    case \"array\":\n    case \"object\":\n    case \"embedding\": {\n      return adapter.jsonExtract(ctx.propsColumn, pointer);\n    }\n    case \"string\":\n    case \"unknown\":\n    case undefined: {\n      return adapter.jsonExtractText(ctx.propsColumn, pointer);\n    }\n  }\n}\n\nfunction compileIndexWhereLiteral(\n  dialect: SqlDialect,\n  literal: IndexWhereLiteral,\n): SqlFragment {\n  switch (literal.valueType) {\n    case \"string\":\n    case \"date\": {\n      return sql.raw(escapeStringLiteral(literal.value.toString()));\n    }\n    case \"number\": {\n      return sql.raw(literal.value.toString());\n    }\n    case \"boolean\": {\n      return getDialect(dialect).booleanLiteral(literal.value as boolean);\n    }\n    case \"array\":\n    case \"object\":\n    case \"embedding\":\n    case \"unknown\": {\n      return sql.raw(escapeStringLiteral(literal.value.toString()));\n    }\n  }\n}\n\ntype ComparisonIndexWhereOp = Exclude<IndexWhereOp, \"in\" | \"notIn\">;\n\nfunction compileComparisonOperator(op: ComparisonIndexWhereOp): SqlFragment {\n  switch (op) {\n    case \"eq\": {\n      return sql`=`;\n    }\n    case \"neq\": {\n      return sql`<>`;\n    }\n    case \"gt\": {\n      return sql`>`;\n    }\n    case \"gte\": {\n      return sql`>=`;\n    }\n    case \"lt\": {\n      return sql`<`;\n    }\n    case \"lte\": {\n      return sql`<=`;\n    }\n  }\n}\n\nfunction escapeStringLiteral(value: string): string {\n  return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n"]}