Felix
Felix

Reputation: 5619

playframework scala code efficiency and future problems

Hi I have the following code block

processSteps.map {
          step =>
            val prerequisiteFuture = processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get)
            prerequisiteFuture.map(prereqTemplates => {
              processTemplateDTO.getProcessTemplates(prereqTemplates).map(pres => {
                step.stepPrerequisites = Some(pres)
                // Fetches the ProcessStep Prerequisites
                processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get).map(processStepPrerequisites => {
                  processStepPrerequisites.map(processStepPrerequisite => { // Eintzelne Vorbedingung
                    // Feteches The Reference to the Process Step Prerequisite Template
                    processStepPrerequisitesDTO.getProcessStepsPrerequisiteProcessTemplate(step.id.get).map(preReqs => {
                      preReqs.foreach(preReqRelation => {
                        processStepPrerequisite.processTemplate_id = preReqRelation.processtemplate
                        processStepPrerequisite
                      })
                    })
                    processStepPrerequisites
                  })
                  step.prerequisites = Some(processStepPrerequisites)
                })
                step
              })
            })

I want to fetch some data from database and then I have to reorganisate the some data.

It works ... but not well

Problems are:

1) Code is not efficient 2) Often it returns the step at the and without the middple part with the processStepPrerequisite is finished

What would be a good and smart way to resolve this? thanks

enter image description here

Upvotes: 0

Views: 90

Answers (2)

Shahbaz Shueb
Shahbaz Shueb

Reputation: 420

You can use a for comprehension for doing your stuff in the following way:

val preReqFuture = for{
    step <- processSteps
    prereqTemplates <- processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get)
    pres <- processTemplateDTO.getProcessTemplates(prereqTemplates)
    processStepPrerequisites <-processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get)
    preReqs <- processStepPrerequisitesDTO.getProcessStepsPrerequisiteProcessTemplate(step.id.get)
} yield (step, pres, processStepPrerequisites, preReqs)

preReqFuture.map{ (step, pres, processStepPrerequisites, preReqs) => 
    processStepPrerequisites.map(processStepPrerequisite => {
        preReqs.foreach(preReqRelation => { 
            processStepPrerequisite.processTemplate_id = preReqRelation.processtemplate
            processStepPrerequisite
        })
    })
    step.stepPrerequisites = Some(pres)
    step.prerequisites = Some(processStepPrerequisites)
    step
}.recover {
    case error: Throwable => //Deal with error
}

Note: I have assumed that processSteps is also a Future.

Upvotes: 1

Simon
Simon

Reputation: 6452

If you want, step to be returned when all the actions are finished, just return it in the last map block.

For the efficiency of your code, the problem is probably not in the snippet that you have provided but in the processStepPrerequisitesDTO methods.

Upvotes: 1

Related Questions