package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.impl.dao; import static com.mysema.query.alias.Alias.$; import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.ProductSortByHitEntry; import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity; import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.MealEntity; import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.ProductEntity; import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.SideDishEntity; import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.ProductDao; import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductFilter; import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSearchCriteriaTo; import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSortBy; import io.oasp.module.jpa.common.api.to.PaginatedListTo; import io.oasp.module.jpa.common.api.to.PaginationResultTo; import io.oasp.module.jpa.common.api.to.PaginationTo; import java.util.ArrayList; import java.util.List; import javax.inject.Named; import com.mysema.query.BooleanBuilder; import com.mysema.query.alias.Alias; import com.mysema.query.jpa.JPQLQuery; import com.mysema.query.jpa.impl.JPAQuery; import com.mysema.query.types.path.EntityPathBase; /** * Implementation of {@link ProductDao}. * */ @Named public class ProductDaoImpl extends ApplicationMasterDataDaoImpl<ProductEntity> implements ProductDao { /** * The constructor. */ public ProductDaoImpl() { super(); } @Override public Class<ProductEntity> getEntityClass() { return ProductEntity.class; } @Override @Deprecated public List<ProductEntity> findProductsFiltered(ProductFilter productFilterBo, ProductSortBy sortBy) { /* * Basic error handling */ if (productFilterBo == null) { return new ArrayList<>(); } ProductEntity product = Alias.alias(ProductEntity.class); JPQLQuery query = new JPAQuery(getEntityManager()).from($(product)); BooleanBuilder builder = new BooleanBuilder(); /* * Drinks */ if (productFilterBo.getFetchDrinks()) { builder.or($(product).instanceOf(DrinkEntity.class)); } /* * Meals */ if (productFilterBo.getFetchMeals()) { builder.or($(product).instanceOf(MealEntity.class)); } /* * SideDishes */ if (productFilterBo.getFetchSideDishes()) { builder.or($(product).instanceOf(SideDishEntity.class)); } if (sortBy.getSortByEntry().equals(ProductSortByHitEntry.DESCRIPTION)) { if (sortBy.getOrderBy().isDesc()) { query.where(builder).orderBy($(product.getDescription()).desc()); } else { query.where(builder).orderBy($(product.getDescription()).asc()); } } else { if (sortBy.getOrderBy().isDesc()) { query.where(builder).orderBy($(product.getId()).desc()); } else { query.where(builder).orderBy($(product.getId()).asc()); } } List<ProductEntity> result = query.list($(product)); return result; } @Override public PaginatedListTo<ProductEntity> findProducts(ProductSearchCriteriaTo criteria) { ProductEntity product = Alias.alias(ProductEntity.class); EntityPathBase<ProductEntity> alias = $(product); JPAQuery query = new JPAQuery(getEntityManager()).from(alias); String name = criteria.getName(); if (name != null) { query.where($(product.getName()).eq(name)); } String description = criteria.getDescription(); if (description != null) { query.where($(product.getDescription()).eq(description)); } // include filter for entity type if (!(criteria.isFetchDrinks() || criteria.isFetchMeals() || criteria.isFetchSideDishes())) { // no product type was selected, return empty result PaginationTo pagination = criteria.getPagination(); PaginationResultTo paginationResult = new PaginationResultTo(pagination, 0L); List<ProductEntity> paginatedList = new ArrayList<>(); return new PaginatedListTo<>(paginatedList, paginationResult); } BooleanBuilder builder = new BooleanBuilder(); if (criteria.isFetchSideDishes()) { builder.or($(product).instanceOf(SideDishEntity.class)); } if (criteria.isFetchMeals()) { builder.or($(product).instanceOf(MealEntity.class)); } if (criteria.isFetchDrinks()) { builder.or($(product).instanceOf(DrinkEntity.class)); } query.where(builder); return findPaginated(criteria, query, alias); } }