186 """ Creates the filters and connect them to the menu sequences"""
189 chainWithMaxSteps =
max(chains, key =
lambda chain: len(chain.steps))
190 NSTEPS = len(chainWithMaxSteps.steps)
191 log.info(
"[createDataFlow] creating DF for %d chains and total %d steps", len(chains), NSTEPS)
194 finalDecisions = [ []
for n
in range(NSTEPS) ]
195 CFseqList = [ []
for n
in range(NSTEPS) ]
196 CFSeqByFilterName = [ {}
for n
in range(NSTEPS) ]
200 log.debug(
"\n Configuring chain %s with %d steps: \n - %s ", chain.name,len(chain.steps),
'\n - '.
join(map(str, [{step.name:step.nLegs}
for step
in chain.steps])))
204 for nstep, chainStep
in enumerate( chain.steps ):
205 if not flags.Trigger.fastMenuGeneration:
207 chainStep.createSequences()
208 log.debug(
"\n************* Start connecting step %d %s for chain %s", nstep+1, chainStep.name, chain.name)
210 filterInput = chain.L1decisions
212 filterInput = lastDecisions
213 if len(filterInput) == 0 :
214 log.error(
"[createDataFlow] Filter for step %s has %d inputs! At least one is expected", chainStep.name, len(filterInput))
215 raise Exception(
"[createDataFlow] Cannot proceed, exiting.")
217 log.debug(
"Set Filter input: %s while setting the chain: %s", filterInput, chain.name)
220 sequenceFilter =
None
221 filterName = CFNaming.filterName(chainStep.name)
222 if chainStep.isEmpty:
223 filterOutput = filterInput
225 filterOutput = [CFNaming.filterOutName(filterName, inputName)
for inputName
in filterInput ]
228 foundCFgroup = CFSeqByFilterName[nstep].
get(filterName,
None)
229 log.debug(
"%s CF sequences with filter name %s",
"Not found" if foundCFgroup
is None else "Found", filterName)
230 if foundCFgroup
is None:
231 sequenceFilter =
buildFilter(filterName, filterInput, chainStep.isEmpty)
232 if flags.Trigger.fastMenuGeneration:
234 chainStep.createSequences()
236 CFgroup = CFGroup( ChainStep = chainStep, FilterAlg = sequenceFilter)
237 CFgroup.connect(filterOutput)
238 CFSeqByFilterName[nstep][sequenceFilter.Alg.getName()] = CFgroup
239 CFseqList[nstep].
append(CFgroup)
240 lastCFgroup = CFgroup
242 lastCFgroup = foundCFgroup
243 sequenceFilter = lastCFgroup.sequenceCA.filterNode
245 [ sequenceFilter.addInput(inputName)
for inputName
in filterInput ]
246 [ sequenceFilter.addOutput(outputName)
for outputName
in filterOutput ]
247 lastCFgroup.connect(filterOutput)
249 lastDecisions = lastCFgroup.sequenceCA.decisions
252 chainLegs = chainStep.getChainLegs()
253 if len(chainLegs) != len(filterInput):
254 log.error(
"[createDataFlow] lengths of chainlegs = %s differ from inputs = %s",
str(chainLegs),
str(filterInput))
255 raise Exception(
"[createDataFlow] Cannot proceed, exiting.")
256 for finput, leg
in zip(filterInput, chainLegs):
257 log.debug(
"Adding chain %s to input %s of %s", leg, finput, sequenceFilter.Alg.name)
258 sequenceFilter.addChain(leg, finput)
260 log.debug(
"Now Filter has chains: %s", sequenceFilter.getChains())
261 log.debug(
"Now Filter has chains/input: %s", sequenceFilter.getChainsPerInput())
263 lastCFgroup.addStepLeg(chainStep, chain.name)
265 if len(chain.steps) == nstep+1:
266 log.debug(
"Adding finalDecisions for chain %s at step %d:", chain.name, nstep+1)
267 for dec
in lastDecisions:
268 finalDecisions[nstep].
append(dec)
272 log.debug(
"\n Built CD for chain %s with %d steps: \n - %s ", chain.name,len(chain.steps),
'\n - '.
join(map(str, [{step.name:step.nLegs}
for step
in chain.steps])))
275 log.debug(
"End of createDataFlow for %d chains and total %d steps", len(chains), NSTEPS)
276 return (finalDecisions, CFseqList)