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();
}
}
}
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;
}
Aggregations