package rainbownlp.machinelearning;
import java.util.HashMap;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.Session;
import org.hibernate.annotations.GenericGenerator;
import rainbownlp.core.FeatureValuePair;
import rainbownlp.util.HibernateUtil;
@Entity
@Table( name = "MLExampleFeature" )
public class MLExampleFeature {
private Integer exampleFeatureId;
private MLExample relatedExample;
private FeatureValuePair featureValuePair;
public MLExampleFeature()
{
}
public void setExampleFeatureId(Integer _artifactFeatureId) {
this.exampleFeatureId = _artifactFeatureId;
}
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public Integer getExampleFeatureId() {
return exampleFeatureId;
}
public void setRelatedExample(MLExample relatedExample) {
this.relatedExample = relatedExample;
}
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinColumn(name="relatedExample")
public MLExample getRelatedExample() {
return relatedExample;
}
public void setFeatureValuePair(FeatureValuePair _featureValuePair) {
featureValuePair = _featureValuePair;
}
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@JoinColumn(name="featureValuePair")
public FeatureValuePair getFeatureValuePair() {
return featureValuePair;
}
public synchronized static MLExampleFeature setFeatureExample(MLExample pExample,
FeatureValuePair pNewFeature) {
if(pNewFeature.getFeatureValueAuxiliary()!=null)
//is multi value
deleteExampleFeatures(pExample, pNewFeature.getFeatureName()
,pNewFeature.getFeatureValue());
else
deleteExampleFeatures(pExample, pNewFeature.getFeatureName());
MLExampleFeature artifact_feature = new MLExampleFeature();
artifact_feature.setFeatureValuePair(pNewFeature);
artifact_feature.setRelatedExample(pExample);
Session session = HibernateUtil.sessionFactory.openSession();
HibernateUtil.save(artifact_feature, session);
session.clear();
session.close();
return artifact_feature;
}
private static void deleteExampleFeatures(MLExample pExample,
String featureName, String featureValue) {
Session session = HibernateUtil.sessionFactory.openSession();
session.beginTransaction();
String hql = "from MLExampleFeature af where af.relatedExample = " +
pExample.getExampleId()+" AND "+
"af.featureValuePair.featureName = :featureName"+
" AND af.featureValuePair.featureValue = :featureValue";
List<MLExampleFeature> artifact_feature_list =
session.createQuery(hql).setParameter("featureValue", featureValue)
.setParameter("featureName", featureName).list();
for(MLExampleFeature af : artifact_feature_list)
session.delete(af);
session.getTransaction().commit();
session.close();
}
/*
* delete all attribute name for an specific artifact
*/
public static void deleteExampleFeatures(MLExample pExample,
String featureName) {
String hql = "from MLExampleFeature as af inner join fetch af.featureValuePair " +
"where af.relatedExample = " +
pExample.getExampleId()+" AND "+
"af.featureValuePair.featureName = :featureName";
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("featureName", featureName);
Session session = HibernateUtil.sessionFactory.openSession();
List<MLExampleFeature> artifact_feature_list =
(List<MLExampleFeature>) HibernateUtil.executeReader(hql, params,null, session);
if(artifact_feature_list.size()>0)
{
String example_feature_ids = "";
for(MLExampleFeature af : artifact_feature_list)
example_feature_ids=example_feature_ids.concat(af.getExampleFeatureId()+",");
example_feature_ids = example_feature_ids.replaceAll(",$", "");
HibernateUtil.executeNonReader("delete from MLExampleFeature where exampleFeatureId in ("+
example_feature_ids+")");
}
session.close();
}
/*
* delete all attribute name for an specific artifact
*/
public static void deleteExampleFeatures(MLExample pExample) {
String hql = "from MLExampleFeature as af inner join fetch af.featureValuePair " +
"where af.relatedExample = " +
pExample.getExampleId();
Session session = HibernateUtil.sessionFactory.openSession();
List<MLExampleFeature> artifact_feature_list =
(List<MLExampleFeature>) HibernateUtil.executeReader(hql, null,null, session);
if(artifact_feature_list.size()>0)
{
String example_feature_ids = "";
for(MLExampleFeature af : artifact_feature_list)
example_feature_ids=example_feature_ids.concat(af.getExampleFeatureId()+",");
example_feature_ids = example_feature_ids.replaceAll(",$", "");
HibernateUtil.executeNonReader("delete from MLExampleFeature where exampleFeatureId in ("+
example_feature_ids+")");
}
session.close();
}
@Override public String toString()
{
return " Example = "+relatedExample.toString()+
" / Feature = "+
featureValuePair.toString();
}
@Transient
public static void truncateTable()
{
String hql = "delete from MLExampleFeature";
HibernateUtil.executeNonReader(hql);
}
}