{"version":3,"file":"basic-index.cjs","sources":["../../../src/indexes/basic-index.ts"],"sourcesContent":["import { defaultComparator, normalizeValue } from '../utils/comparison.js'\nimport {\n  deleteInSortedArray,\n  findInsertPositionInArray,\n} from '../utils/array-utils.js'\nimport { BaseIndex } from './base-index.js'\nimport type { CompareOptions } from '../query/builder/types.js'\nimport type { BasicExpression } from '../query/ir.js'\nimport type { IndexOperation } from './base-index.js'\n\n/**\n * Options for range queries\n */\nexport interface RangeQueryOptions {\n  from?: any\n  to?: any\n  fromInclusive?: boolean\n  toInclusive?: boolean\n}\n\n/**\n * Options for Basic index\n */\nexport interface BasicIndexOptions {\n  compareFn?: (a: any, b: any) => number\n  compareOptions?: CompareOptions\n}\n\n/**\n * Basic index using Map + sorted Array.\n *\n * - Map for O(1) equality lookups\n * - Sorted Array for O(log n) range queries via binary search\n * - O(n) updates to maintain sort order\n *\n * Simpler and smaller than BTreeIndex, good for read-heavy workloads.\n * Use BTreeIndex for write-heavy workloads with large collections.\n */\nexport class BasicIndex<\n  TKey extends string | number = string | number,\n> extends BaseIndex<TKey> {\n  public readonly supportedOperations = new Set<IndexOperation>([\n    `eq`,\n    `gt`,\n    `gte`,\n    `lt`,\n    `lte`,\n    `in`,\n  ])\n\n  // Map for O(1) equality lookups: indexedValue -> Set of PKs\n  private valueMap = new Map<any, Set<TKey>>()\n  // Sorted array of unique indexed values for range queries\n  private sortedValues: Array<any> = []\n  // Set of all indexed PKs\n  private indexedKeys = new Set<TKey>()\n  // Comparator function\n  private compareFn: (a: any, b: any) => number = defaultComparator\n\n  constructor(\n    id: number,\n    expression: BasicExpression,\n    name?: string,\n    options?: any,\n  ) {\n    super(id, expression, name, options)\n    this.compareFn = options?.compareFn ?? defaultComparator\n    if (options?.compareOptions) {\n      this.compareOptions = options!.compareOptions\n    }\n  }\n\n  protected initialize(_options?: BasicIndexOptions): void {}\n\n  /**\n   * Adds a value to the index\n   */\n  add(key: TKey, item: any): void {\n    let indexedValue: any\n    try {\n      indexedValue = this.evaluateIndexExpression(item)\n    } catch (error) {\n      throw new Error(\n        `Failed to evaluate index expression for key ${key}: ${error}`,\n        { cause: error },\n      )\n    }\n\n    const normalizedValue = normalizeValue(indexedValue)\n\n    if (this.valueMap.has(normalizedValue)) {\n      // Value already exists, just add the key to the set\n      this.valueMap.get(normalizedValue)!.add(key)\n    } else {\n      // New value - add to map and insert into sorted array\n      this.valueMap.set(normalizedValue, new Set([key]))\n\n      // Insert into sorted position\n      const insertIdx = findInsertPositionInArray(\n        this.sortedValues,\n        normalizedValue,\n        this.compareFn,\n      )\n      this.sortedValues.splice(insertIdx, 0, normalizedValue)\n    }\n\n    this.indexedKeys.add(key)\n    this.updateTimestamp()\n  }\n\n  /**\n   * Removes a value from the index\n   */\n  remove(key: TKey, item: any): void {\n    let indexedValue: any\n    try {\n      indexedValue = this.evaluateIndexExpression(item)\n    } catch (error) {\n      console.warn(\n        `Failed to evaluate index expression for key ${key} during removal:`,\n        error,\n      )\n      this.indexedKeys.delete(key)\n      this.updateTimestamp()\n      return\n    }\n\n    const normalizedValue = normalizeValue(indexedValue)\n\n    if (this.valueMap.has(normalizedValue)) {\n      const keySet = this.valueMap.get(normalizedValue)!\n      keySet.delete(key)\n\n      if (keySet.size === 0) {\n        // No more keys for this value, remove from map and sorted array\n        this.valueMap.delete(normalizedValue)\n        deleteInSortedArray(this.sortedValues, normalizedValue, this.compareFn)\n      }\n    }\n\n    this.indexedKeys.delete(key)\n    this.updateTimestamp()\n  }\n\n  /**\n   * Updates a value in the index\n   */\n  update(key: TKey, oldItem: any, newItem: any): void {\n    this.remove(key, oldItem)\n    this.add(key, newItem)\n  }\n\n  /**\n   * Builds the index from a collection of entries\n   */\n  build(entries: Iterable<[TKey, any]>): void {\n    this.clear()\n\n    // Collect all entries first\n    const entriesArray: Array<{ key: TKey; value: any }> = []\n    for (const [key, item] of entries) {\n      let indexedValue: any\n      try {\n        indexedValue = this.evaluateIndexExpression(item)\n      } catch (error) {\n        throw new Error(\n          `Failed to evaluate index expression for key ${key}: ${error}`,\n          { cause: error },\n        )\n      }\n      entriesArray.push({ key, value: normalizeValue(indexedValue) })\n      this.indexedKeys.add(key)\n    }\n\n    // Group by value\n    for (const { key, value } of entriesArray) {\n      if (this.valueMap.has(value)) {\n        this.valueMap.get(value)!.add(key)\n      } else {\n        this.valueMap.set(value, new Set([key]))\n      }\n    }\n\n    // Build sorted array from unique values\n    this.sortedValues = Array.from(this.valueMap.keys()).sort(this.compareFn)\n\n    this.updateTimestamp()\n  }\n\n  /**\n   * Clears all data from the index\n   */\n  clear(): void {\n    this.valueMap.clear()\n    this.sortedValues = []\n    this.indexedKeys.clear()\n    this.updateTimestamp()\n  }\n\n  /**\n   * Performs a lookup operation\n   */\n  lookup(operation: IndexOperation, value: any): Set<TKey> {\n    const startTime = performance.now()\n\n    let result: Set<TKey>\n\n    switch (operation) {\n      case `eq`:\n        result = this.equalityLookup(value)\n        break\n      case `gt`:\n        result = this.rangeQuery({ from: value, fromInclusive: false })\n        break\n      case `gte`:\n        result = this.rangeQuery({ from: value, fromInclusive: true })\n        break\n      case `lt`:\n        result = this.rangeQuery({ to: value, toInclusive: false })\n        break\n      case `lte`:\n        result = this.rangeQuery({ to: value, toInclusive: true })\n        break\n      case `in`:\n        result = this.inArrayLookup(value)\n        break\n      default:\n        throw new Error(`Operation ${operation} not supported by BasicIndex`)\n    }\n\n    this.trackLookup(startTime)\n    return result\n  }\n\n  /**\n   * Gets the number of indexed keys\n   */\n  get keyCount(): number {\n    return this.indexedKeys.size\n  }\n\n  /**\n   * Performs an equality lookup - O(1)\n   */\n  equalityLookup(value: any): Set<TKey> {\n    const normalizedValue = normalizeValue(value)\n    return this.valueMap.get(normalizedValue) ?? new Set()\n  }\n\n  /**\n   * Performs a range query using binary search - O(log n + m)\n   */\n  rangeQuery(options: RangeQueryOptions = {}): Set<TKey> {\n    const { from, to, fromInclusive = true, toInclusive = true } = options\n    const result = new Set<TKey>()\n\n    if (this.sortedValues.length === 0) {\n      return result\n    }\n\n    const normalizedFrom = normalizeValue(from)\n    const normalizedTo = normalizeValue(to)\n\n    // Find start index\n    let startIdx = 0\n    if (normalizedFrom !== undefined) {\n      startIdx = findInsertPositionInArray(\n        this.sortedValues,\n        normalizedFrom,\n        this.compareFn,\n      )\n      // If not inclusive and we found exact match, skip it\n      if (\n        !fromInclusive &&\n        startIdx < this.sortedValues.length &&\n        this.compareFn(this.sortedValues[startIdx], normalizedFrom) === 0\n      ) {\n        startIdx++\n      }\n    }\n\n    // Find end index\n    let endIdx = this.sortedValues.length\n    if (normalizedTo !== undefined) {\n      endIdx = findInsertPositionInArray(\n        this.sortedValues,\n        normalizedTo,\n        this.compareFn,\n      )\n      // If inclusive and we found the value, include it\n      if (\n        toInclusive &&\n        endIdx < this.sortedValues.length &&\n        this.compareFn(this.sortedValues[endIdx], normalizedTo) === 0\n      ) {\n        endIdx++\n      }\n    }\n\n    // Collect all keys in range\n    for (let i = startIdx; i < endIdx; i++) {\n      const keys = this.valueMap.get(this.sortedValues[i])\n      if (keys) {\n        keys.forEach((key) => result.add(key))\n      }\n    }\n\n    return result\n  }\n\n  /**\n   * Performs a reversed range query\n   */\n  rangeQueryReversed(options: RangeQueryOptions = {}): Set<TKey> {\n    const { from, to, fromInclusive = true, toInclusive = true } = options\n\n    // Swap from/to and fromInclusive/toInclusive to handle reversed ranges\n    // If to is undefined, we want to start from the end (max value)\n    // If from is undefined, we want to end at the beginning (min value)\n    const swappedFrom =\n      to ??\n      (this.sortedValues.length > 0\n        ? this.sortedValues[this.sortedValues.length - 1]\n        : undefined)\n    const swappedTo =\n      from ?? (this.sortedValues.length > 0 ? this.sortedValues[0] : undefined)\n\n    return this.rangeQuery({\n      from: swappedFrom,\n      to: swappedTo,\n      fromInclusive: toInclusive,\n      toInclusive: fromInclusive,\n    })\n  }\n\n  /**\n   * Returns the next n items in sorted order\n   */\n  take(n: number, from?: any, filterFn?: (key: TKey) => boolean): Array<TKey> {\n    const result: Array<TKey> = []\n\n    let startIdx = 0\n    if (from !== undefined) {\n      const normalizedFrom = normalizeValue(from)\n      startIdx = findInsertPositionInArray(\n        this.sortedValues,\n        normalizedFrom,\n        this.compareFn,\n      )\n      // Skip past the 'from' value (exclusive)\n      while (\n        startIdx < this.sortedValues.length &&\n        this.compareFn(this.sortedValues[startIdx], normalizedFrom) <= 0\n      ) {\n        startIdx++\n      }\n    }\n\n    for (\n      let i = startIdx;\n      i < this.sortedValues.length && result.length < n;\n      i++\n    ) {\n      const keys = this.valueMap.get(this.sortedValues[i])\n      if (keys) {\n        for (const key of keys) {\n          if (result.length >= n) break\n          if (!filterFn || filterFn(key)) {\n            result.push(key)\n          }\n        }\n      }\n    }\n\n    return result\n  }\n\n  /**\n   * Returns the next n items in reverse sorted order\n   */\n  takeReversed(\n    n: number,\n    from?: any,\n    filterFn?: (key: TKey) => boolean,\n  ): Array<TKey> {\n    const result: Array<TKey> = []\n\n    let startIdx = this.sortedValues.length - 1\n    if (from !== undefined) {\n      const normalizedFrom = normalizeValue(from)\n      startIdx =\n        findInsertPositionInArray(\n          this.sortedValues,\n          normalizedFrom,\n          this.compareFn,\n        ) - 1\n      // Skip past the 'from' value (exclusive)\n      while (\n        startIdx >= 0 &&\n        this.compareFn(this.sortedValues[startIdx], normalizedFrom) >= 0\n      ) {\n        startIdx--\n      }\n    }\n\n    for (let i = startIdx; i >= 0 && result.length < n; i--) {\n      const keys = this.valueMap.get(this.sortedValues[i])\n      if (keys) {\n        for (const key of keys) {\n          if (result.length >= n) break\n          if (!filterFn || filterFn(key)) {\n            result.push(key)\n          }\n        }\n      }\n    }\n\n    return result\n  }\n\n  /**\n   * Returns the first n items in sorted order (from the start)\n   */\n  takeFromStart(n: number, filterFn?: (key: TKey) => boolean): Array<TKey> {\n    const result: Array<TKey> = []\n    for (let i = 0; i < this.sortedValues.length && result.length < n; i++) {\n      const keys = this.valueMap.get(this.sortedValues[i])\n      if (keys) {\n        for (const key of keys) {\n          if (result.length >= n) break\n          if (!filterFn || filterFn(key)) {\n            result.push(key)\n          }\n        }\n      }\n    }\n    return result\n  }\n\n  /**\n   * Returns the first n items in reverse sorted order (from the end)\n   */\n  takeReversedFromEnd(\n    n: number,\n    filterFn?: (key: TKey) => boolean,\n  ): Array<TKey> {\n    const result: Array<TKey> = []\n    for (\n      let i = this.sortedValues.length - 1;\n      i >= 0 && result.length < n;\n      i--\n    ) {\n      const keys = this.valueMap.get(this.sortedValues[i])\n      if (keys) {\n        for (const key of keys) {\n          if (result.length >= n) break\n          if (!filterFn || filterFn(key)) {\n            result.push(key)\n          }\n        }\n      }\n    }\n    return result\n  }\n\n  /**\n   * Performs an IN array lookup - O(k) where k is values.length\n   */\n  inArrayLookup(values: Array<any>): Set<TKey> {\n    const result = new Set<TKey>()\n\n    for (const value of values) {\n      const normalizedValue = normalizeValue(value)\n      const keys = this.valueMap.get(normalizedValue)\n      if (keys) {\n        keys.forEach((key) => result.add(key))\n      }\n    }\n\n    return result\n  }\n\n  // Getter methods for testing/compatibility\n  get indexedKeysSet(): Set<TKey> {\n    return this.indexedKeys\n  }\n\n  get orderedEntriesArray(): Array<[any, Set<TKey>]> {\n    return this.sortedValues.map((value) => [\n      value,\n      this.valueMap.get(value) ?? new Set(),\n    ])\n  }\n\n  get orderedEntriesArrayReversed(): Array<[any, Set<TKey>]> {\n    const result: Array<[any, Set<TKey>]> = []\n    for (let i = this.sortedValues.length - 1; i >= 0; i--) {\n      const value = this.sortedValues[i]\n      result.push([value, this.valueMap.get(value) ?? new Set()])\n    }\n    return result\n  }\n\n  get valueMapData(): Map<any, Set<TKey>> {\n    return this.valueMap\n  }\n}\n"],"names":["BaseIndex","defaultComparator","normalizeValue","findInsertPositionInArray","deleteInSortedArray"],"mappings":"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"}