package hu.sch.ejb.search;
import hu.sch.domain.Group;
import hu.sch.domain.user.User;
import hu.sch.services.SearchManagerLocal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
/**
*
* @author tomi
*/
@Stateless
public class SearchManagerBean implements SearchManagerLocal {
@PersistenceContext
private EntityManager em;
public SearchManagerBean() {
}
/**
* For testing purposes.
*
* @param em
*/
public SearchManagerBean(EntityManager em) {
this.em = em;
}
@Override
public List<User> searchUsers(String keyword, int page, int perPage) {
TypedQuery<User> q = new SearchQueryBuilder(em, keyword).build();
q.setFirstResult(perPage * page);
q.setMaxResults(perPage);
return q.getResultList();
}
@Override
public List<User> searchBirthdayUsers(Date date) {
TypedQuery<User> q = em.createQuery("SELECT u FROM User u "
+ "WHERE MONTH(u.dateOfBirth) = :month AND DAY(u.dateOfBirth) = :day", User.class);
Calendar c = Calendar.getInstance();
c.setTime(date);
q.setParameter("month", c.get(Calendar.MONTH) + 1);
q.setParameter("day", c.get(Calendar.DAY_OF_MONTH));
return q.getResultList();
}
@Override
public List<Group> searchGroups(String term, int page, int perPage) {
TypedQuery<Group> q = em.createNamedQuery(Group.findByNameFragment, Group.class);
q.setParameter("groupName", createLikeExpression(term));
// pagination
q.setMaxResults(perPage);
q.setFirstResult(page * perPage);
return q.getResultList();
}
@Override
public long countUsers(String term) {
return new SearchQueryBuilder(em, term).buildForCount().getSingleResult();
}
@Override
public long countGroup(String term) {
TypedQuery<Long> q = em.createNamedQuery(Group.countByNameFragment, Long.class);
q.setParameter("groupName", createLikeExpression(term));
return q.getSingleResult();
}
private String createLikeExpression(String expr) {
return "%".concat(expr).concat("%");
}
}