// ============================================================================
//
// 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 junit.framework.Assert;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.common.util.EList;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.talend.core.model.metadata.builder.connection.ConnectionFactory;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.metadata.builder.database.dburl.SupportDBUrlType;
import org.talend.cwm.helper.TaggedValueHelper;
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.indicators.sql.IndicatorSqlFactory;
import org.talend.dataquality.indicators.sql.WhereRuleIndicator;
import org.talend.dataquality.rules.JoinElement;
import org.talend.dataquality.rules.RulesFactory;
import org.talend.dataquality.rules.WhereRule;
import orgomg.cwm.objectmodel.core.Expression;
import orgomg.cwm.resource.relational.Catalog;
/**
* created by xqliu on 2014-8-20 Detailled comment
*
*/
public class TableAnalysisSqlExecutorTest {
Analysis testAnalysis = null;
WhereRule testWhereRuleIndicatorDefinition = null;
WhereRuleIndicator testWhereRuleIndicator = null;
/**
* DOC xqliu Comment method "setUp".
*
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
// create TdTable
TdTable testTdTable = RelationalFactory.eINSTANCE.createTdTable();
testTdTable.setName("generateTable"); //$NON-NLS-1$
// create connection
DatabaseConnection testDatabaseConnection = ConnectionFactory.eINSTANCE.createDatabaseConnection();
TaggedValueHelper.setTaggedValue(testDatabaseConnection, TaggedValueHelper.DB_PRODUCT_NAME,
SupportDBUrlType.MYSQLDEFAULTURL.getDBKey());
// create catalog
Catalog testCatalog = orgomg.cwm.resource.relational.RelationalFactory.eINSTANCE.createCatalog();
testCatalog.setName("TBI"); //$NON-NLS-1$
testTdTable.setNamespace(testCatalog);
testCatalog.setNamespace(testDatabaseConnection);
testCatalog.getDataManager().add(testDatabaseConnection);
// create analysis
testAnalysis = AnalysisFactory.eINSTANCE.createAnalysis();
// create Analaysis result
AnalysisResult testAnalysisResult = AnalysisFactory.eINSTANCE.createAnalysisResult();
testAnalysis.setResults(testAnalysisResult);
// create analysis parameter
AnalysisParameters testAnalysisParameters = AnalysisFactory.eINSTANCE.createAnalysisParameters();
testAnalysis.setParameters(testAnalysisParameters);
// create analysis Content
AnalysisContext testAnalysisContext = AnalysisFactory.eINSTANCE.createAnalysisContext();
testAnalysis.setContext(testAnalysisContext);
testAnalysisContext.setConnection(testDatabaseConnection);
// create WhereRuleAide indicatorDefinition
testWhereRuleIndicatorDefinition = RulesFactory.eINSTANCE.createWhereRule();
testWhereRuleIndicatorDefinition.setLabel("rule1"); //$NON-NLS-1$
// create WhereRule indicator
testWhereRuleIndicator = IndicatorSqlFactory.eINSTANCE.createWhereRuleIndicator();
testAnalysisResult.getIndicators().add(testWhereRuleIndicator);
testWhereRuleIndicator.setAnalyzedElement(testTdTable);
testWhereRuleIndicator.setIndicatorDefinition(testWhereRuleIndicatorDefinition);
}
/**
* DOC xqliu Comment method "tearDown".
*
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
/**
* Test method for
* {@link org.talend.dq.analysis.TableAnalysisSqlExecutor#createSqlStatement(org.talend.dataquality.analysis.Analysis)}
* . case 1:the where rule have not join conditions
*/
@Test
public void testCreateSqlStatementCase1() {
TdExpression expression = RelationalFactory.eINSTANCE.createTdExpression();
expression.setBody("SELECT COUNT(*) FROM <%=__TABLE_NAME__%> <%=__JOIN_CLAUSE__%> <%=__WHERE_CLAUSE__%>"); //$NON-NLS-1$
expression.setLanguage("SQL"); //$NON-NLS-1$
testWhereRuleIndicatorDefinition.getSqlGenericExpression().add(expression);
TableAnalysisSqlExecutor tableAnalysisSqlExecutor = new TableAnalysisSqlExecutor();
String actualSqlStatement = tableAnalysisSqlExecutor.createSqlStatement(testAnalysis);
Assert.assertEquals(StringUtils.EMPTY, actualSqlStatement);
EList<Expression> instantiatedExpressions = testWhereRuleIndicator.getInstantiatedExpressions();
Assert.assertNotNull(instantiatedExpressions);
Assert.assertEquals(1, instantiatedExpressions.size());
}
/**
* Test method for
* {@link org.talend.dq.analysis.TableAnalysisSqlExecutor#createSqlStatement(org.talend.dataquality.analysis.Analysis)}
* . case 1:the where rule have join conditions
*/
@Test
public void testCreateSqlStatementCase2() {
String sql = "select count(*) from table where 1=1"; //$NON-NLS-1$
TdExpression expression = RelationalFactory.eINSTANCE.createTdExpression();
expression.setBody(sql);
expression.setLanguage("SQL"); //$NON-NLS-1$
testWhereRuleIndicatorDefinition.getSqlGenericExpression().add(expression);
JoinElement createJoinElement = RulesFactory.eINSTANCE.createJoinElement();
createJoinElement.setColumnAliasA("colA"); //$NON-NLS-1$
createJoinElement.setColumnAliasB("colB"); //$NON-NLS-1$
createJoinElement.setTableAliasA("tabA"); //$NON-NLS-1$
createJoinElement.setTableAliasB("tabB"); //$NON-NLS-1$
TdColumn createTdColumnA = RelationalFactory.eINSTANCE.createTdColumn();
createTdColumnA.setName("colA"); //$NON-NLS-1$
TdTable createTdTableA = RelationalFactory.eINSTANCE.createTdTable();
createTdTableA.setName("tableA"); //$NON-NLS-1$
createTdColumnA.setOwner(createTdTableA);
TdColumn createTdColumnB = RelationalFactory.eINSTANCE.createTdColumn();
createTdColumnB.setName("colB"); //$NON-NLS-1$
TdTable createTdTableB = RelationalFactory.eINSTANCE.createTdTable();
createTdTableB.setName("tableB"); //$NON-NLS-1$
createTdColumnB.setOwner(createTdTableB);
createJoinElement.setColA(createTdColumnA);
createJoinElement.setColB(createTdColumnB);
testWhereRuleIndicatorDefinition.getJoins().add(createJoinElement);
TableAnalysisSqlExecutor tableAnalysisSqlExecutor = new TableAnalysisSqlExecutor();
String actualSqlStatement = tableAnalysisSqlExecutor.createSqlStatement(testAnalysis);
Assert.assertEquals(StringUtils.EMPTY, actualSqlStatement);
EList<Expression> instantiatedExpressions = testWhereRuleIndicator.getInstantiatedExpressions();
Assert.assertNotNull(instantiatedExpressions);
Assert.assertEquals(1, instantiatedExpressions.size());
Assert.assertEquals(sql, instantiatedExpressions.get(0).getBody());
}
}