Search in sources :

Example 1 with SqlGenerator

use of org.pentaho.metadata.query.impl.sql.SqlGenerator in project pentaho-platform by pentaho.

the class SqlMetadataQueryExec method executeQuery.

public IPentahoResultSet executeQuery(Query queryObject) {
    // need to get the correct DatabaseMeta
    SqlPhysicalModel sqlModel = (SqlPhysicalModel) queryObject.getLogicalModel().getPhysicalModel();
    DatabaseMeta databaseMeta = ThinModelConverter.convertToLegacy(sqlModel.getId(), sqlModel.getDatasource());
    // this connection needs closed
    boolean closeConnection = true;
    DatabaseMeta activeDatabaseMeta = getActiveDatabaseMeta(databaseMeta);
    SQLConnection sqlConnection = getConnection(activeDatabaseMeta);
    String sql = null;
    try {
        if ((sqlConnection == null) || !sqlConnection.initialized()) {
            // $NON-NLS-1$
            logger.error(Messages.getInstance().getErrorString("SQLBaseComponent.ERROR_0007_NO_CONNECTION"));
            // TODO: throw an exception up the stack.
            return null;
        }
        // Fix for PDB-1753
        for (Parameter param : queryObject.getParameters()) {
            String pName = param.getName();
            if (parameters.containsKey(pName) && parameters.get(pName) != null && !parameters.get(pName).getClass().isArray()) {
                parameters.put(pName, this.convertParameterValue(param, parameters.get(pName)));
            }
        }
        MappedQuery mappedQuery = null;
        try {
            SqlGenerator sqlGenerator = createSqlGenerator();
            mappedQuery = sqlGenerator.generateSql(queryObject, LocaleHelper.getLocale().toString(), getMetadataDomainRepository(), activeDatabaseMeta, parameters, true);
        } catch (Exception e) {
            throw new RuntimeException(e.getLocalizedMessage(), e);
        }
        Integer timeout = getTimeout();
        if (timeout != null && timeout >= 0) {
            sqlConnection.setQueryTimeout(timeout);
        }
        Integer maxRows = getMaxRows();
        if (maxRows != null && maxRows >= 0) {
            sqlConnection.setMaxRows(maxRows);
        }
        Boolean readOnly = isReadOnly();
        if (readOnly != null && readOnly.booleanValue()) {
            sqlConnection.setReadOnly(true);
        }
        IPentahoResultSet localResultSet = null;
        sql = mappedQuery.getQuery();
        if (logger.isDebugEnabled()) {
            // $NON-NLS-1$
            logger.debug("SQL: " + sql);
        }
        if (getDoQueryLog()) {
            // $NON-NLS-1$
            logger.info("SQL: " + sql);
        }
        // populate prepared sql params
        List<Object> sqlParams = null;
        if (mappedQuery.getParamList() != null) {
            sqlParams = new ArrayList<Object>();
            for (String param : mappedQuery.getParamList()) {
                Object sqlParam = parameters.get(param);
                // lets see if the parameter is a multi valued param
                if (sqlParam instanceof Object[]) {
                    Object[] multivaluedParamValues = (Object[]) sqlParam;
                    for (Object p : multivaluedParamValues) {
                        sqlParams.add(p);
                    }
                    if (multivaluedParamValues.length == 0) {
                        sqlParams.add("");
                    }
                } else {
                    sqlParams.add(sqlParam);
                }
            }
        }
        try {
            if (!isForwardOnly()) {
                if (sqlParams != null) {
                    localResultSet = sqlConnection.prepareAndExecuteQuery(sql, sqlParams);
                } else {
                    localResultSet = sqlConnection.executeQuery(sql);
                }
            } else {
                if (sqlParams != null) {
                    localResultSet = sqlConnection.prepareAndExecuteQuery(sql, sqlParams, SQLConnection.RESULTSET_FORWARDONLY, SQLConnection.CONCUR_READONLY);
                } else {
                    localResultSet = sqlConnection.executeQuery(sql, SQLConnection.RESULTSET_FORWARDONLY, SQLConnection.CONCUR_READONLY);
                }
            }
            IPentahoMetaData metadata = mappedQuery.generateMetadata(localResultSet.getMetaData());
            ((SQLResultSet) localResultSet).setMetaData(metadata);
            closeConnection = false;
        } catch (Exception e) {
            logger.error(Messages.getInstance().getErrorString("SqlMetadataQueryExec.ERROR_0002_ERROR_EXECUTING_QUERY", e.getLocalizedMessage(), // $NON-NLS-1$
            sql));
            // $NON-NLS-1$
            logger.debug("error", e);
            return null;
        }
        return localResultSet;
    } finally {
        if (closeConnection && sqlConnection != null) {
            sqlConnection.close();
        }
    }
}
Also used : MappedQuery(org.pentaho.metadata.query.impl.sql.MappedQuery) SQLConnection(org.pentaho.platform.plugin.services.connections.sql.SQLConnection) IPentahoMetaData(org.pentaho.commons.connection.IPentahoMetaData) SqlPhysicalModel(org.pentaho.metadata.model.SqlPhysicalModel) DatabaseMeta(org.pentaho.di.core.database.DatabaseMeta) GenericDatabaseMeta(org.pentaho.di.core.database.GenericDatabaseMeta) SQLException(java.sql.SQLException) IOException(java.io.IOException) IPentahoResultSet(org.pentaho.commons.connection.IPentahoResultSet) SqlGenerator(org.pentaho.metadata.query.impl.sql.SqlGenerator) SQLResultSet(org.pentaho.platform.plugin.services.connections.sql.SQLResultSet) Parameter(org.pentaho.metadata.query.model.Parameter)

