// ============================================================================ // // 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.migration.impl; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.talend.core.model.metadata.builder.database.dburl.SupportDBUrlType; import org.talend.cwm.relational.TdExpression; import org.talend.dataprofiler.core.migration.AbstractWorksapceUpdateTask; import org.talend.dataprofiler.core.migration.helper.IndicatorDefinitionFileHelper; import org.talend.dataquality.indicators.definition.IndicatorDefinition; import org.talend.dq.indicators.definitions.DefinitionHandler; /** * Add/Update Sql Expression in Mean/Median indicators for DB2 language. * * ADDed by msjian 2012-8-31 for TDQ-5960 */ public class UpdateMeanMedianForDB2Task extends AbstractWorksapceUpdateTask { private final String MEAN_UUID = "_ccI48RF2Ed2PKb6nEJEvhw"; //$NON-NLS-1$ private final String MEDIAN_UUID = "_ccI48hF2Ed2PKb6nEJEvhw"; //$NON-NLS-1$ private final String DB2 = SupportDBUrlType.DB2DEFAULTURL.getLanguage(); /* * (non-Javadoc) * * @see org.talend.dataprofiler.migration.IMigrationTask#getOrder() */ public Date getOrder() { return createDate(2012, 8, 31); } /* * (non-Javadoc) * * @see org.talend.dataprofiler.migration.IMigrationTask#getMigrationTaskType() */ public MigrationTaskType getMigrationTaskType() { return MigrationTaskType.FILE; } /** * update Mean/Median indicators definition by uuid. */ @Override protected boolean doExecute() throws Exception { DefinitionHandler definitionHandler = DefinitionHandler.getInstance(); boolean isMeanAdded = true; boolean isMedianUpdated = true; // Add sql of DB2 to Mean indicator IndicatorDefinition meanDefinition = definitionHandler.getDefinitionById(MEAN_UUID); if (meanDefinition != null && !IndicatorDefinitionFileHelper.isExistSqlExprWithLanguage(meanDefinition, DB2)) { IndicatorDefinitionFileHelper .addSqlExpression( meanDefinition, DB2, "SELECT SUM(double(<%=__COLUMN_NAMES__%>)), COUNT(<%=__COLUMN_NAMES__%>) FROM <%=__TABLE_NAME__%> <%=__WHERE_CLAUSE__%>"); //$NON-NLS-1$ isMeanAdded = IndicatorDefinitionFileHelper.save(meanDefinition); } // Update sql of DB2 to Median indicator IndicatorDefinition medianDefinition = definitionHandler.getDefinitionById(MEDIAN_UUID); if (medianDefinition != null && IndicatorDefinitionFileHelper.removeSqlExpression(medianDefinition, DB2)) { List<TdExpression> remainExpLs = new ArrayList<TdExpression>(); remainExpLs.addAll(medianDefinition.getSqlGenericExpression()); medianDefinition.getSqlGenericExpression().clear(); IndicatorDefinitionFileHelper .addSqlExpression(medianDefinition, DB2, "SELECT AVG(double(<%=__COLUMN_NAMES__%>)) FROM ( SELECT <%=__COLUMN_NAMES__%>, COUNT(*) OVER( ) total, CAST(COUNT(*) OVER( ) AS DECIMAL)/2 mid, CEIL(CAST(COUNT(*) OVER( ) AS DECIMAL)/2) next, ROW_NUMBER() OVER ( ORDER BY <%=__COLUMN_NAMES__%>) rn FROM <%=__TABLE_NAME__%> WHERE <%=__COLUMN_NAMES__%> IS NOT NULL <%=__AND_WHERE_CLAUSE__%>) x WHERE ( MOD(total,2) = 0 AND rn IN ( mid, mid+1 ) ) OR ( MOD(total,2) = 1 AND rn = next )"); //$NON-NLS-1$ medianDefinition.getSqlGenericExpression().addAll(remainExpLs); isMedianUpdated = IndicatorDefinitionFileHelper.save(medianDefinition); } DefinitionHandler.getInstance().reloadIndicatorsDefinitions(); if (!isMeanAdded || !isMedianUpdated) { return false; } return true; } }