package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.impl.dao;
import static com.mysema.query.alias.Alias.$;
import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money;
import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl;
import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferSortByHitEntry;
import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferState;
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.OfferEntity;
import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.SideDishEntity;
import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.OfferDao;
import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferFilter;
import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSearchCriteriaTo;
import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSortBy;
import io.oasp.module.jpa.common.api.to.PaginatedListTo;
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 OfferDao}.
*
*/
@Named
public class OfferDaoImpl extends ApplicationMasterDataDaoImpl<OfferEntity> implements OfferDao {
/**
* The constructor.
*/
public OfferDaoImpl() {
super();
}
@Override
public Class<OfferEntity> getEntityClass() {
return OfferEntity.class;
}
@Override
@Deprecated
public List<OfferEntity> findOffersFiltered(OfferFilter offerFilterBo, OfferSortBy sortBy) {
/*
* Default error handling
*/
if (offerFilterBo == null || sortBy == null) {
return new ArrayList<>(0);
}
OfferEntity offer = Alias.alias(OfferEntity.class);
JPQLQuery query = new JPAQuery(getEntityManager()).from($(offer));
BooleanBuilder builder = new BooleanBuilder();
/*
* Applying the filters
*/
// Meal
MealEntity meal = Alias.alias(MealEntity.class);
if (offerFilterBo.getMealId() != null && offerFilterBo.getMealId() > 0) {
query = query.join($(offer.getMeal()), $(meal));
builder.and($(meal.getId()).eq(offerFilterBo.getMealId()));
}
// Drink
DrinkEntity drink = Alias.alias(DrinkEntity.class);
if (offerFilterBo.getDrinkId() != null && offerFilterBo.getDrinkId() > 0) {
query.join($(offer.getDrink()), $(drink));
builder.and($(drink.getId()).eq(offerFilterBo.getDrinkId()));
}
// SideDish
SideDishEntity sideDish = Alias.alias(SideDishEntity.class);
if (offerFilterBo.getSideDishId() != null && offerFilterBo.getSideDishId() > 0) {
query.join($(offer.getSideDish()), $(sideDish));
builder.and($(sideDish.getId()).eq(offerFilterBo.getSideDishId()));
}
// only min price is given
if (offerFilterBo.getMinPrice() != null) {
builder.and($(offer.getPrice()).goe(offerFilterBo.getMinPrice()));
}
// only max price is given
if (offerFilterBo.getMaxPrice() != null) {
builder.and($(offer.getPrice()).loe(offerFilterBo.getMaxPrice()));
}
// sorting
if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.DESCRIPTION)) {
if (sortBy.getOrderBy().isDesc())
query.where(builder).orderBy($(offer.getDescription()).desc());
else
query.where(builder).orderBy($(offer.getDescription()).asc());
} else if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.PRICE)) {
if (sortBy.getOrderBy().isDesc())
query.where(builder).orderBy($(offer.getPrice()).desc());
else
query.where(builder).orderBy($(offer.getPrice()).asc());
} else if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.MEAL)) {
if (sortBy.getOrderBy().isDesc())
query.where(builder).orderBy($(offer.getMeal().getDescription()).desc());
else
query.where(builder).orderBy($(offer.getMeal().getDescription()).asc());
} else if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.DRINK)) {
if (sortBy.getOrderBy().isDesc())
query.where(builder).orderBy($(offer.getDrink().getDescription()).desc());
else
query.where(builder).orderBy($(offer.getDrink().getDescription()).asc());
} else if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.SIDEDISH)) {
if (sortBy.getOrderBy().isDesc())
query.where(builder).orderBy($(offer.getSideDish().getDescription()).desc());
else
query.where(builder).orderBy($(offer.getSideDish().getDescription()).asc());
} else {
if (sortBy.getOrderBy().isDesc())
query.where(builder).orderBy($(offer.getId()).desc());
else
query.where(builder).orderBy($(offer.getId()).asc());
}
/*
* Result
*/
List<OfferEntity> result = query.where(builder).list($(offer));
return result;
}
@Override
public PaginatedListTo<OfferEntity> findOffers(OfferSearchCriteriaTo criteria) {
OfferEntity offer = Alias.alias(OfferEntity.class);
EntityPathBase<OfferEntity> alias = $(offer);
JPAQuery query = new JPAQuery(getEntityManager()).from(alias);
Long number = criteria.getNumber();
if (number != null) {
query.where($(offer.getNumber()).eq(number));
}
Long mealId = criteria.getMealId();
if (mealId != null) {
query.where($(offer.getMealId()).eq(mealId));
}
Long drinkId = criteria.getDrinkId();
if (drinkId != null) {
query.where($(offer.getDrinkId()).eq(drinkId));
}
Long sideDishId = criteria.getSideDishId();
if (sideDishId != null) {
query.where($(offer.getSideDishId()).eq(sideDishId));
}
OfferState state = criteria.getState();
if (state != null) {
query.where($(offer.getState()).eq(state));
}
Money minPrice = criteria.getMinPrice();
if (minPrice != null) {
query.where($(offer.getPrice()).goe(minPrice));
}
Money maxPrice = criteria.getMaxPrice();
if (maxPrice != null) {
query.where($(offer.getPrice()).loe(maxPrice));
}
return findPaginated(criteria, query, alias);
}
}