Example 2 with SqlGenerator

use of org.pentaho.metadata.query.impl.sql.SqlGenerator in project pentaho-platform by pentaho.

the class SqlMetadataQueryExec method createSqlGenerator.

/**
 * There are 3 levels at which a SqlGenerator class can be found:
 * The default class is specified in this component:
 * org.pentaho.metadata.query.impl.sql.SqlGenerator; if no other
 * overrides are in play, the default is used.
 * If a SqlGenerator class is set using the setter (through an
 * input in the action sequence or programmatically), then the
 * default is overridden by the class set in the setter. In between, we check the pentahoSpring.objects.xml,
 * and if there is a SqlGenerator specified in there, we use that SqlGenerator, overriding
 * the default. The setter always overrides the pentahoSpring.objects.xml class.
 */
private SqlGenerator createSqlGenerator() throws Exception {
    SqlGenerator sqlGenerator = null;
    String inputClass = (String) inputs.get("sqlgenerator");
    if (inputClass != null) {
        sqlGeneratorClass = inputClass;
    }
    if (sqlGeneratorClass == null) {
        sqlGenerator = PentahoSystem.get(SqlGenerator.class, "sqlGenerator", null);
        if (sqlGenerator == null) {
            // $NON-NLS-1$
            sqlGeneratorClass = "org.pentaho.metadata.query.impl.sql.SqlGenerator";
        }
    }
    if (sqlGeneratorClass != null) {
        Class<?> clazz = Class.forName(sqlGeneratorClass);
        sqlGenerator = (SqlGenerator) clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});
    }
    return sqlGenerator;
}
Also used : SqlGenerator(org.pentaho.metadata.query.impl.sql.SqlGenerator)

Aggregations

SqlGenerator (org.pentaho.metadata.query.impl.sql.SqlGenerator)2 IOException (java.io.IOException)1 SQLException (java.sql.SQLException)1 IPentahoMetaData (org.pentaho.commons.connection.IPentahoMetaData)1 IPentahoResultSet (org.pentaho.commons.connection.IPentahoResultSet)1 DatabaseMeta (org.pentaho.di.core.database.DatabaseMeta)1 GenericDatabaseMeta (org.pentaho.di.core.database.GenericDatabaseMeta)1 SqlPhysicalModel (org.pentaho.metadata.model.SqlPhysicalModel)1 MappedQuery (org.pentaho.metadata.query.impl.sql.MappedQuery)1 Parameter (org.pentaho.metadata.query.model.Parameter)1 SQLConnection (org.pentaho.platform.plugin.services.connections.sql.SQLConnection)1 SQLResultSet (org.pentaho.platform.plugin.services.connections.sql.SQLResultSet)1