public void testIPreparedComponentXQueryShareConnection() { startTest(); info("Expected: Successful execution with object available"); // $NON-NLS-1$ IRuntimeContext context = run( "test", "ipreparedcomponents", "ipreparedcomponent_xquery_shareconn.xaction"); //$NON-NLS-1$ //$NON-NLS-2$ // //$NON-NLS-3$ assertEquals( Messages.getInstance().getString("BaseTest.USER_RUNNING_ACTION_SEQUENCE"), IRuntimeContext.RUNTIME_STATUS_SUCCESS, context.getStatus()); // $NON-NLS-1$ IActionParameter rtn1 = context.getOutputParameter("prepared_component"); // $NON-NLS-1$ assertNotNull(rtn1); IPreparedComponent preparedComponent1 = (IPreparedComponent) rtn1.getValue(); assertNotNull(preparedComponent1); IPentahoResultSet resultset1 = preparedComponent1.executePrepared(null); assertTrue(resultset1.getRowCount() >= 1); Object val1 = resultset1.getValueAt(0, 0); assertNotNull(val1); finishTest(); }
public void testIPreparedComponentXQueryPrepareLater() { startTest(); info("Expected: Successful execution with object available"); // $NON-NLS-1$ IRuntimeContext context = run( "test", "ipreparedcomponents", "ipreparedcomponent_xquery_preparelater.xaction"); //$NON-NLS-1$ //$NON-NLS-2$ // //$NON-NLS-3$ assertEquals( Messages.getInstance().getString("BaseTest.USER_RUNNING_ACTION_SEQUENCE"), IRuntimeContext.RUNTIME_STATUS_SUCCESS, context.getStatus()); // $NON-NLS-1$ IActionParameter rtn1 = context.getOutputParameter("prepared_component"); // $NON-NLS-1$ assertNotNull(rtn1); IPreparedComponent preparedComponent1 = (IPreparedComponent) rtn1.getValue(); assertNotNull(preparedComponent1); IPentahoResultSet resultset1 = preparedComponent1.executePrepared(null); assertTrue(resultset1.getRowCount() >= 1); Object val1 = resultset1.getValueAt(0, 0); IActionParameter rtn2 = context.getOutputParameter("second_prepared_component"); // $NON-NLS-1$ assertNotNull(rtn2); IPreparedComponent preparedComponent2 = (IPreparedComponent) rtn2.getValue(); assertNotNull(preparedComponent2); HashMap map = new HashMap(); map.put("POSITIONTITLE", "Engineer"); // $NON-NLS-1$ //$NON-NLS-2$ IPentahoResultSet resultset2 = preparedComponent2.executePrepared(map); assertTrue(resultset2.getRowCount() >= 1); assertEquals(resultset1.getRowCount(), resultset2.getRowCount()); Object val2 = resultset2.getValueAt(0, 0); assertEquals( "Values from the first and second query should be equal", val1, val2); // $NON-NLS-1$ finishTest(); }
/** * determines state of component, and executes accordingly. * * <p>various inputs that impact the state include: * * <p>live - returns a live result set vs. an in memory copy transform - transform a result set * based on additional inputs prepared_component - if available, use existing connection from * prepared component max_rows - sets the number of rows that should be returned in result sets * * <p>The specified output also impacts the state of the execution. If prepared_component is * defined as an output, setup the query but delay execution. */ @Override protected boolean executeAction() { IActionDefinition actionDefinition = getActionDefinition(); try { if (actionDefinition instanceof AbstractRelationalDbAction) { AbstractRelationalDbAction relationalDbAction = (AbstractRelationalDbAction) actionDefinition; // Added by Arijit Chatterjee IActionInput queryTimeoutInput = relationalDbAction.getQueryTimeout(); IActionInput maxRowsInput = relationalDbAction.getMaxRows(); IActionInput readOnlyInput = relationalDbAction.getReadOnly(); String baseQuery = getQuery(); if (baseQuery == null) { error( Messages.getInstance() .getErrorString( "SQLBaseComponent.ERROR_0001_QUERY_NOT_SPECIFIED", actionDefinition.getDescription())); // $NON-NLS-1$ return false; } IPreparedComponent sharedConnection = (IPreparedComponent) relationalDbAction.getSharedConnection().getValue(); if (readOnlyInput != ActionInputConstant.NULL_INPUT) { this.setReadOnly(readOnlyInput.getBooleanValue()); } if (sharedConnection != null) { connectionOwner = false; IPentahoConnection conn = sharedConnection.shareConnection(); if (conn == null) { error( Messages.getInstance() .getErrorString( "IPreparedComponent.ERROR_0002_CONNECTION_NOT_AVAILABLE", getActionName())); //$NON-NLS-1$ return false; } else if (conn.getDatasourceType() == IPentahoConnection.SQL_DATASOURCE) { connection = conn; } else { error( Messages.getInstance() .getErrorString( "IPreparedComponent.ERROR_0001_INVALID_CONNECTION_TYPE", getActionName())); //$NON-NLS-1$ return false; } } else { dispose(); connection = getDatasourceConnection(); } if (connection == null) { return false; } // Check if this is a prepared query that will be executed later. If so cache the // query and set this component as the output. This query will be run later from a // subreport. if (relationalDbAction.getOutputPreparedStatement() != null) { prepareQuery(baseQuery); IActionOutput actionOutput = relationalDbAction.getOutputPreparedStatement(); if (actionOutput != null) { actionOutput.setValue(this); } return true; } // TODO not sure if this should be allowed without connection ownership? // int maxRows = relationalDbAction.getMaxRows().getIntValue(-1); if (maxRowsInput != ActionInputConstant.NULL_INPUT) { this.setMaxRows(maxRowsInput.getIntValue()); } // Added by Arijit Chatterjee.Sets the value of timeout. Default is -1, if parameter not // found. if (queryTimeoutInput != ActionInputConstant.NULL_INPUT) { this.setQueryTimeout(queryTimeoutInput.getIntValue()); } if (relationalDbAction.getPerformTransform().getBooleanValue(false)) { runQuery(baseQuery, false); // The side effect of // transform rSet here rSet = PentahoDataTransmuter.crossTab( rSet, relationalDbAction.getTransformPivotColumn().getIntValue(-1) - 1, relationalDbAction.getTransformMeasuresColumn().getIntValue(-1) - 1, relationalDbAction.getTransformSortColumn().getIntValue(0) - 1, (Format) relationalDbAction.getTransformPivotDataFormat().getValue(), (Format) relationalDbAction.getTransformSortDataFormat().getValue(), relationalDbAction.getTransformOrderOutputColumns().getBooleanValue(false)); IActionOutput actionOutput = relationalDbAction.getOutputResultSet(); if (actionOutput != null) { actionOutput.setValue(rSet); } return true; } else { return runQuery(baseQuery, relationalDbAction.getLive().getBooleanValue(false)); } } else if (actionDefinition instanceof SqlConnectionAction) { SqlConnectionAction sqlConnectionAction = (SqlConnectionAction) actionDefinition; dispose(); connection = getDatasourceConnection(); if (connection == null) { return false; } else { IActionOutput actionOutput = sqlConnectionAction.getOutputConnection(); if (actionOutput != null) { actionOutput.setValue(this); return true; } else { return false; } } } } catch (Exception e) { error( Messages.getInstance() .getErrorString("SQLBaseComponent.ERROR_0006_EXECUTE_FAILED", getActionName()), e); //$NON-NLS-1$ } return false; }