// ============================================================================
//
// 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.dq.analysis;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.talend.cwm.relational.RelationalFactory;
import org.talend.cwm.relational.TdColumn;
import org.talend.cwm.relational.TdExpression;
import org.talend.cwm.relational.TdTable;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.AnalysisContext;
import org.talend.dataquality.analysis.AnalysisFactory;
import org.talend.dataquality.analysis.AnalysisParameters;
import org.talend.dataquality.analysis.AnalysisResult;
import org.talend.dataquality.analysis.AnalysisType;
import org.talend.dataquality.analysis.ExecutionInformations;
import org.talend.dataquality.indicators.DataminingType;
import org.talend.dataquality.indicators.DistinctCountIndicator;
import org.talend.dataquality.indicators.IndicatorsFactory;
import org.talend.dataquality.indicators.columnset.ColumnsetFactory;
import org.talend.dataquality.indicators.columnset.SimpleStatIndicator;
import org.talend.dataquality.indicators.definition.DefinitionFactory;
import org.talend.dataquality.indicators.definition.IndicatorDefinition;
import orgomg.cwm.objectmodel.core.Package;
/**
* DOC msjian class global comment. Detailled comment
*/
public class MultiColumnAnalysisExecutorTest {
private Analysis analysis;
private SimpleStatIndicator simpleStatIndicator;
@Before
public void setUp() throws Exception {
analysis = AnalysisFactory.eINSTANCE.createAnalysis();
AnalysisContext context = AnalysisFactory.eINSTANCE.createAnalysisContext();
analysis.setContext(context);
Package catalog = orgomg.cwm.resource.relational.RelationalFactory.eINSTANCE.createCatalog();// mock(Catalog.class);
catalog.setName("tbi"); //$NON-NLS-1$
TdTable tdTable = RelationalFactory.eINSTANCE.createTdTable();
tdTable.setName("customer"); //$NON-NLS-1$
tdTable.setNamespace(catalog);
TdColumn tdColumn = RelationalFactory.eINSTANCE.createTdColumn();
tdColumn.setOwner(tdTable);
tdColumn.setName("date_accnt_opened"); //$NON-NLS-1$
tdColumn.setContentType(DataminingType.INTERVAL.getName());
TdColumn tdColumn2 = RelationalFactory.eINSTANCE.createTdColumn();
tdColumn2.setOwner(tdTable);
tdColumn2.setName("product_id"); //$NON-NLS-1$
tdColumn2.setContentType(DataminingType.INTERVAL.getName());
AnalysisParameters analysisPara = AnalysisFactory.eINSTANCE.createAnalysisParameters();
analysisPara.setStoreData(false);
// set analysis type is columnset
analysisPara.setAnalysisType(AnalysisType.COLUMN_SET);
analysis.setParameters(analysisPara);
context.getAnalysedElements().add(tdColumn);
context.getAnalysedElements().add(tdColumn2);
AnalysisResult analysisResult = AnalysisFactory.eINSTANCE.createAnalysisResult();
ExecutionInformations info = AnalysisFactory.eINSTANCE.createExecutionInformations();
analysisResult.setResultMetadata(info);
simpleStatIndicator = ColumnsetFactory.eINSTANCE.createSimpleStatIndicator();
TdExpression expression = RelationalFactory.eINSTANCE.createTdExpression();
expression
.setBody("SELECT <%=__COLUMN_NAMES__%> FROM <%=__TABLE_NAME__%> <%=__WHERE_CLAUSE__%> GROUP BY <%=__GROUP_BY_ALIAS__%>"); //$NON-NLS-1$
expression.setLanguage("SQL"); //$NON-NLS-1$
IndicatorDefinition indicatorDefinition = DefinitionFactory.eINSTANCE.createIndicatorDefinition();
indicatorDefinition.getSqlGenericExpression().add(expression);
simpleStatIndicator.setIndicatorDefinition(indicatorDefinition);
simpleStatIndicator.getDateFunctions().add(""); //$NON-NLS-1$
simpleStatIndicator.getNumericFunctions().add(""); //$NON-NLS-1$
simpleStatIndicator.setDataminingType(DataminingType.NOMINAL);
simpleStatIndicator.getAnalyzedColumns().add(tdColumn);
simpleStatIndicator.getAnalyzedColumns().add(tdColumn2);
analysisResult.getIndicators().add(simpleStatIndicator);
analysis.setResults(analysisResult);
}
/**
* test nominal type Test method for
* {@link org.talend.dq.analysis.MultiColumnAnalysisExecutor#createSqlStatement(org.talend.dataquality.analysis.Analysis)}
* . this is test for columnset analysis
*/
@Test
public void testCreateSqlStatement_1() {
simpleStatIndicator.setDataminingType(DataminingType.NOMINAL);
MultiColumnAnalysisExecutor multiColumnAnalysisExecutor = new MultiColumnAnalysisExecutor();
assertEquals("", multiColumnAnalysisExecutor.createSqlStatement(analysis)); //$NON-NLS-1$
assertEquals(1, analysis.getResults().getIndicators().size());
assertEquals("SELECT date_accnt_opened,product_id,COUNT(*) FROM tbi.customer GROUP BY date_accnt_opened,product_id", //$NON-NLS-1$
analysis.getResults().getIndicators().get(0).getInstantiatedExpressions("SQL").getBody()); //$NON-NLS-1$
}
/**
* test interval type
*/
@Test
public void testCreateSqlStatement_2() {
MultiColumnAnalysisExecutor multiColumnAnalysisExecutor = new MultiColumnAnalysisExecutor();
// set the datamining type is interval, the result should be the same with nominal.
simpleStatIndicator.setDataminingType(DataminingType.INTERVAL);
assertEquals("", multiColumnAnalysisExecutor.createSqlStatement(analysis)); //$NON-NLS-1$
assertEquals(1, analysis.getResults().getIndicators().size());
assertEquals("SELECT date_accnt_opened,product_id,COUNT(*) FROM tbi.customer GROUP BY date_accnt_opened,product_id", //$NON-NLS-1$
analysis.getResults().getIndicators().get(0).getInstantiatedExpressions("SQL").getBody()); //$NON-NLS-1$
}
/**
* test for leaf indicator's drill down sql , with interval type. MOD TDQ-7287 lost some columns(type!=norminal)
* when view values in column set ana. yyin 20130514
*/
@Test
public void testCreateSqlStatement_3() {
DistinctCountIndicator distinctCountIndicator = IndicatorsFactory.eINSTANCE.createDistinctCountIndicator();
IndicatorDefinition definition = DefinitionFactory.eINSTANCE.createIndicatorDefinition();
String body = "SELECT COUNT(*) FROM (SELECT DISTINCT <%=__COLUMN_NAMES__%> FROM <%=__TABLE_NAME__%> <%=__WHERE_CLAUSE__%>) A";
TdExpression expression = RelationalFactory.eINSTANCE.createTdExpression();
expression.setBody(body);
expression.setLanguage("SQL"); //$NON-NLS-1$
definition.getSqlGenericExpression().add(expression);
distinctCountIndicator.setIndicatorDefinition(definition);
simpleStatIndicator.setDistinctCountIndicator(distinctCountIndicator);
simpleStatIndicator.setDataminingType(DataminingType.NOMINAL);
MultiColumnAnalysisExecutor multiColumnAnalysisExecutor = new MultiColumnAnalysisExecutor();
assertEquals("", multiColumnAnalysisExecutor.createSqlStatement(analysis)); //$NON-NLS-1$
String viewValues = "SELECT COUNT(*) FROM (SELECT DISTINCT date_accnt_opened,product_id FROM tbi.customer ) A";
assertEquals(viewValues, simpleStatIndicator.getLeafIndicators().get(0).getInstantiatedExpressions("SQL").getBody());
}
}