package sushi.visualisation;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityTransaction;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Query;
import javax.persistence.Table;
import sushi.event.SushiEventType;
import sushi.persistence.Persistable;
import sushi.persistence.Persistor;
import sushi.user.SushiUser;
/**
* This class represents an event view.
* It saves the information needed to visualizes the occurrence of events of certain event types in a certain period of time.
*/
@Entity
@Table(name = "SushiEventView")
public class SushiEventView extends Persistable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int ID;
@ManyToMany(fetch=FetchType.EAGER)
List<SushiEventType> eventTypes;
@Column(name = "timeRadius")
@Enumerated(EnumType.STRING)
private SushiTimePeriodEnum timePeriod;
@ManyToOne
private SushiUser user;
@Override
public int getID() {
return ID;
}
/**
* Default-Constructor for JPA.
*/
private SushiEventView() {
}
/**
* Creates an event view.
* @param user
* @param eventTypes
* @param timePeriod
*/
public SushiEventView(SushiUser user, ArrayList<SushiEventType> eventTypes, SushiTimePeriodEnum timePeriod) {
this.user = user;
this.eventTypes = eventTypes;
this.timePeriod = timePeriod;
}
//Getter and Setter
public List<SushiEventType> getEventTypes() {
return eventTypes;
}
public void setEventTypes(List<SushiEventType> eventTypes) {
this.eventTypes = eventTypes;
}
public SushiTimePeriodEnum getTimePeriod() {
return timePeriod;
}
public void setTimePeriod(SushiTimePeriodEnum timePeriod) {
this.timePeriod = timePeriod;
}
public SushiUser getUser() {
return user;
}
public void setUser(SushiUser user) {
this.user = user;
}
//JPA-Methods
/**
* Finds all event views form the database.
* @return all event views
*/
public static List<SushiEventView> findAll() {
Query q = Persistor.getEntityManager().createQuery("SELECT t FROM SushiEventView t");
return q.getResultList();
}
/**
* Finds all event views that match a certain condition.
* @param columnName
* @param value
* @return event views that matches the condition
*/
private static List<SushiEventView> findByAttribute(String columnName, String value){
Query query = Persistor.getEntityManager().createNativeQuery("SELECT * FROM SushiEventView WHERE " + columnName + " = '" + value + "'", SushiEventView.class);
return query.getResultList();
}
/**
* Finds all event views that contain a certain event type.
* @param eventType
* @return event views that contain a certain event type
*/
public static List<SushiEventView> findByEventType(SushiEventType eventType){
Query query = Persistor.getEntityManager().createNativeQuery("SELECT * FROM SushiEventView WHERE ID IN ( SELECT SushiEventView_ID FROM SushiEventView_EventType WHERE eventTypes_ID = '" + eventType.getID() + "' )", SushiEventView.class);
return query.getResultList();
}
/**
* Finds an event view by ID from database.
* @param ID
* @return event view
*/
public static SushiEventView findByID(int ID){
List<SushiEventView> list = SushiEventView.findByAttribute("ID", new Integer(ID).toString());
if(list.size() > 0){
return list.get(0);
} else {
return null;
}
}
/**
* Deletes all event views from the database.
*/
public static void removeAll() {
try {
EntityTransaction entr = Persistor.getEntityManager().getTransaction();
entr.begin();
Query query = Persistor.getEntityManager().createQuery("DELETE FROM SushiEventView");
int deleteRecords = query.executeUpdate();
entr.commit();
System.out.println(deleteRecords + " records are deleted.");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}