1 package org.myorg.jpatickets.dao;
2
3 import java.util.HashMap;
4 import java.util.List;
5 import java.util.Map;
6
7 import javax.persistence.EntityManager;
8 import javax.persistence.TypedQuery;
9 import javax.persistence.criteria.CriteriaBuilder;
10 import javax.persistence.criteria.CriteriaQuery;
11 import javax.persistence.criteria.Expression;
12 import javax.persistence.criteria.Join;
13 import javax.persistence.criteria.Predicate;
14 import javax.persistence.criteria.Root;
15
16 import org.myorg.jpatickets.bo.Event;
17 import org.myorg.jpatickets.bo.Seat;
18 import org.myorg.jpatickets.bo.Ticket;
19
20 public class EventMgmtDAOImpl implements EventMgmtDAO {
21 EntityManager em;
22
23 public void setEntityManager(EntityManager em) {
24 this.em = em;
25 }
26
27 @Override
28 public Event createEvent(Event event) {
29 em.persist(event);
30 return event;
31 }
32
33 @Override
34 public Event getEvent(int eventId) {
35 return em.find(Event.class, eventId);
36 }
37
38 @Override
39 public Event fetchEventTickets(int id) {
40 List<Event> events = em.createNamedQuery("JPATicketEvent.fetchEventTickets",
41 Event.class)
42 .setParameter("eventId", id)
43 .getResultList();
44 return events.isEmpty() ? null : events.get(0);
45 }
46
47 @Override
48 public Event fetchEventTicketsSeats(int id) {
49 List<Event> events = em.createNamedQuery("JPATicketEvent.fetchEventTicketsSeats",
50 Event.class)
51 .setParameter("eventId", id)
52 .getResultList();
53 return events.isEmpty() ? null : events.get(0);
54 }
55
56 @Override
57 public Map<String, Object> fetchEventDTOData(int eventId) {
58 @SuppressWarnings("unchecked")
59 List<Object[]> rows = em.createNamedQuery("JPATicketEvent.fetchEventDTO")
60 .setParameter("eventId", eventId)
61 .getResultList();
62
63 Map<String, Object> dtoData = new HashMap<String, Object>();
64 if (!rows.isEmpty()) {
65 Object[] row = rows.get(0);
66 Event event = (Event) row[0];
67 String venueName = (String) row[1];
68 Number numTickets = (Number) row[2];
69 dtoData.put(EVENT, event);
70 dtoData.put(VENUE_NAME, venueName);
71 dtoData.put(NUM_TICKETS, numTickets.intValue());
72 }
73 return dtoData;
74 }
75
76 @Override
77 public List<Seat> findSeats(Event event, String section, Integer row,
78 Integer position, int offset, int limit) {
79 CriteriaBuilder cb = em.getCriteriaBuilder();
80 CriteriaQuery<Seat> qdef = cb.createQuery(Seat.class);
81 Root<Ticket> t = qdef.from(Ticket.class);
82 Join<Ticket, Event> e = t.join("event");
83 Join<Ticket, Seat> s = t.join("seat");
84
85 Predicate pred = cb.conjunction();
86 List<Expression<Boolean>> expr = pred.getExpressions();
87 if (section != null) {
88 expr.add(cb.equal(s.get("pk").get("section"), section));
89 }
90 if (row !=null) {
91 expr.add(cb.equal(s.get("pk").get("row"), row));
92 }
93 if (position !=null) {
94 expr.add(cb.equal(s.get("pk").get("position"), position));
95 }
96
97 qdef.select(s).where(cb.and(cb.equal(e, event), pred)).orderBy(cb.asc(t.get("price")));
98 TypedQuery<Seat> query = em.createQuery(qdef);
99 if (offset > 0) {
100 query.setFirstResult(offset);
101 }
102 if (limit > 0) {
103 query.setMaxResults(limit);
104 }
105
106 return query.getResultList();
107 }
108
109 @Override
110 public List<Ticket> findTickets(Event event, List<Seat> seats) {
111 return em.createNamedQuery("JPATicketTicket.findTickets",
112 Ticket.class)
113 .setParameter("seats", seats)
114 .getResultList();
115 }
116 }