Commit 3fc2964a by Tuukka Kivilahti

Merge branch 'lockedQueue' into 'master'

Queue handling

If user had selected all places, but had not locked the places, user would be unable to enter the queue again.

See merge request !313
2 parents 09875ba8 63e26a5f
......@@ -202,8 +202,11 @@ public class QueueBean implements QueueBeanLocal {
ret = queue.getEntry(user);
} else {
List<PlaceSlot> slots = slotfacade.findFreePlaceSlots(user, map);
List<PlaceSlot> unlocked = slotfacade.findUnlockedPlaceslots(user, map);
int total = slots.size() + unlocked.size();
logger.info("User {} not yet in queue. User has {} slots", user, slots.size());
if (!slots.isEmpty() && slots.size() >= queue.getMinimumSlotsInQueue()) {
if (total >= queue.getMinimumSlotsInQueue()) {
ret = queue.enter(user, slots);
}
}
......
......@@ -19,7 +19,6 @@
package fi.codecrew.moya.facade;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
......@@ -131,8 +130,7 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
}
private static List<Predicate> getUnusedSlotPredicates(CriteriaBuilder cb, Root<PlaceSlot> root, Product prod, boolean paidOnly)
{
private static List<Predicate> getUnusedSlotPredicates(CriteriaBuilder cb, Root<PlaceSlot> root, Product prod, boolean paidOnly) {
Path<Bill> bill = root.get(PlaceSlot_.bill);
List<Predicate> preds = new ArrayList<>();
......@@ -146,8 +144,7 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
Path<Date> billexp = bill.get(Bill_.expires);
preds.add(cb.or(
cb.isNull(billexp),
cb.greaterThan(billexp, new Date())
));
cb.greaterThan(billexp, new Date())));
}
// Check that slot is not used
......@@ -185,8 +182,7 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
Path<Date> billexp = bill.get(Bill_.expires);
preds.add(cb.or(
cb.isNull(billexp),
cb.greaterThan(billexp, new Date())
));
cb.greaterThan(billexp, new Date())));
}
q.where(preds.toArray(new Predicate[preds.size()]));
......@@ -195,6 +191,30 @@ public class PlaceSlotFacade extends IntegerPkGenericFacade<PlaceSlot> {
return count;
}
public List<PlaceSlot> findUnlockedPlaceslots(EventUser user, EventMap map) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<PlaceSlot> q = cb.createQuery(PlaceSlot.class);
Root<PlaceSlot> root = q.from(PlaceSlot.class);
Path<Bill> bill = root.get(PlaceSlot_.bill);
final List<Predicate> preds = new ArrayList<>();
preds.add(cb.equal(bill.get(Bill_.user), user));
preds.add(cb.isNotNull(bill.get(Bill_.paidDate)));
preds.add(cb.isNotNull(root.get(PlaceSlot_.used)));
preds.add(cb.isNull(root.get(PlaceSlot_.place).get(Place_.group)));
Subquery<Integer> mapProdq = q.subquery(Integer.class);
Root<EventMap> mapProdqRoot = mapProdq.from(EventMap.class);
mapProdq.select(mapProdqRoot.join(EventMap_.places).get(Place_.product).get(Product_.id));
mapProdq.where(cb.equal(mapProdqRoot, map));
mapProdq.distinct(true);
preds.add(root.get(PlaceSlot_.product).get(Product_.id).in(mapProdq));
q.where(preds.toArray(new Predicate[preds.size()]));
return getEm().createQuery(q).getResultList();
}
public List<PlaceSlot> findFreePlaceSlots(EventUser user, EventMap map) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<PlaceSlot> q = cb.createQuery(PlaceSlot.class);
......
......@@ -51,6 +51,14 @@ public class PlaceSlot extends GenericEntity {
this.created = Calendar.getInstance().getTime();
}
public boolean isUsed() {
return used != null || place != null;
}
public boolean isLocked() {
return place != null && place.getGroup() != null;
}
public Date getCreated() {
return created;
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!