package de.rwth.idsg.bikeman.app.repository; import de.rwth.idsg.bikeman.app.exception.AppErrorCode; import de.rwth.idsg.bikeman.app.exception.AppException; import de.rwth.idsg.bikeman.domain.Pedelec; import lombok.extern.slf4j.Slf4j; import org.joda.time.LocalDateTime; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; @Repository @Slf4j public class AppPedelecRepositoryImpl implements AppPedelecRepository { @PersistenceContext private EntityManager em; @Override @Transactional(readOnly = true) public List<Pedelec> findAvailablePedelecs(Long stationId) throws AppException { final String q = "select p " + "from Pedelec p " + "join p.chargingStatus cs " + "join p.stationSlot sl " + "join sl.station s " + "where s.stationId = :stationId " + "and sl.state = de.rwth.idsg.bikeman.domain.OperationState.OPERATIVE " + "and p.state = de.rwth.idsg.bikeman.domain.OperationState.OPERATIVE " + "and p not in (select r.pedelec from Reservation r " + "where r.state = de.rwth.idsg.bikeman.domain.ReservationState.CREATED " + "and (:now between r.startDateTime and r.endDateTime)) " + "order by cs.batteryStateOfCharge desc"; try { return em.createQuery(q, Pedelec.class) .setParameter("stationId", stationId) .setParameter("now", new LocalDateTime()) .setMaxResults(5) .getResultList(); } catch (Exception e) { throw new AppException("Failed to find pedelecs in station with ID " + stationId, e, AppErrorCode.DATABASE_OPERATION_FAILED); } } }