InMemoryQueryRepository.ts•2.78 kB
import { Query } from '../../domain/query/entities/Query.js';
import { QueryId } from '../../domain/query/value-objects/QueryId.js';
import { QueryRepository } from '../../domain/query/repositories/QueryRepository.js';
/**
 * InMemoryQueryRepository
 *
 * In-memory implementation of QueryRepository interface.
 * Used for development, testing, and caching.
 */
export class InMemoryQueryRepository implements QueryRepository {
  private queries: Map<string, Query> = new Map();
  /**
   * Saves a query to the in-memory repository.
   * @param query The query to save
   */
  async save(query: Query): Promise<void> {
    this.queries.set(query.id.value, query);
  }
  /**
   * Finds a query by its ID.
   * @param id The query ID
   * @returns The query if found, null otherwise
   */
  async findById(id: QueryId): Promise<Query | null> {
    const query = this.queries.get(id.value);
    return query || null;
  }
  /**
   * Finds queries matching a pattern.
   * @param pattern The search pattern
   * @returns Array of matching queries
   */
  async findByPattern(pattern: string): Promise<Query[]> {
    const regex = new RegExp(pattern, 'i');
    return Array.from(this.queries.values()).filter(query => regex.test(query.sql));
  }
  /**
   * Gets aggregated statistics about queries.
   * @returns Query statistics
   */
  async getStatistics(): Promise<any> {
    const queries = Array.from(this.queries.values());
    // Calculate aggregate statistics
    const totalQueries = queries.length;
    const executedQueries = queries.filter(q => q.statistics.executionCount > 0);
    const totalExecutions = executedQueries.reduce(
      (sum, q) => sum + q.statistics.executionCount,
      0
    );
    const avgExecutionTime =
      executedQueries.length > 0
        ? executedQueries.reduce((sum, q) => sum + q.statistics.averageExecutionTime, 0) /
          executedQueries.length
        : 0;
    // Find slow queries (> 1000ms)
    const slowQueries = executedQueries.filter(q => q.statistics.averageExecutionTime > 1000);
    return {
      totalQueries,
      executedQueries: executedQueries.length,
      totalExecutions,
      avgExecutionTime,
      slowQueries: slowQueries.length,
      slowQueriesList: slowQueries.map(q => ({
        id: q.id.value,
        sql: q.sql,
        avgExecutionTime: q.statistics.averageExecutionTime,
        executionCount: q.statistics.executionCount,
      })),
    };
  }
  /**
   * Deletes a query by its ID.
   * @param id The query ID
   * @returns True if deleted, false if not found
   */
  async delete(id: QueryId): Promise<boolean> {
    return this.queries.delete(id.value);
  }
  /**
   * Clears all queries from the repository.
   */
  async clear(): Promise<void> {
    this.queries.clear();
  }
}