* Outgoing edges for MANY source nodes in one query. * * The batch form of getOutgoingEdges. Building a nested outline needs * the `contains` edges of every container in a file at once; doing that one * source at a time is a query per symbol on files that have hundreds.
(sourceIds: readonly string[], kinds?: EdgeKind[])
| 2161 | * source at a time is a query per symbol on files that have hundreds. |
| 2162 | */ |
| 2163 | getOutgoingEdgesFrom(sourceIds: readonly string[], kinds?: EdgeKind[]): Edge[] { |
| 2164 | if (sourceIds.length === 0) return []; |
| 2165 | const unique = [...new Set(sourceIds)]; |
| 2166 | const out: Edge[] = []; |
| 2167 | for (let i = 0; i < unique.length; i += SQLITE_PARAM_CHUNK_SIZE) { |
| 2168 | const chunk = unique.slice(i, i + SQLITE_PARAM_CHUNK_SIZE); |
| 2169 | const placeholders = chunk.map(() => '?').join(','); |
| 2170 | let sql = `SELECT * FROM edges WHERE source IN (${placeholders})`; |
| 2171 | const params: string[] = [...chunk]; |
| 2172 | if (kinds && kinds.length > 0) { |
| 2173 | sql += ` AND kind IN (${kinds.map(() => '?').join(',')})`; |
| 2174 | params.push(...kinds); |
| 2175 | } |
| 2176 | const rows = this.db.prepare(sql).all(...params) as EdgeRow[]; |
| 2177 | for (const row of rows) out.push(rowToEdge(row)); |
| 2178 | } |
| 2179 | return out; |
| 2180 | } |
| 2181 | |
| 2182 | /** |
| 2183 | * Fan-in (total incoming edge count) for MANY nodes in one query. |
no test coverage detected