/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright 2006 - 2009 Pentaho Corporation. All rights reserved. * * * The purpose of this component is to compare a column in one resultset with * a column in another result set. * * Assumptions: * a- It assumes the column number in both result sets are the same. This should be changed. * * * Created Jan 5, 2006 * @author mbatchel */ package org.pentaho.platform.plugin.action.datatransforms; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.actionsequence.dom.ActionInputConstant; import org.pentaho.actionsequence.dom.IActionOutput; import org.pentaho.actionsequence.dom.actions.ResultSetCompareAction; import org.pentaho.commons.connection.IPentahoResultSet; import org.pentaho.platform.engine.services.solution.ComponentBase; import org.pentaho.platform.plugin.action.messages.Messages; public class ResultSetCompareComponent extends ComponentBase { private static final long serialVersionUID = -1449352563247459588L; private static final String COMPARE_RESULT_OK = "No Mismatches"; //$NON-NLS-1$ @Override protected boolean validateAction() { boolean actionValidated = true; ResultSetCompareAction compareAction = null; // get report connection setting if (getActionDefinition() instanceof ResultSetCompareAction) { compareAction = (ResultSetCompareAction) getActionDefinition(); if (compareAction.getResultSet1() == ActionInputConstant.NULL_INPUT) { actionValidated = false; error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0001_INPUT_RS1_UNDEFINED")); //$NON-NLS-1$ } if (actionValidated && (compareAction.getResultSet2() == ActionInputConstant.NULL_INPUT)) { actionValidated = false; error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0002_INPUT_RS2_UNDEFINED")); //$NON-NLS-1$ } if (actionValidated && (compareAction.getCompareColumnNum() == ActionInputConstant.NULL_INPUT)) { actionValidated = false; error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0003_COLUMN_UNDEFINED")); //$NON-NLS-1$ } } else { actionValidated = false; error(Messages.getInstance().getErrorString( "ComponentBase.ERROR_0001_UNKNOWN_ACTION_TYPE", getActionDefinition().getElement().asXML())); //$NON-NLS-1$ } return actionValidated; } @Override protected boolean validateSystemSettings() { // No system settings return true; } @Override public void done() { // No cleanup necessary } @Override protected boolean executeAction() throws Throwable { ResultSetCompareAction compareAction = (ResultSetCompareAction) getActionDefinition(); Object obj1 = compareAction.getResultSet1().getValue(); if (!(obj1 instanceof IPentahoResultSet)) { error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0004_INPUT_RS1_NOT_RS")); //$NON-NLS-1$ return false; } Object obj2 = compareAction.getResultSet2().getValue(); if (!(obj2 instanceof IPentahoResultSet)) { error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0005_INPUT_RS2_NOT_RS")); //$NON-NLS-1$ return false; } IPentahoResultSet rs1 = (IPentahoResultSet) compareAction.getResultSet1().getValue(); IPentahoResultSet rs2 = (IPentahoResultSet) compareAction.getResultSet2().getValue(); String tempOutputMismatches = compareAction.getOutputMismatches().getStringValue(); boolean outputMismatches = false; if ((tempOutputMismatches != null) && tempOutputMismatches.trim().toLowerCase().equals("true")) { //$NON-NLS-1$ outputMismatches = true; } boolean stopOnError = false; String tempStopOnError = compareAction.getStopOnError().getStringValue(); if ((tempStopOnError != null) && tempStopOnError.trim().toLowerCase().equals("true")) { //$NON-NLS-1$ stopOnError = true; } int compareCol = Integer.parseInt(compareAction.getCompareColumnNum().getStringValue()); return compareEquals(rs1, rs2, compareCol, outputMismatches, stopOnError); } private boolean compareEquals(final IPentahoResultSet rs1, final IPentahoResultSet rs2, final int compareCol, boolean outputMismatches, final boolean stopOnError) { int sourceRowCount = rs1.getRowCount(); int sourceColCount = rs1.getColumnCount(); int compRowCount = rs2.getRowCount(); int compColCount = rs2.getColumnCount(); StringBuffer outputBuf = new StringBuffer(); if (!outputMismatches) { if (sourceRowCount != compRowCount) { error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0006_RESULTSETS_ROWCOUNT_WRONG")); //$NON-NLS-1$ return false; } if (sourceColCount != compColCount) { error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0007_RESULTSETS_COLUMNCOUNT_WRONG")); //$NON-NLS-1$ return false; } } if (compareCol > sourceColCount) { error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0008_COLUMN_NOT_FOUND") + compareCol); //$NON-NLS-1$ return false; } if (compareCol > compColCount) { error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0009_COMPARISON_COLUMN_NOT_FOUND") + compareCol); //$NON-NLS-1$ return false; } boolean anyMismatches = false; boolean foundIt; Object srcValue = null, compValue = null; ResultSetCompareAction compareAction = (ResultSetCompareAction) getActionDefinition(); IActionOutput output = compareAction.getOutputCompareResult(); for (int sourceRows = 0; sourceRows < sourceRowCount; sourceRows++) { foundIt = false; srcValue = rs1.getValueAt(sourceRows, compareCol); // n+1 traversal. This accommodates non-ordered input for (int compRows = 0; compRows < compRowCount; compRows++) { compValue = rs2.getValueAt(compRows, compareCol); if (compValue.equals(srcValue)) { foundIt = true; break; } } if (!foundIt) { if (outputBuf.length() > 0) { outputBuf.append(",").append(srcValue.toString().trim()); //$NON-NLS-1$ } else { outputBuf.append(srcValue.toString().trim()); } if (output != null) { output.setValue(outputBuf.toString()); } if (outputMismatches) { error(Messages.getInstance().getErrorString("ResultSetCompareComponent.ERROR_0010_MISMATCH_OUTPUT", srcValue.toString())); //$NON-NLS-1$ anyMismatches = true; } else { if (stopOnError) { return false; } } } } if (!anyMismatches) { if (output != null) { output.setValue(ResultSetCompareComponent.COMPARE_RESULT_OK); } } return stopOnError ? !anyMismatches : true; } @Override public boolean init() { // no initialization required return true; } @Override public Log getLogger() { return LogFactory.getLog(ResultSetCompareComponent.class); } }