package org.openlmis.core.model.repository; import android.content.Context; import com.google.inject.Inject; import com.j256.ormlite.dao.Dao; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.model.Product; import org.openlmis.core.model.ProductProgram; import org.openlmis.core.persistence.DbUtil; import org.openlmis.core.persistence.GenericDao; import org.roboguice.shaded.goole.common.base.Function; import org.roboguice.shaded.goole.common.collect.FluentIterable; import java.sql.SQLException; import java.util.List; public class ProductProgramRepository { GenericDao<ProductProgram> genericDao; @Inject DbUtil dbUtil; @Inject ProductRepository productRepository; @Inject public ProductProgramRepository(Context context) { genericDao = new GenericDao<>(ProductProgram.class, context); } public ProductProgram queryByCode(final String productCode, final String programCode) throws LMISException { return dbUtil.withDao(ProductProgram.class, new DbUtil.Operation<ProductProgram, ProductProgram>() { @Override public ProductProgram operate(Dao<ProductProgram, String> dao) throws SQLException, LMISException { return dao.queryBuilder().where().eq("programCode", programCode).and().eq("productCode", productCode).queryForFirst(); } }); } public ProductProgram queryByCode(final String productCode, final List<String> programCodes) throws LMISException { return dbUtil.withDao(ProductProgram.class, new DbUtil.Operation<ProductProgram, ProductProgram>() { @Override public ProductProgram operate(Dao<ProductProgram, String> dao) throws SQLException, LMISException { return dao.queryBuilder().where().in("programCode", programCodes).and().eq("productCode", productCode).queryForFirst(); } }); } public void batchSave(final List<ProductProgram> productPrograms) { try { for (ProductProgram productProgram : productPrograms) { createOrUpdate(productProgram); } } catch (LMISException e) { e.reportToFabric(); } } public List<ProductProgram> listActiveProductProgramsByProgramCodes(final List<String> programCodes) throws LMISException { return dbUtil.withDao(ProductProgram.class, new DbUtil.Operation<ProductProgram, List<ProductProgram>>() { @Override public List<ProductProgram> operate(Dao<ProductProgram, String> dao) throws SQLException, LMISException { return dao.queryBuilder().where().eq("isActive", true).and().in("programCode", programCodes).query(); } }); } public void createOrUpdate(ProductProgram productProgram) throws LMISException { ProductProgram existingProductProgram = queryByCode(productProgram.getProductCode(), productProgram.getProgramCode()); if (existingProductProgram == null) { genericDao.create(productProgram); } else { productProgram.setId(existingProductProgram.getId()); genericDao.update(productProgram); } } protected List<ProductProgram> listAll() throws LMISException { return genericDao.queryForAll(); } public List<Long> queryActiveProductIdsByProgramsWithKits(List<String> programCodes, boolean isWithKit) throws LMISException { List<ProductProgram> productPrograms = listActiveProductProgramsByProgramCodes(programCodes); List<String> productCodes = FluentIterable.from(productPrograms).transform(new Function<ProductProgram, String>() { @Override public String apply(ProductProgram productProgram) { return productProgram.getProductCode(); } }).toList(); return FluentIterable.from(productRepository.queryActiveProductsByCodesWithKits(productCodes, isWithKit)).transform(new Function<Product, Long>() { @Override public Long apply(Product product) { return product.getId(); } }).toList(); } }