package io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.impl.dao; import static com.mysema.query.alias.Alias.$; import io.oasp.gastronomy.restaurant.general.common.api.constants.NamedQueries; import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.TableEntity; import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.dao.TableDao; import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableSearchCriteriaTo; import io.oasp.module.jpa.common.api.to.OrderByTo; import io.oasp.module.jpa.common.api.to.OrderDirection; import io.oasp.module.jpa.common.api.to.PaginatedListTo; import java.util.List; import javax.inject.Named; import javax.persistence.Query; import com.mysema.query.alias.Alias; import com.mysema.query.jpa.impl.JPAQuery; import com.mysema.query.types.path.EntityPathBase; /** * Implementation of {@link TableDao}. * */ @Named public class TableDaoImpl extends ApplicationMasterDataDaoImpl<TableEntity> implements TableDao { /** * The constructor. */ public TableDaoImpl() { super(); } @Override public Class<TableEntity> getEntityClass() { return TableEntity.class; } @Override public List<TableEntity> getFreeTables() { Query query = getEntityManager().createNamedQuery(NamedQueries.GET_FREE_TABLES, TableEntity.class); return query.getResultList(); } @Override public PaginatedListTo<TableEntity> findTables(TableSearchCriteriaTo criteria) { TableEntity table = Alias.alias(TableEntity.class); EntityPathBase<TableEntity> alias = $(table); JPAQuery query = new JPAQuery(getEntityManager()).from(alias); Long waiterId = criteria.getWaiterId(); if (waiterId != null) { query.where($(table.getWaiterId()).eq(waiterId)); } Long number = criteria.getNumber(); if (number != null) { query.where($(table.getNumber()).eq(number)); } TableState state = criteria.getState(); if (state != null) { query.where($(table.getState()).eq(state)); } // Add order by fields addOrderBy(query, alias, table, criteria.getSort()); return findPaginated(criteria, query, alias); } private void addOrderBy(JPAQuery query, EntityPathBase<TableEntity> alias, TableEntity table, List<OrderByTo> sort) { if (sort != null && !sort.isEmpty()) { for (OrderByTo orderEntry : sort) { if ("number".equals(orderEntry.getName())) { if (OrderDirection.ASC.equals(orderEntry.getDirection())) { query.orderBy($(table.getNumber()).asc()); } else { query.orderBy($(table.getNumber()).desc()); } } else if ("waiterId".equals(orderEntry.getName())) { if (OrderDirection.ASC.equals(orderEntry.getDirection())) { query.orderBy($(table.getWaiterId()).asc()); } else { query.orderBy($(table.getWaiterId()).desc()); } } else if ("state".equals(orderEntry.getName())) { if (OrderDirection.ASC.equals(orderEntry.getDirection())) { query.orderBy($(table.getState()).asc()); } else { query.orderBy($(table.getState()).desc()); } } } } } }