package sushi.transformation;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MapKey;
import javax.persistence.MapKeyColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Query;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import sushi.event.SushiEventType;
import sushi.persistence.Persistable;
import sushi.persistence.Persistor;
import sushi.transformation.collection.SushiPatternTree;
import sushi.transformation.element.externalknowledge.ExternalKnowledgeExpressionSet;
/**
*
* Contains all objects that are required for event transformation.
* Transformation rules are unique by the event type of the transformed events
* and the user-defined title of the transformation rule.
*
*/
@Entity
@Table(
name = "TransformationRule",
uniqueConstraints = {
@UniqueConstraint(columnNames = {"eventType", "title"})
}
)
public class TransformationRule extends Persistable {
private static final long serialVersionUID = 6601905480228417174L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "transformationRuleID")
private int ID;
@JoinColumn(name = "EventType")
@ManyToOne
private SushiEventType eventType;
@Column(name = "Title")
private String title;
@Column(name = "Query", length=15000)
private String query;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PatternTreeID")
private SushiPatternTree patternTree;
@ElementCollection
@MapKeyColumn(name = "attributeIdentifier")
@CollectionTable(name="AttributeIdentifiersAndExpressions", joinColumns = @JoinColumn(name="AttributeIdentifiersAndExpressionsID"))
private Map<String, String> attributeIdentifiersAndExpressions;
@OneToMany(mappedBy = "transformationRule", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@MapKey(name = "attributeExpression")
private Map<String, ExternalKnowledgeExpressionSet> attributeIdentifiersAndExternalKnowledgeExpressionSets;
public TransformationRule() {
this.ID = 0;
this.title = "";
this.eventType = null;
this.query = "";
this.patternTree = null;
this.attributeIdentifiersAndExpressions = new HashMap<String, String>();
this.attributeIdentifiersAndExternalKnowledgeExpressionSets = new HashMap<String, ExternalKnowledgeExpressionSet>();
}
/**
* Constructor for transformation rules created in the basic rule editor.
*
* @param eventType event type of the transformed events
* @param title name of the transformation rule
* @param query Esper query that is used to listen for incoming events and to create the transformed events
*/
public TransformationRule(SushiEventType eventType, String title, String query) {
this();
this.eventType = eventType;
this.title = title;
this.query = query;
}
/**
* Constructor for transformation rules created in the advanced rule editor.
*
* @param eventType event type of the transformed events
* @param title name of the transformation rule
* @param patternTree pattern that is used to listen for events, built up from the provided elements
* @param attributeIdentifiersAndExpressions pairs of attribute identifiers and expressions - determines what values are stored in the transformed events
* @param attributeIdentifiersAndExpressionSets pairs of attribute identifiers and sets of expressions determining the fetch of external knowledge
*/
public TransformationRule(SushiEventType eventType, String title, SushiPatternTree patternTree, Map<String, String> attributeIdentifiersAndExpressions, Map<String, ExternalKnowledgeExpressionSet> attributeIdentifiersAndExpressionSets) {
this(eventType, title, null);
this.patternTree = patternTree;
this.attributeIdentifiersAndExpressions = attributeIdentifiersAndExpressions;
this.attributeIdentifiersAndExternalKnowledgeExpressionSets = attributeIdentifiersAndExpressionSets;
}
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public SushiEventType getEventType() {
return eventType;
}
public void setEventType(SushiEventType eventType) {
this.eventType = eventType;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getQuery() {
if (query == null) {
query = EsperTransformationRuleParser.getInstance().parseRule(patternTree, attributeIdentifiersAndExpressions, attributeIdentifiersAndExternalKnowledgeExpressionSets);
}
return query;
}
public void setQuery(String query) {
this.query = query;
}
public SushiPatternTree getPatternTree() {
return patternTree;
}
public void setPatternTree(SushiPatternTree patternTree) {
this.patternTree = patternTree;
}
public Map<String, String> getAttributeIdentifiersAndExpressions() {
return attributeIdentifiersAndExpressions;
}
public void setAttributeIdentifiersAndExpressions(Map<String, String> attributeIdentifiersAndExpressions) {
this.attributeIdentifiersAndExpressions = attributeIdentifiersAndExpressions;
}
public Map<String, ExternalKnowledgeExpressionSet> getAttributeIdentifiersWithExternalKnowledge() {
return attributeIdentifiersAndExternalKnowledgeExpressionSets;
}
public void setAttributeIdentifiersAndExpressionSets(Map<String, ExternalKnowledgeExpressionSet> attributeIdentifiersAndExpressionSets) {
this.attributeIdentifiersAndExternalKnowledgeExpressionSets = attributeIdentifiersAndExpressionSets;
}
@Override
public TransformationRule save() {
for (String attributeIdentifer : attributeIdentifiersAndExternalKnowledgeExpressionSets.keySet()) {
if (attributeIdentifiersAndExternalKnowledgeExpressionSets.get(attributeIdentifer).getTransformationRule() == null) {
attributeIdentifiersAndExternalKnowledgeExpressionSets.get(attributeIdentifer).setTransformationRule(this);
}
}
return (TransformationRule) super.save();
}
@Override
public TransformationRule remove() {
return (TransformationRule) super.remove();
}
public static List<TransformationRule> findAll() {
Query q = Persistor.getEntityManager().createQuery("SELECT t FROM TransformationRule t", TransformationRule.class);
return q.getResultList();
}
public static List<TransformationRule> findByEventType(SushiEventType eventType) {
EntityManager em = Persistor.getEntityManager();
em.clear();
/* the ID of the eventType is stored in the database, not the whole SushiEventType */
Query query = em.createNativeQuery("SELECT * FROM TransformationRule WHERE EventType = " + eventType.getID(), TransformationRule.class);
try {
return (List<TransformationRule>) query.getResultList();
} catch (Exception e) {
return null;
}
}
public static TransformationRule findByEventTypeAndTitle(String eventTypeName, String title) {
EntityManager em = Persistor.getEntityManager();
/* the ID of the eventType is stored in the database, not the whole SushiEventType */
em.clear();
Query query = em.createNativeQuery("SELECT * FROM TransformationRule WHERE EventType = (SELECT ID FROM EventType WHERE TypeName = '" + eventTypeName + "') AND Title = '" + title + "'", TransformationRule.class);
try {
return (TransformationRule) query.getResultList().get(0);
} catch (Exception e) {
return null;
}
}
}