package org.ohdsi.webapi.service;
import java.util.List;
import javax.persistence.EntityManager;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.ohdsi.webapi.cohort.CohortEntity;
import org.ohdsi.webapi.cohort.CohortRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
/**
* Service to read/write to the Cohort table
*/
@Path("/cohort/")
@Component
public class CohortService {
@Autowired
public CohortRepository cohortRepository;
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private EntityManager em;
/**
* Retrieves all cohort entities for the given cohort definition id
* from the COHORT table
*
* @param id Cohort Definition id
* @return List of CohortEntity
*/
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public List<CohortEntity> getCohortListById(@PathParam("id") final long id) {
List<CohortEntity> d = this.cohortRepository.getAllCohortsForId(id);
return d;
}
/**
* Imports a List of CohortEntity into the COHORT table
*
* @param cohort List of CohortEntity
* @return status
*/
@POST
@Path("import")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String saveCohortListToCDM(final List<CohortEntity> cohort) {
this.transactionTemplate.execute(new TransactionCallback<Void>() {
@Override
public Void doInTransaction(TransactionStatus status) {
int i = 0;
for (CohortEntity cohortEntity : cohort) {
em.persist(cohortEntity);
if (i % 5 == 0) { //5, same as the JDBC batch size
//flush a batch of inserts and release memory:
em.flush();
em.clear();
}
i++;
}
return null;
}
});
return "ok";
}
}