/*
// This software is subject to the terms of the Eclipse Public License v1.0
// Agreement, available at the following URL:
// http://www.eclipse.org/legal/epl-v10.html.
// You must accept the terms of that agreement to use this software.
//
// Copyright (c) 2002-2014 Pentaho Corporation.. All rights reserved.
*/
package mondrian.spi.impl;
import mondrian.olap.Util;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Date;
import java.sql.SQLException;
import java.util.List;
/**
* Implementation of {@link mondrian.spi.Dialect} for the NuoDB database.
* In order to use NuoDB with Pentaho Mondrian users can only use NuoDB
* version 2.0.4 or newer.
*
* @author rbuck
* @since Mar 20, 2014
*/
public class NuoDbDialect extends JdbcDialectImpl {
public static final JdbcDialectFactory FACTORY =
new JdbcDialectFactory(
NuoDbDialect.class,
DatabaseProduct.NUODB);
/**
* Creates a NuoDbDialect.
*
* @param connection Connection
*/
public NuoDbDialect(Connection connection) throws SQLException {
super(connection);
}
/**
* In order to generate a SQL statement to represent an inline dataset
* NuoDB requires that you use FROM DUAL.
*
* @param columnNames the list of column names
* @param columnTypes the list of column types
* @param valueList the value list
* @return the generated SQL statement for an inline dataset
*/
@Override
public String generateInline(List<String> columnNames, List<String> columnTypes, List<String[]> valueList) {
return generateInlineGeneric(
columnNames, columnTypes, valueList,
" FROM DUAL", false);
}
/**
* NuoDB does not yet support ANSI SQL:2003 for DATE literals so we have
* to cast dates using a function.
*
* @param buf Buffer to append to
* @param value Value as string
* @param date Value as date
*/
@Override
protected void quoteDateLiteral(StringBuilder buf, String value, Date date) {
buf.append("DATE(");
Util.singleQuoteString(value, buf);
buf.append(")");
}
/**
* The NuoDB JDBC driver lists " " as the string to use for quoting, but we
* know better. Ideally the quotation character ought to have been "`" but
* if that is used and a generated query uses non quoted object names, not-
* found exceptions will occur for the object. So we here fall back to using
* the double quote character. We ought to investigate why back-tick won't
* work. But for now this makes all the tests work with Nuo (besides the
* tweaks above).
*
* @param databaseMetaData the database metadata from the connection
* @return the quotation character
*/
@Override
protected String deduceIdentifierQuoteString(DatabaseMetaData databaseMetaData) {
String identifierQuoteString = super.deduceIdentifierQuoteString(databaseMetaData);
if (" ".equals(identifierQuoteString)) {
identifierQuoteString = "\"";
}
return identifierQuoteString;
}
}
// End NuoDbDialect.java