/*
* 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);
}
}