/**
* <copyright> </copyright>
*
* $Id$
*/
package org.talend.dataquality.indicators.impl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.talend.dataquality.PluginConstant;
import org.talend.dataquality.domain.Domain;
import org.talend.dataquality.domain.RangeRestriction;
import org.talend.dataquality.domain.sql.SqlPredicate;
import org.talend.dataquality.helpers.DomainHelper;
import org.talend.dataquality.indicators.BinFrequencyIndicator;
import org.talend.dataquality.indicators.IndicatorsPackage;
/**
* <!-- begin-user-doc --> An implementation of the model object '<em><b>Bin Frequency Indicator</b></em>'. <!--
* end-user-doc -->
* <p>
* </p>
*
* @generated
*/
public class BinFrequencyIndicatorImpl extends FrequencyIndicatorImpl implements BinFrequencyIndicator {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
protected BinFrequencyIndicatorImpl() {
super();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return IndicatorsPackage.Literals.BIN_FREQUENCY_INDICATOR;
}
/*
* (non-Javadoc)
*
* @see org.talend.dataquality.indicators.impl.FrequencyIndicatorImpl#handle(java.lang.Object)
*/
@Override
public boolean handle(Object data) {
// if the bin parameter is set,look range name as frequency Map key.
if (parameters != null) {
Domain bins = parameters.getBins();
if (bins != null) {
String binFreqKey = getGroupLabel(data);
// except null if the bin parameteris set.
if (binFreqKey == null) {
return true;
}
return super.handle(binFreqKey);
}
}
return super.handle(data);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataquality.indicators.impl.FrequencyIndicatorImpl#specialName(java.lang.Object)
*/
@Override
protected String getFrequencyLabel(Object name) {
String specialName = getGroupLabel(name);
if (specialName != null) {
return specialName;
} else {
return super.getFrequencyLabel(name);
}
}
/*
* (non-Javadoc)
*
* if the bin parameter is set,look range name as a new name.
*/
protected String getGroupLabel(Object name) {
if (name == null) {
return null;
}
if (parameters != null) {
Domain bins = parameters.getBins();
if (bins != null) {
EList<RangeRestriction> ranges = bins.getRanges();
for (RangeRestriction range : ranges) {
double minRealValue = DomainHelper.getRealValue(range.getLowerValue());
double maxRealValue = DomainHelper.getRealValue(range.getUpperValue());
double inputValue = Double.valueOf(name.toString());
if (minRealValue <= inputValue && inputValue < maxRealValue) {
return range.getName();
}
}
// if the data(name) is not in these ranges,return null and ignor it.
return null;
}
}
return name.toString();
}
/**
* if this range isn't computed by any data,put it(value is 0) to the map.so that it is displayed in result page.
*/
@Override
public boolean finalizeComputation() {
if (parameters == null || parameters.getBins() == null) {
return super.finalizeComputation();
}
EList<RangeRestriction> ranges = parameters.getBins().getRanges();
for (RangeRestriction range : ranges) {
String rangeName = range.getName();
if (getMapForFreq().get(rangeName) == null) {
getMapForFreq().put(rangeName, 0l);
}
}
return super.finalizeComputation();
}
/**
* if it has bin parameters and the range name is null,set it by concating min/max values.
*/
@Override
public boolean reset() {
if (parameters == null || parameters.getBins() == null) {
return super.reset();
}
EList<RangeRestriction> ranges = parameters.getBins().getRanges();
for (RangeRestriction range : ranges) {
if (range.getName() == null) {
double minRealValue = DomainHelper.getRealValue(range.getLowerValue());
double maxRealValue = DomainHelper.getRealValue(range.getUpperValue());
String rangeName = analyzedElement.getName() + PluginConstant.SPACE_STRING
+ SqlPredicate.GREATER_EQUAL.getLiteral() + PluginConstant.SPACE_STRING + minRealValue + " AND "
+ analyzedElement.getName() + PluginConstant.SPACE_STRING + SqlPredicate.LESS.getLiteral()
+ PluginConstant.SPACE_STRING + maxRealValue;
range.setName(rangeName);
}
}
return super.reset();
}
} // BinFrequencyIndicatorImpl