/** * Create an execution object for the specified command * * @param command the command * @param executionContext Provides information about the context that this command is executing * within, such as the identifiers for the command being executed * @param metadata Access to runtime metadata if needed to translate the command * @param connection connection factory object to the data source * @return An execution object that can use to execute the command */ public Execution createExecution( Command command, ExecutionContext executionContext, RuntimeMetadata metadata, C connection) throws TranslatorException { if (command instanceof Call) { Call obj = (Call) command; // TODO: our extension property support in designer makes ad-hoc properties impossible, so // we just match based upon name. it would be better to have the metadatarepository/tooling // add a teiid property // to explicitly set this proc as direct. // the other approach would be to addd a native system stored procedure, but that would // require // special security semantics, whereas this proc can be secured on a schema basis if (supportsNativeQueries() && obj.getMetadataObject().getName().equals(getNativeQueryProcedureName())) { List<Argument> arguments = obj.getArguments(); return createDirectExecution(arguments, command, executionContext, metadata, connection); } } if (command instanceof QueryExpression) { return createResultSetExecution( (QueryExpression) command, executionContext, metadata, connection); } if (command instanceof Call) { return createProcedureExecution((Call) command, executionContext, metadata, connection); } return createUpdateExecution(command, executionContext, metadata, connection); }
@Override public List<?> getOutputParameterValues() throws TranslatorException { Call proc = (Call) this.command; int count = proc.getReturnType() != null ? 1 : 0; for (Argument param : proc.getArguments()) { if (param.getDirection() == Direction.INOUT || param.getDirection() == Direction.OUT) { count++; } } return Arrays.asList(new Object[count]); }