/**
* <copyright> </copyright>
*
* $Id$
*/
package org.talend.dataquality.indicators.impl;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.talend.dataquality.helpers.IndicatorHelper;
import org.talend.dataquality.indicators.IndicatorsPackage;
import org.talend.dataquality.indicators.UniqueCountIndicator;
import org.talend.dataquality.indicators.mapdb.AbstractDB;
import org.talend.dataquality.indicators.mapdb.DBSet;
import org.talend.dataquality.indicators.mapdb.StandardDBName;
/**
* <!-- begin-user-doc --> An implementation of the model object '<em><b>Unique Count Indicator</b></em>'. <!--
* end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.talend.dataquality.indicators.impl.UniqueCountIndicatorImpl#getUniqueValueCount <em>Unique Value Count</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class UniqueCountIndicatorImpl extends IndicatorImpl implements UniqueCountIndicator {
/**
* The default value of the '{@link #getUniqueValueCount() <em>Unique Value Count</em>}' attribute. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @see #getUniqueValueCount()
* @generated
* @ordered
*/
protected static final Long UNIQUE_VALUE_COUNT_EDEFAULT = null;
/**
* The cached value of the '{@link #getUniqueValueCount() <em>Unique Value Count</em>}' attribute. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @see #getUniqueValueCount()
* @generated
* @ordered
*/
protected Long uniqueValueCount = UNIQUE_VALUE_COUNT_EDEFAULT;
private Set<Object> distintObjects = null;
private Set<Object> duplicateObjects = null;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
protected UniqueCountIndicatorImpl() {
super();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return IndicatorsPackage.Literals.UNIQUE_COUNT_INDICATOR;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public Set<Object> getUniqueValues() {
// TODO: implement this method
// Ensure that you remove @generated or mark it @generated NOT
throw new UnsupportedOperationException();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case IndicatorsPackage.UNIQUE_COUNT_INDICATOR__UNIQUE_VALUE_COUNT:
return getUniqueValueCount();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case IndicatorsPackage.UNIQUE_COUNT_INDICATOR__UNIQUE_VALUE_COUNT:
setUniqueValueCount((Long)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case IndicatorsPackage.UNIQUE_COUNT_INDICATOR__UNIQUE_VALUE_COUNT:
setUniqueValueCount(UNIQUE_VALUE_COUNT_EDEFAULT);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case IndicatorsPackage.UNIQUE_COUNT_INDICATOR__UNIQUE_VALUE_COUNT:
return UNIQUE_VALUE_COUNT_EDEFAULT == null ? uniqueValueCount != null : !UNIQUE_VALUE_COUNT_EDEFAULT.equals(uniqueValueCount);
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public String toString() {
StringBuffer result = new StringBuffer(this.getName());
result.append("= ");
result.append(uniqueValueCount);
return result.toString();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public Long getUniqueValueCount() {
return uniqueValueCount;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public void setUniqueValueCount(Long newUniqueValueCount) {
Long oldUniqueValueCount = uniqueValueCount;
uniqueValueCount = newUniqueValueCount;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, IndicatorsPackage.UNIQUE_COUNT_INDICATOR__UNIQUE_VALUE_COUNT, oldUniqueValueCount, uniqueValueCount));
}
/*
* (non-Javadoc)
*
* @see org.talend.dataquality.indicators.impl.IndicatorImpl#storeSqlResults(java.lang.Object[])
*
* ADDED scorreia 2008-04-30 storeSqlResults(List<Object[]> objects)
*/
@Override
public boolean storeSqlResults(List<Object[]> objects) {
if (!checkResults(objects, 1)) {
return false;
}
// MOD gdbu 2011-4-14 bug : 18975
this.setUniqueValueCount(IndicatorHelper.getLongFromObject(objects.get(0)[0]));
// ~18975
return true;
}
/*
* (non-Javadoc)
*
* @see org.talend.dataquality.indicators.impl.IndicatorImpl#getIntegerValue()
*
* ADDED scorreia 2008-05-12 getIntegerValue()
*/
@Override
public Long getIntegerValue() {
return this.getUniqueValueCount();
}
@Override
public boolean finalizeComputation() {
clearDrillDownData();
this.setUniqueValueCount(Long.valueOf(distintObjects.size() - duplicateObjects.size()));
return super.finalizeComputation();
}
/**
* Remove duplicate object from drill down map
*
*
*/
private void clearDrillDownData() {
if (!isUsedMapDBMode() || !checkAllowDrillDown()) {
return;
}
Iterator<Object> iterator = duplicateObjects.iterator();
while (iterator.hasNext()) {
drillDownMap.remove(iterator.next());
drillDownRowCount--;
}
// remove some items because limit
if (!this.checkMustStoreCurrentRow()) {
Iterator<Object> desIterator = drillDownMap.descendingKeySet().iterator();
// Here is remove operation so that we need to use drillDownRowCount - 1 be parameter
while (desIterator.hasNext() && !this.checkMustStoreCurrentRow(drillDownRowCount - 1)) {
Object currenKey = desIterator.next();
drillDownMap.remove(currenKey);
drillDownRowCount--;
}
}
}
@Override
public boolean handle(Object data) {
super.handle(data);
if (data != null) {
if (this.distintObjects.add(data)) {
this.mustStoreRow = true;
} else {
// store duplicate objects
duplicateObjects.add(data);
}
}
return true;
}
@Override
public boolean reset() {
this.uniqueValueCount = UNIQUE_VALUE_COUNT_EDEFAULT;
if (isUsedMapDBMode()) {
distintObjects = initValueForDBSet(StandardDBName.computeProcessSet.name());
if (distintObjects != null) {
((DBSet<Object>) distintObjects).clear();
}
duplicateObjects = initValueForDBSet(StandardDBName.temp.name());
if (duplicateObjects != null) {
((DBSet<Object>) duplicateObjects).clear();
}
} else {
this.distintObjects.clear();
this.duplicateObjects.clear();
}
return super.reset();
}
/*
* (non-Javadoc)
*
* @see org.talend.dataquality.indicators.impl.IndicatorImpl#getMapDB(java.lang.String)
*/
@Override
public AbstractDB<Object> getMapDB(String dbName) {
if (isUsedMapDBMode()) {
// is get computeProcess map
if (StandardDBName.computeProcess.name().equals(dbName)) {
// current set is invalid
if (needReconnect((DBSet<Object>) distintObjects)) {
// create new DBSet
return initValueForDBSet(StandardDBName.computeProcessSet.name());
} else {
return (DBSet<Object>) distintObjects;
}
// the key is view values case so do this translate
} else if (StandardDBName.drillDownValues.name().equals(dbName)) {
return super.getMapDB(StandardDBName.drillDown.name());
}
}
return super.getMapDB(dbName);
}
/*
* (non-Javadoc)
*
* @see org.talend.dataquality.indicators.mapdb.MapDBDrillDown#handleDrillDownData(java.lang.Object, java.util.List)
*/
@Override
public void handleDrillDownData(Object masterObject, List<Object> inputRowList) {
drillDownRowCount++;
drillDownMap.put(masterObject, inputRowList);
}
} // UniqueCountIndicatorImpl