@nahisaho/yata-local 1.6.6 → 1.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Index Optimizer for YATA Local
3
+ *
4
+ * Analyzes database indexes and provides optimization recommendations.
5
+ *
6
+ * @packageDocumentation
7
+ * @module @nahisaho/yata-local/index-optimizer
8
+ *
9
+ * @see REQ-YI-IDX-001 - Index Analysis
10
+ * @see REQ-YI-IDX-002 - Composite Index Generation
11
+ * @see REQ-YI-IDX-003 - Query Performance Monitoring
12
+ * @see DES-YATA-IMPROVEMENTS-001 - Design Document
13
+ */
14
+ import type Database from 'better-sqlite3';
15
+ /**
16
+ * Information about a database index
17
+ */
18
+ export interface IndexInfo {
19
+ /** Index name */
20
+ name: string;
21
+ /** Table name */
22
+ table: string;
23
+ /** Columns in the index */
24
+ columns: string[];
25
+ /** Whether the index is unique */
26
+ unique: boolean;
27
+ /** Estimated number of rows */
28
+ rowCount: number;
29
+ /** SQLite internal sequential number */
30
+ seq: number;
31
+ }
32
+ /**
33
+ * Index recommendation
34
+ */
35
+ export interface IndexRecommendation {
36
+ /** Recommendation type */
37
+ type: 'create' | 'drop' | 'modify';
38
+ /** Target table */
39
+ table: string;
40
+ /** Columns to index */
41
+ columns: string[];
42
+ /** Reason for recommendation */
43
+ reason: string;
44
+ /** Estimated improvement percentage */
45
+ estimatedImprovement: number;
46
+ /** SQL statement to execute */
47
+ sql: string;
48
+ /** Priority (1-5, 1 is highest) */
49
+ priority: number;
50
+ }
51
+ /**
52
+ * Query statistics from monitoring
53
+ */
54
+ export interface QueryStats {
55
+ /** Query pattern (normalized) */
56
+ queryPattern: string;
57
+ /** Query hash for grouping */
58
+ queryHash: string;
59
+ /** Average execution time in milliseconds */
60
+ avgTimeMs: number;
61
+ /** Minimum execution time */
62
+ minTimeMs: number;
63
+ /** Maximum execution time */
64
+ maxTimeMs: number;
65
+ /** Total execution count */
66
+ executionCount: number;
67
+ /** Average rows examined */
68
+ avgRowsExamined: number;
69
+ /** Indexes used (if available) */
70
+ indexesUsed: string[];
71
+ /** Last execution timestamp */
72
+ lastExecuted: string;
73
+ }
74
+ /**
75
+ * Complete index analysis result
76
+ * @see REQ-YI-IDX-001
77
+ */
78
+ export interface IndexAnalysisResult {
79
+ /** List of existing indexes */
80
+ indexes: IndexInfo[];
81
+ /** Optimization recommendations */
82
+ recommendations: IndexRecommendation[];
83
+ /** Query statistics (if monitoring enabled) */
84
+ queryStats: QueryStats[];
85
+ /** Analysis timestamp */
86
+ analyzedAt: string;
87
+ /** Analysis duration in milliseconds */
88
+ analysisTimeMs: number;
89
+ /** Database file path */
90
+ databasePath: string;
91
+ /** Total entities count */
92
+ entityCount: number;
93
+ /** Total relationships count */
94
+ relationshipCount: number;
95
+ }
96
+ /**
97
+ * Options for index analysis
98
+ */
99
+ export interface AnalysisOptions {
100
+ /** Include query statistics */
101
+ includeQueryStats?: boolean;
102
+ /** Maximum recommendations to return */
103
+ maxRecommendations?: number;
104
+ /** Minimum improvement threshold for recommendations */
105
+ minImprovementThreshold?: number;
106
+ }
107
+ /**
108
+ * Options for creating composite index
109
+ */
110
+ export interface CompositeIndexOptions {
111
+ /** Index name (auto-generated if not provided) */
112
+ name?: string;
113
+ /** Whether to create unique index */
114
+ unique?: boolean;
115
+ /** Execute immediately or return SQL only */
116
+ execute?: boolean;
117
+ }
118
+ /**
119
+ * Schema for query logging table
120
+ * @see REQ-YI-IDX-003
121
+ */
122
+ export declare const QUERY_LOG_SCHEMA = "\n-- Query log table for performance monitoring\nCREATE TABLE IF NOT EXISTS query_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n query_hash TEXT NOT NULL,\n query_pattern TEXT NOT NULL,\n execution_time_ms INTEGER NOT NULL,\n rows_examined INTEGER,\n indexes_used TEXT,\n timestamp TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_query_log_hash ON query_log(query_hash);\nCREATE INDEX IF NOT EXISTS idx_query_log_timestamp ON query_log(timestamp);\nCREATE INDEX IF NOT EXISTS idx_query_log_time ON query_log(execution_time_ms);\n";
123
+ /**
124
+ * Index Optimizer for YATA Local database
125
+ *
126
+ * Provides index analysis, recommendations, and monitoring capabilities.
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const optimizer = new IndexOptimizer(db);
131
+ * const result = await optimizer.analyzeIndexes();
132
+ * console.log(result.recommendations);
133
+ * ```
134
+ *
135
+ * @see REQ-YI-IDX-001
136
+ * @see REQ-YI-IDX-002
137
+ * @see REQ-YI-IDX-003
138
+ */
139
+ export declare class IndexOptimizer {
140
+ private db;
141
+ private monitoringEnabled;
142
+ constructor(db: Database.Database);
143
+ /**
144
+ * Analyze database indexes and generate recommendations
145
+ *
146
+ * Performance target: Complete within 5 seconds for up to 100,000 entities
147
+ *
148
+ * @param options - Analysis options
149
+ * @returns Index analysis result with recommendations
150
+ *
151
+ * @see REQ-YI-IDX-001
152
+ */
153
+ analyzeIndexes(options?: AnalysisOptions): Promise<IndexAnalysisResult>;
154
+ /**
155
+ * Get all existing indexes in the database
156
+ */
157
+ private getExistingIndexes;
158
+ /**
159
+ * Generate index recommendations based on analysis
160
+ */
161
+ private generateRecommendations;
162
+ /**
163
+ * Get row count for a table
164
+ */
165
+ private getTableRowCount;
166
+ /**
167
+ * Create a composite index on the specified table and columns
168
+ *
169
+ * @param table - Table name
170
+ * @param columns - Column names for the composite index
171
+ * @param options - Creation options
172
+ * @returns SQL statement (and executes if options.execute is true)
173
+ *
174
+ * @see REQ-YI-IDX-002
175
+ */
176
+ createCompositeIndex(table: string, columns: string[], options?: CompositeIndexOptions): string;
177
+ /**
178
+ * Apply all recommended indexes
179
+ *
180
+ * @param recommendations - List of recommendations to apply
181
+ * @returns Applied index names
182
+ */
183
+ applyRecommendations(recommendations: IndexRecommendation[]): string[];
184
+ /**
185
+ * Enable query performance monitoring
186
+ *
187
+ * Creates query_log table if it doesn't exist.
188
+ *
189
+ * @see REQ-YI-IDX-003
190
+ */
191
+ enableMonitoring(): void;
192
+ /**
193
+ * Disable query performance monitoring
194
+ */
195
+ disableMonitoring(): void;
196
+ /**
197
+ * Check if monitoring is enabled
198
+ */
199
+ isMonitoringEnabled(): boolean;
200
+ /**
201
+ * Log a query execution for monitoring
202
+ *
203
+ * @param queryPattern - Normalized query pattern
204
+ * @param executionTimeMs - Execution time in milliseconds
205
+ * @param rowsExamined - Number of rows examined (optional)
206
+ * @param indexesUsed - List of indexes used (optional)
207
+ */
208
+ logQuery(queryPattern: string, executionTimeMs: number, rowsExamined?: number, indexesUsed?: string[]): void;
209
+ /**
210
+ * Get query statistics from monitoring data
211
+ *
212
+ * @param limit - Maximum number of query patterns to return
213
+ * @returns Aggregated query statistics
214
+ */
215
+ getQueryStats(limit?: number): QueryStats[];
216
+ /**
217
+ * Get slow queries (queries exceeding threshold)
218
+ *
219
+ * @param thresholdMs - Minimum execution time to consider slow
220
+ * @param limit - Maximum results to return
221
+ * @returns Slow query entries
222
+ */
223
+ getSlowQueries(thresholdMs?: number, limit?: number): QueryStats[];
224
+ /**
225
+ * Clear query log (older than specified days)
226
+ *
227
+ * @param olderThanDays - Delete logs older than this many days (0 = all)
228
+ * @returns Number of deleted entries
229
+ */
230
+ clearQueryLog(olderThanDays?: number): number;
231
+ /**
232
+ * Check if query_log table exists
233
+ */
234
+ private isQueryLogTableExists;
235
+ /**
236
+ * Generate a hash for query pattern grouping
237
+ */
238
+ private hashQuery;
239
+ /**
240
+ * Run ANALYZE to update SQLite statistics
241
+ */
242
+ runAnalyze(): void;
243
+ /**
244
+ * Get database statistics summary
245
+ */
246
+ getDatabaseStats(): {
247
+ entityCount: number;
248
+ relationshipCount: number;
249
+ patternCount: number;
250
+ indexCount: number;
251
+ dbSizeBytes: number;
252
+ };
253
+ }
254
+ //# sourceMappingURL=index-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-optimizer.d.ts","sourceRoot":"","sources":["../src/index-optimizer.ts"],"names":[],"mappings":"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"}