// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataquality.record.linkage.ui.section;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.talend.dataquality.PluginConstant;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.indicators.columnset.RecordMatchingIndicator;
import org.talend.dataquality.record.linkage.constant.RecordMatcherType;
import org.talend.dataquality.record.linkage.ui.composite.chart.DuplicateRecordPieChart;
import org.talend.dataquality.record.linkage.ui.composite.tableviewer.DuplicateRecordTableViewer;
import org.talend.dataquality.record.linkage.ui.composite.tableviewer.provider.DuplicateStatisticsRow;
import org.talend.dataquality.record.linkage.ui.composite.utils.MatchRuleAnlaysisUtils;
import org.talend.dataquality.record.linkage.ui.i18n.internal.DefaultMessagesImpl;
import org.talend.utils.format.StringFormatUtil;
/**
* created by zhao on Aug 19, 2013 Duplicate record statistics section.
*
*/
public class DuplicateRecordStatisticsSection extends AbstractMatchAnaysisTableSection {
private DuplicateRecordTableViewer duplicateRecordTableViewer = null;
private DuplicateRecordPieChart duplicateRecordPieChart = null;
private Label mergedRecordsValue = null;
/**
* DOC zhao DuplicateRecordStatisticsSection constructor comment.
*
* @param form
* @param parent
* @param style
* @param toolkit
* @param analysis
*/
public DuplicateRecordStatisticsSection(ScrolledForm form, Composite parent, int style, FormToolkit toolkit, Analysis analysis) {
super(form, parent, style, toolkit, analysis);
}
/**
* DOC zhao Comment method "setDupRecTableInput".
*/
private void setDupRecordTableInput() {
RecordMatchingIndicator recordMatchingIndicator = MatchRuleAnlaysisUtils.getRecordMatchIndicatorFromAna(analysis);
// Row count
Long rowCount = recordMatchingIndicator.getCount();
// Compute row count.
DuplicateStatisticsRow rowCountRow = new DuplicateStatisticsRow();
rowCountRow.setIsRowCount(Boolean.TRUE);
rowCountRow.setLabel(DefaultMessagesImpl.getString("DuplicateRecordStatisticsSection.ROW_COUNT")); //$NON-NLS-1$
rowCountRow.setCount(rowCount);
setPercentage(rowCount, rowCount, rowCountRow);
// Unique records
DuplicateStatisticsRow uniqueRow = new DuplicateStatisticsRow();
uniqueRow.setLabel(DefaultMessagesImpl.getString("DuplicateRecordStatisticsSection.UNIQUE_RECORDS")); //$NON-NLS-1$
Long uniqueCount = rowCount - recordMatchingIndicator.getSuspectRecordCount()
- recordMatchingIndicator.getMatchedRecordCount();
uniqueRow.setCount(uniqueCount);
setPercentage(uniqueCount, rowCount, uniqueRow);
// Matched records.
DuplicateStatisticsRow matchedRow = new DuplicateStatisticsRow();
matchedRow.setLabel(DefaultMessagesImpl.getString("DuplicateRecordStatisticsSection.MATCHED_RECORDS")); //$NON-NLS-1$
matchedRow.setCount(recordMatchingIndicator.getMatchedRecordCount());
setPercentage(recordMatchingIndicator.getMatchedRecordCount(), rowCount, matchedRow);
// Suspect records.
DuplicateStatisticsRow suspectRow = new DuplicateStatisticsRow();
suspectRow.setLabel(DefaultMessagesImpl.getString("DuplicateRecordStatisticsSection.SUSPECT_RECORDS")); //$NON-NLS-1$
suspectRow.setCount(recordMatchingIndicator.getSuspectRecordCount());
setPercentage(recordMatchingIndicator.getSuspectRecordCount(), rowCount, suspectRow);
List<DuplicateStatisticsRow> duplStatsRowList = new ArrayList<DuplicateStatisticsRow>();
duplStatsRowList.add(rowCountRow);
duplStatsRowList.add(uniqueRow);
duplStatsRowList.add(matchedRow);
duplStatsRowList.add(suspectRow);
duplicateRecordTableViewer.setInput(duplStatsRowList);
}
/**
* DOC zhao Comment method "setPercentage".
*
* @param recordMatchingIndicator
* @param rowCount
* @param statsRow
*/
private void setPercentage(Long count, Long rowCount, DuplicateStatisticsRow statsRow) {
if (rowCount != 0) {
double percValue = Double.valueOf(count) / Double.valueOf(rowCount);
String formatedStr = StringFormatUtil.format(percValue, StringFormatUtil.PERCENT).toString();
statsRow.setPercentage(formatedStr);
} else {
statsRow.setPercentage(PluginConstant.NA_STRING);
}
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#createSubChart(org.eclipse.
* swt.widgets.Composite)
*/
@Override
protected void createSubChart(Composite sectionClient) {
duplicateRecordPieChart = new DuplicateRecordPieChart(sectionClient);
List<DuplicateStatisticsRow> dupStatistics = (List<DuplicateStatisticsRow>) duplicateRecordTableViewer.getInput();
duplicateRecordPieChart.createPieChart(dupStatistics);
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#createSubContent(org.eclipse
* .swt.widgets.Composite)
*/
@Override
protected Composite createSubContent(Composite sectionClient) {
duplicateRecordTableViewer = new DuplicateRecordTableViewer(sectionClient, SWT.NONE);
setDupRecordTableInput();
// Add the merged records information: only for T-swoosh
final Object[] IndicatorList = MatchRuleAnlaysisUtils.getNeedIndicatorFromAna(analysis);
final RecordMatchingIndicator recordMatchingIndicator = (RecordMatchingIndicator) IndicatorList[0];
if (recordMatchingIndicator.getBuiltInMatchRuleDefinition().getRecordLinkageAlgorithm()
.equals(RecordMatcherType.T_SwooshAlgorithm.name())) {
Composite mergedRecordComp = new Composite(sectionClient, SWT.NONE);
mergedRecordComp.setLayout(new GridLayout(2, true));
Label mergedRcdLabel = new Label(mergedRecordComp, SWT.NONE);
mergedRcdLabel.setText(DefaultMessagesImpl.getString("DuplicateRecordStatisticsSection.MergedRecord")); //$NON-NLS-1$
mergedRecordsValue = new Label(mergedRecordComp, SWT.NONE);
Long mergedRecordsCount = computeMergedRecords();
mergedRecordsValue.setText(mergedRecordsCount.toString());
}
return sectionClient;
}
/**
* DOC zhao Comment method "computeMergedRecords".
*
* @return
*/
private Long computeMergedRecords() {
RecordMatchingIndicator recordMatchingIndicator = MatchRuleAnlaysisUtils.getRecordMatchIndicatorFromAna(analysis);
Map<Object, Long> g2f = recordMatchingIndicator.getGroupSize2groupFrequency();
Iterator<Object> groupSizeIterator = g2f.keySet().iterator();
Long mergedRecordsCount = 0l;
while (groupSizeIterator.hasNext()) {
Object groupSize = groupSizeIterator.next();
if (Long.valueOf(groupSize.toString()) > 1) {
Long groupFreq = g2f.get(groupSize);
// Merged records
mergedRecordsCount += groupFreq;
}
}
return mergedRecordsCount;
}
/*
* (non-Javadoc)
*
* @see org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#getSectionName()
*/
@Override
protected String getSectionName() {
return DefaultMessagesImpl.getString("MatchAnalysisResultPage.DUP_REC_STATS_NAME"); //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#refreshChart()
*/
@Override
public void refreshChart() {
// Refresh table
setDupRecordTableInput();
List<DuplicateStatisticsRow> dupStatistics = (List<DuplicateStatisticsRow>) duplicateRecordTableViewer.getInput();
duplicateRecordPieChart.refreshChart(dupStatistics);
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#isKeyDefinitionAdded(java.lang
* .String)
*/
@Override
public Boolean isKeyDefinitionAdded(String columnName) throws Exception {
// no implementation
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.dataquality.record.linkage.ui.section.AbstractMatchAnaysisTableSection#createButtons(org.eclipse.swt
* .widgets.Composite)
*/
@Override
protected void createButtons(Composite sectionClient) {
// No implementation
}
}