perf: build worker choice strategies policy and task equirements on
[poolifier.git] / src / pools / selection-strategies / selection-strategies-utils.ts
index d1e60e0350839893631a9e153ef143521ca2f6b3..777be6e4d4a2be104afd7986bd835e7e04312e96 100644 (file)
@@ -10,6 +10,8 @@ import { LeastUsedWorkerChoiceStrategy } from './least-used-worker-choice-strate
 import { RoundRobinWorkerChoiceStrategy } from './round-robin-worker-choice-strategy.js'
 import {
   type IWorkerChoiceStrategy,
+  type StrategyPolicy,
+  type TaskStatisticsRequirements,
   WorkerChoiceStrategies,
   type WorkerChoiceStrategy,
   type WorkerChoiceStrategyOptions
@@ -98,6 +100,47 @@ export const buildWorkerChoiceStrategyOptions = <
   }
 }
 
+export const buildWorkerChoiceStrategiesPolicy = (
+  workerChoiceStrategies: Map<WorkerChoiceStrategy, IWorkerChoiceStrategy>
+): StrategyPolicy => {
+  const policies: StrategyPolicy[] = []
+  for (const workerChoiceStrategy of workerChoiceStrategies.values()) {
+    policies.push(workerChoiceStrategy.strategyPolicy)
+  }
+  return {
+    dynamicWorkerUsage: policies.some(p => p.dynamicWorkerUsage),
+    dynamicWorkerReady: policies.some(p => p.dynamicWorkerReady)
+  }
+}
+
+export const buildWorkerChoiceStrategiesTaskStatisticsRequirements = (
+  workerChoiceStrategies: Map<WorkerChoiceStrategy, IWorkerChoiceStrategy>
+): TaskStatisticsRequirements => {
+  const taskStatisticsRequirements: TaskStatisticsRequirements[] = []
+  for (const workerChoiceStrategy of workerChoiceStrategies.values()) {
+    taskStatisticsRequirements.push(
+      workerChoiceStrategy.taskStatisticsRequirements
+    )
+  }
+  return {
+    runTime: {
+      aggregate: taskStatisticsRequirements.some(r => r.runTime.aggregate),
+      average: taskStatisticsRequirements.some(r => r.runTime.average),
+      median: taskStatisticsRequirements.some(r => r.runTime.median)
+    },
+    waitTime: {
+      aggregate: taskStatisticsRequirements.some(r => r.waitTime.aggregate),
+      average: taskStatisticsRequirements.some(r => r.waitTime.average),
+      median: taskStatisticsRequirements.some(r => r.waitTime.median)
+    },
+    elu: {
+      aggregate: taskStatisticsRequirements.some(r => r.elu.aggregate),
+      average: taskStatisticsRequirements.some(r => r.elu.average),
+      median: taskStatisticsRequirements.some(r => r.elu.median)
+    }
+  }
+}
+
 export const getWorkerChoiceStrategy = <Worker extends IWorker, Data, Response>(
   workerChoiceStrategy: WorkerChoiceStrategy,
   pool: IPool<Worker, Data, Response>,