// ============================================================================
//
// 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.dataprofiler.core.ui.utils;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.talend.commons.emf.FactoriesUtil;
import org.talend.core.model.general.Project;
import org.talend.dataprofiler.common.ui.editor.preview.CustomerDefaultCategoryDataset;
import org.talend.dataprofiler.core.model.dynamic.DynamicIndicatorModel;
import org.talend.dataprofiler.core.ui.editor.preview.model.dataset.CustomerDefaultBAWDataset;
import org.talend.dataprofiler.core.ui.editor.preview.model.states.SummaryStatisticsState;
import org.talend.dataprofiler.core.ui.events.BenfordFrequencyDynamicChartEventReceiver;
import org.talend.dataprofiler.core.ui.events.DynamicBAWChartEventReceiver;
import org.talend.dataprofiler.core.ui.events.DynamicChartEventReceiver;
import org.talend.dataprofiler.core.ui.events.EventEnum;
import org.talend.dataprofiler.core.ui.events.EventManager;
import org.talend.dataprofiler.core.ui.events.EventReceiver;
import org.talend.dataprofiler.core.ui.events.FrequencyDynamicChartEventReceiver;
import org.talend.dataprofiler.core.ui.events.PatternDynamicChartEventReceiver;
import org.talend.dataquality.indicators.Indicator;
import org.talend.dq.helper.ProxyRepositoryManager;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.indicators.preview.EIndicatorChartType;
import org.talend.dq.nodes.DQRepositoryNode;
import org.talend.dq.nodes.indicator.type.IndicatorEnum;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryNode.ENodeType;
import org.talend.resource.EResourceConstant;
import org.talend.resource.ResourceManager;
import org.talend.resource.ResourceService;
/**
* the Analysis's utility class which associated with UI.
*/
public class AnalysisUtils {
/**
* used for table analysis-- select dq rules, add filter for match rule folder TDQ-8001
*
* @return
*/
public static ViewerFilter createRuleFilter() {
return new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IFile) {
IFile file = (IFile) element;
if (FactoriesUtil.DQRULE.equals(file.getFileExtension())) {
return true;
}
} else if (element instanceof IFolder) {
IFolder folder = (IFolder) element;
// filter the match rule folder in table analysis
if (EResourceConstant.RULES_MATCHER.getName().equals(folder.getName())) {
return false;
}// ~
return ResourceService.isSubFolder(ResourceManager.getRulesFolder(), folder);
}
return false;
}
};
}
/**
* create a DynamicChart Event Receiver, according to its type
*
* @param categoryDataset
* @param index
* @param oneIndicator
* @param eIndicatorChartType
* @return
*/
public static DynamicChartEventReceiver createDynamicChartEventReceiver(DynamicIndicatorModel indicatorModel, int index,
Indicator oneIndicator) {
DynamicChartEventReceiver eReceiver = null;
if (isBenford(indicatorModel.getChartType())) {
eReceiver = new BenfordFrequencyDynamicChartEventReceiver();
((BenfordFrequencyDynamicChartEventReceiver) eReceiver).setSecondDataset(indicatorModel.getSecondDataset());
} else if (isFrequency(indicatorModel.getChartType())) {
//TDQ-12870, should clear the last result
oneIndicator.setCount(0l);
eReceiver = new FrequencyDynamicChartEventReceiver();
} else if (isPattern(indicatorModel.getChartType())) {
eReceiver = new PatternDynamicChartEventReceiver();
} else {
eReceiver = new DynamicChartEventReceiver();
}
eReceiver.setDataset(indicatorModel.getDataset());
eReceiver.setIndexInDataset(index);
eReceiver.setIndicatorName(oneIndicator.getName());
eReceiver.setIndicator(oneIndicator);
return eReceiver;
}
/**
* Judge whether chartType is pattern
*
* @param chartType
* @return true when chart type is sql pattern regex pattern or udi matching
*/
private static boolean isPattern(EIndicatorChartType chartType) {
switch (chartType) {
case SQL_PATTERN_MATCHING:
case PATTERN_MATCHING:
case UDI_MATCHING:
return true;
default:
break;
}
return false;
}
/**
* DOC yyin Comment method "isBenford".
*
* @param eIndicatorChartType
* @return
*/
@SuppressWarnings("incomplete-switch")
private static boolean isFrequency(EIndicatorChartType eIndicatorChartType) {
switch (eIndicatorChartType) {
case BIN_FREQUENCE_STATISTICS:
case BIN_LOW_FREQUENCE_STATISTICS:
case DATE_FREQUENCE_STATISTICS:
case DATE_LOW_FREQUENCE_STATISTICS:
case FREQUENCE_STATISTICS:
case LOW_FREQUENCE_STATISTICS:
case SOUNDEX_FREQUENCY_TABLE:
case SOUNDEX_LOW_FREQUENCY_TABLE:
case UDI_FREQUENCY:
case WEEK_FREQUENCE_STATISTICS:
case WEEK_LOW_FREQUENCE_STATISTICS:
case MONTH_FREQUENCE_STATISTICS:
case MONTH_LOW_FREQUENCE_STATISTICS:
case QUARTER_FREQUENCE_STATISTICS:
case QUARTER_LOW_FREQUENCE_STATISTICS:
case YEAR_FREQUENCE_STATISTICS:
case YEAR_LOW_FREQUENCE_STATISTICS:
case MODE_INDICATOR:
case PATTERN_FREQUENCE_STATISTICS:
case EAST_ASIA_PATTERN_FREQUENCE_STATISTICS:
case EAST_ASIA_PATTERN_LOW_FREQUENCE_STATISTICS:
case PATTERN_LOW_FREQUENCE_STATISTICS:
return true;
}
return false;
}
/**
* DOC yyin Comment method "isFrequency".
*
* @param eIndicatorChartType
* @return
*/
private static boolean isBenford(EIndicatorChartType eIndicatorChartType) {
if (EIndicatorChartType.BENFORD_LAW_STATISTICS.equals(eIndicatorChartType)) {
return true;
}
return false;
}
/**
* DOC yyin Comment method "createDynamicBAWChartEventReceiver".
*
* @param oneCategoryIndicatorModel
* @param categoryDataset
* @return
*/
public static DynamicBAWChartEventReceiver createDynamicBAWChartEventReceiver(
DynamicIndicatorModel oneCategoryIndicatorModel, Map<Indicator, EventReceiver> eventReceivers) {
DynamicBAWChartEventReceiver bawReceiver = new DynamicBAWChartEventReceiver();
Object categoryDataset = oneCategoryIndicatorModel.getDataset();
if (categoryDataset instanceof CustomerDefaultBAWDataset) {
// all summary selected
bawReceiver.setBawDataset((CustomerDefaultBAWDataset) categoryDataset);
} else {
// not-all summary selected
bawReceiver.setDataset(categoryDataset);
}
bawReceiver.setBAWparentComposite(oneCategoryIndicatorModel.getBawParentChartComp());
bawReceiver.setTableViewer(oneCategoryIndicatorModel.getTableViewer());
int index = 0;
int length = oneCategoryIndicatorModel.getSummaryIndicators().size();
for (Indicator oneIndicator : oneCategoryIndicatorModel.getSummaryIndicators()) {
DynamicChartEventReceiver eReceiver = bawReceiver.createEventReceiver(
IndicatorEnum.findIndicatorEnum(oneIndicator.eClass()), oneIndicator);
eReceiver.setTableViewer(oneCategoryIndicatorModel.getTableViewer());
eReceiver.setEntityIndex(index++);
if (SummaryStatisticsState.FULL_FLAG != length) {
eReceiver.setDataset(categoryDataset);
}
eReceiver.clearValue();
eventReceivers.put(oneIndicator, eReceiver);
EventManager.getInstance().register(oneIndicator, EventEnum.DQ_DYMANIC_CHART, eReceiver);
}
bawReceiver.clearValue();
return bawReceiver;
}
/**
* create a Dynamic Model for one category of indicators, who related to the same chart.
*
* @param chartType
* @param indicators
* @param chart
* @return
*/
public static DynamicIndicatorModel createDynamicModel(EIndicatorChartType chartType, List<Indicator> indicators, Object chart) {
DynamicIndicatorModel dyModel = new DynamicIndicatorModel();
// one dataset <--> several indicators in same category
if (chart != null) {
Object dataset = TOPChartUtils.getInstance().getDatasetFromChart(chart, -1);
// Added TDQ-8787 20140612 : store the dataset, and the index of the current indicator
if (EIndicatorChartType.BENFORD_LAW_STATISTICS.equals(chartType)) {
dataset = TOPChartUtils.getInstance().getDatasetFromChart(chart, 1);
dyModel.setSecondDataset(TOPChartUtils.getInstance().getDatasetFromChart(chart, 0));
}
dyModel.setDataset(dataset);
}
dyModel.setIndicatorList(indicators);
dyModel.setChartType(chartType);
return dyModel;
}
/**
* get Analysis Select Dialog Input Data.
*
* @param eResourceConstant
* @return
*/
public static DQRepositoryNode getAnalysisSelectDialogInputData(EResourceConstant eResourceConstant) {
DQRepositoryNode node = new DQRepositoryNode(null, null, ENodeType.SYSTEM_FOLDER, ProjectManager.getInstance()
.getCurrentProject());
node.getChildren().clear();
if (ProxyRepositoryManager.getInstance().isMergeRefProject()) {
IRepositoryNode librariesFolderNode = RepositoryNodeHelper.getDataProfilingFolderNode(eResourceConstant);
node.getChildren().add(librariesFolderNode);
} else {
java.util.Set<Project> allProjects = ProxyRepositoryManager.getInstance().getAllProjects();
for (Project project : allProjects) {
IRepositoryNode librariesFolderNode = RepositoryNodeHelper.getDataProfilingFolderNode(eResourceConstant, project);
node.getChildren().add(librariesFolderNode);
}
}
return node;
}
/**
* get Select Dialog Input Data.
*
* @param eResourceConstant: for select UDI dialog is EResourceConstant.USER_DEFINED_INDICATORS
* @return DQRepositoryNode
*/
public static DQRepositoryNode getSelectDialogInputData(EResourceConstant eResourceConstant) {
DQRepositoryNode node = new DQRepositoryNode(null, null, ENodeType.SYSTEM_FOLDER, ProjectManager.getInstance()
.getCurrentProject());
node.getChildren().clear();
if (ProxyRepositoryManager.getInstance().isMergeRefProject()) {
IRepositoryNode librariesFolderNode = RepositoryNodeHelper.getLibrariesFolderNode(eResourceConstant);
node.getChildren().add(librariesFolderNode);
} else {
java.util.Set<Project> allProjects = ProxyRepositoryManager.getInstance().getAllProjects();
for (Project project : allProjects) {
IRepositoryNode librariesFolderNode = RepositoryNodeHelper.getLibrariesFolderNode(eResourceConstant, project);
node.getChildren().add(librariesFolderNode);
}
}
return node;
}
/**
* get Metadata Select Dialog Input Data.
*
* @param eResourceConstant
* @return DQRepositoryNode
*/
public static DQRepositoryNode getMetadataSelectDialogInputData(EResourceConstant eResourceConstant) {
DQRepositoryNode node = new DQRepositoryNode(null, null, ENodeType.SYSTEM_FOLDER, ProjectManager.getInstance()
.getCurrentProject());
node.getChildren().clear();
if (ProxyRepositoryManager.getInstance().isMergeRefProject()) {
IRepositoryNode librariesFolderNode = RepositoryNodeHelper.getMetadataFolderNode(eResourceConstant);
node.getChildren().add(librariesFolderNode);
} else {
java.util.Set<Project> allProjects = ProxyRepositoryManager.getInstance().getAllProjects();
for (Project project : allProjects) {
IRepositoryNode librariesFolderNode = RepositoryNodeHelper.getMetadataFolderNode(eResourceConstant, project);
node.getChildren().add(librariesFolderNode);
}
}
return node;
}
}