/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.uff.ic.oceano.ostra.model;
import br.uff.ic.oceano.util.DateUtil;
import br.uff.ic.oceano.ostra.controle.DataMiningControl;
import br.uff.ic.oceano.ostra.service.DataMiningResultService;
import br.uff.ic.oceano.ostra.tools.datamining.util.DataMiningPatternComparator;
import br.uff.ic.oceano.util.NumberUtil;
import java.io.Serializable;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.Transient;
/**
*
* @author DanCastellani
*/
@NamedQueries({
@NamedQuery(name = "DataMiningResult.getAll", query = "select dmr from DataMiningResult dmr"),
@NamedQuery(name = "DataMiningResult.getToDetailById", query = "select dmr from DataMiningResult dmr left outer join fetch dmr.dataMiningPatterns where dmr.id = ?")
})
@Entity
@Table(name = "ostra_DataMiningResult")
@SequenceGenerator(name = "ostra_dataminingresult_seq", sequenceName = "ostra_dataminingresult_seq")
public class DataMiningResult implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "ostra_dataminingresult_seq")
private Long id;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date minedInTime;
@Lob
private String arff;
@Lob
private String resultData;
private String usedAlgorithmName;
private String usedAlgorithmDescription;
private Double minSupport;
private Double minConfidence;
@Transient
private Task task;
@Transient
private DataBaseSnapshot dataBaseSnapshot;
@OneToMany(mappedBy = "dataMiningResult", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<DataMiningPattern> dataMiningPatterns;
@Transient
private boolean prepared = false;
@Lob
private String description;
private String ruleMetricName;
private int numberOfInstances;
@Transient
private boolean ordered = false;
public List<String> getAttributes() {
List<String> attributes = new LinkedList<String>();
for (String line : this.getArffAsStringList()) {
if (line.startsWith("@ATTRIBUTE")) {
attributes.add(getAttribute(line));
} else if (line.startsWith("@DATA")) {
break;
}
}
return attributes;
}
private String getAttribute(String line) {
if (line.startsWith("@ATTRIBUTE")) {
String attribute = line.substring(line.indexOf(" ") + 1);
if (attribute.startsWith("\"")) {
attribute = attribute.substring(attribute.indexOf("\"") + 1);
attribute = attribute.substring(0, attribute.indexOf("\""));
} else {
attribute = attribute.split(" ")[0];
}
return attribute;
}
return null;
}
public void prepare() {
//preparation to make the dataMiningResult saveble
if (!isPrepared()) {
for (DataMiningPattern dataMiningPattern : dataMiningPatterns) {
dataMiningPattern.setDataMiningResult(this);
}
DataMiningResultService.cleanDataMiningResult(this);
prepared = true;
}
}
public int getNumberOfMinedPatterns() {
if (dataMiningPatterns == null) {
return 0;
}
return dataMiningPatterns.size();
}
/**
* This method returns the result as a list of Strings.
* Each String represents a line of the original output.
* The delimiter \n is used to break the lines
*
* @return A list of Strings representing each line of the original output
*/
public List<String> getResultAsStringList() {
StringTokenizer st = new StringTokenizer(resultData, "\n");
List<String> lines = new LinkedList<String>();
while (st.hasMoreElements()) {
lines.add(st.nextToken());
}
return lines;
}
/**
* This method arff used to mine as a list of Strings.
* Each String represents a line of the original input arff file.
* The delimiter \n is used to break the lines
*
* @return A list of Strings representing each line of the original input
*/
public List<String> getArffAsStringList() {
StringTokenizer st = new StringTokenizer(arff, "\n");
List<String> lines = new LinkedList<String>();
while (st.hasMoreElements()) {
lines.add(st.nextToken());
}
return lines;
}
public String getFormatedMinedInTime() {
return DateUtil.format(minedInTime);
}
/**
* @return the id
*/
public Long getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return the minedInTime
*/
public Date getMinedInTime() {
return minedInTime;
}
/**
* @param minedInTime the minedInTime to set
*/
public void setMinedInTime(Date minedInTime) {
this.minedInTime = minedInTime;
}
/**
* @return the arff
*/
public String getArff() {
return arff;
}
/**
* @param arff the arff to set
*/
public void setArff(String arff) {
this.arff = arff;
}
/**
* @return the result
*/
public String getResultData() {
return resultData;
}
/**
* @param result the result to set
*/
public void setResultData(String result) {
this.resultData = result;
}
/**
* @return the usedAlgorithmName
*/
public String getUsedAlgorithmName() {
return usedAlgorithmName;
}
/**
* @param usedAlgorithmName the usedAlgorithmName to set
*/
public void setUsedAlgorithmName(String usedAlgorithmName) {
this.usedAlgorithmName = usedAlgorithmName;
}
/**
* @return the usedAlgorithmDescription
*/
public String getUsedAlgorithmDescription() {
return usedAlgorithmDescription;
}
/**
* @param usedAlgorithmDescription the usedAlgorithmDescription to set
*/
public void setUsedAlgorithmDescription(String usedAlgorithmDescription) {
this.usedAlgorithmDescription = usedAlgorithmDescription;
}
/**
* @return the task
*/
public Task getTask() {
return task;
}
/**
* @param task the task to set
*/
public void setTask(Task task) {
this.task = task;
}
/**
* @return the dataBaseSnapshot
*/
public DataBaseSnapshot getDataBaseSnapshot() {
return dataBaseSnapshot;
}
/**
* @param dataBaseSnapshot the dataBaseSnapshot to set
*/
public void setDataBaseSnapshot(DataBaseSnapshot dataBaseSnapshot) {
this.dataBaseSnapshot = dataBaseSnapshot;
}
/**
* @return the dataMiningPatterns
*/
public List<DataMiningPattern> getDataMiningPatterns() {
if (!ordered) {
//order results
System.out.println("Ordenando resultados");
DataMiningPatternComparator dataMiningPatternComparator = new DataMiningPatternComparator();
dataMiningPatternComparator.orderByMetric(DataMiningControl.LIFT);
Collections.sort(dataMiningPatterns, dataMiningPatternComparator);
ordered = true;
}
return dataMiningPatterns;
}
/**
* @param dataMiningPatterns the dataMiningPatterns to set
*/
public void setDataMiningPatterns(List<DataMiningPattern> dataMiningPatterns) {
this.dataMiningPatterns = dataMiningPatterns;
}
/**
* @return the minSupport
*/
public Double getMinSupport() {
return minSupport;
}
/**
* @param minSupport the minSupport to set
*/
public void setMinSupport(Double minSupport) {
this.minSupport = minSupport;
}
/**
* @return the minConfidence
*/
public Double getMinConfidence() {
return minConfidence;
}
/**
*
* @return formated string from getMinConfidence
*/
public String getFormatedMinConfidence() {
return NumberUtil.format(getMinConfidence());
}
/**
* @param minConfidence the minConfidence to set
*/
public void setMinConfidence(Double minConfidence) {
this.minConfidence = minConfidence;
}
/**
* @return the prepared
*/
public boolean isPrepared() {
return prepared;
}
/**
* @param prepared the prepared to set
*/
public void setPrepared(boolean prepared) {
this.prepared = prepared;
}
/**
* @return the description
*/
public String getDescription() {
return description;
}
/**
* @param description the description to set
*/
public void setDescription(String description) {
this.description = description;
}
/**
* @return the numberOfInstances
*/
public int getNumberOfInstances() {
return numberOfInstances;
}
/**
* @param numberOfInstances the numberOfInstances to set
*/
public void setNumberOfInstances(int numberOfInstances) {
this.numberOfInstances = numberOfInstances;
}
/**
* @return the ruleMetricName
*/
public String getRuleMetricName() {
return ruleMetricName;
}
/**
* @param ruleMetricName the ruleMetricName to set
*/
public void setRuleMetricName(String ruleMetricName) {
this.ruleMetricName = ruleMetricName;
}
}