| 219 | * @since 4.0.0 |
| 220 | */ |
| 221 | export const findById = <Id extends Schema.Constraint, Res extends Schema.Constraint, Row, E, R>( |
| 222 | options: { |
| 223 | readonly Id: Id |
| 224 | readonly Result: Res |
| 225 | readonly ResultId: (result: Res["Type"], row: Types.NoInfer<Row>) => Id["Type"] |
| 226 | readonly execute: ( |
| 227 | requests: Arr.NonEmptyArray<Id["Encoded"]> |
| 228 | ) => Effect.Effect<ReadonlyArray<Row>, E, R> |
| 229 | } |
| 230 | ): RequestResolver.RequestResolver< |
| 231 | SqlRequest< |
| 232 | Id["Type"], |
| 233 | Res["Type"], |
| 234 | E | Schema.SchemaError | Cause.NoSuchElementError, |
| 235 | Id["EncodingServices"] | Res["DecodingServices"] | R |
| 236 | > |
| 237 | > => { |
| 238 | const decodeResults = Schema.decodeUnknownEffect(Schema.Array(options.Result)) |
| 239 | |
| 240 | return RequestResolver.makeGrouped< |
| 241 | SqlRequest< |
| 242 | Id["Type"], |
| 243 | Res["Type"], |
| 244 | E | Schema.SchemaError | Cause.NoSuchElementError, |
| 245 | Id["EncodingServices"] | Res["DecodingServices"] | R |
| 246 | >, |
| 247 | SqlClient.TransactionConnection.Service | undefined |
| 248 | >({ |
| 249 | key: transactionKey, |
| 250 | resolver: Effect.fnUntraced(function*(entries) { |
| 251 | const [inputs, idMap] = yield* partitionRequestsById(entries, options.Id) |
| 252 | if (!Arr.isArrayNonEmpty(inputs)) return |
| 253 | const results = yield* options.execute(inputs).pipe( |
| 254 | Effect.provideContext(entries[0].context) |
| 255 | ) |
| 256 | const decodedResults = yield* decodeResults(results).pipe( |
| 257 | Effect.provideContext(entries[0].context) |
| 258 | ) |
| 259 | for (let i = 0; i < decodedResults.length; i++) { |
| 260 | const result = decodedResults[i] |
| 261 | const id = options.ResultId(result, results[i]) |
| 262 | const request = MutableHashMap.get(idMap, id) |
| 263 | if (request._tag === "None") { |
| 264 | continue |
| 265 | } |
| 266 | MutableHashMap.remove(idMap, id) |
| 267 | request.value.completeUnsafe(Exit.succeed(result)) |
| 268 | } |
| 269 | if (MutableHashMap.isEmpty(idMap)) { |
| 270 | return |
| 271 | } |
| 272 | MutableHashMap.forEach(idMap, (request) => { |
| 273 | request.completeUnsafe(constNoSuchElement) |
| 274 | }) |
| 275 | }) |
| 276 | }) |
| 277 | } |
| 278 | |