mondrian.spi.impl
Class AccessDialect

java.lang.Object
  extended by mondrian.spi.impl.JdbcDialectImpl
      extended by mondrian.spi.impl.AccessDialect
All Implemented Interfaces:
Dialect

public class AccessDialect
extends JdbcDialectImpl

Implementation of Dialect for the Microsoft Access database (also called the JET Engine).

Since:
Nov 23, 2008
Author:
jhyde

Nested Class Summary
 
Nested classes/interfaces inherited from interface mondrian.spi.Dialect
Dialect.DatabaseProduct, Dialect.Datatype
 
Field Summary
static JdbcDialectFactory FACTORY
           
 
Fields inherited from class mondrian.spi.impl.JdbcDialectImpl
databaseProduct, permitsSelectNotInGroupBy, productVersion
 
Constructor Summary
AccessDialect(Connection connection)
          Creates an AccessDialect.
 
Method Summary
 boolean allowsCountDistinct()
          Returns whether this Dialect supports distinct aggregations.
 String caseWhenElse(String cond, String thenExpr, String elseExpr)
          Generates a conditional statement in this dialect's syntax.
 String generateInline(List<String> columnNames, List<String> columnTypes, List<String[]> valueList)
          Generates a SQL statement to represent an inline dataset.
protected  String generateOrderByNulls(String expr, boolean ascending, boolean collateNullsLast)
          Generates SQL to force null values to collate last.
 void quoteDateLiteral(StringBuilder buf, String value)
          Appends to a buffer a date literal.
protected  void quoteDateLiteral(StringBuilder buf, String value, Date date)
          Helper method for JdbcDialectImpl.quoteDateLiteral(StringBuilder, String).
 boolean requiresUnionOrderByExprToBeInSelectClause()
          Returns true if this dialect allows an expression in the ORDER BY clause of a UNION (or other set operation) query only if it occurs in the SELECT clause.
 String toUpper(String expr)
          Converts an expression to upper case.
 
Methods inherited from class mondrian.spi.impl.JdbcDialectImpl
allowsAs, allowsCompoundCountDistinct, allowsDdl, allowsDialectSharing, allowsFromQuery, allowsJoinOn, allowsMultipleCountDistinct, allowsMultipleDistinctSqlMeasures, allowsOrderByAlias, allowsRegularExpressionInWhereClause, allowsSelectNotInGroupBy, appendHintsAfterFromClause, deduceIdentifierQuoteString, deduceMaxColumnNameLength, deduceProductName, deduceProductVersion, deduceReadOnly, deduceSupportedResultSetStyles, deduceSupportsSelectNotInGroupBy, generateCountExpression, generateInlineForAnsi, generateInlineGeneric, generateOrderByNullsAnsi, generateOrderItem, generateOrderItem, generateRegularExpression, getDatabaseProduct, getMaxColumnNameLength, getProduct, getQuoteIdentifierString, needsExponent, quote, quoteBooleanLiteral, quoteIdentifier, quoteIdentifier, quoteIdentifier, quoteIdentifier, quoteNumericLiteral, quoteStringLiteral, quoteTimeLiteral, quoteTimestampLiteral, requiresAliasForFromQuery, requiresGroupByAlias, requiresHavingAlias, requiresOrderByAlias, requiresUnionOrderByOrdinal, supportsGroupByExpressions, supportsGroupingSets, supportsMultiValueInExpr, supportsResultSetConcurrency, supportsUnlimitedValueList, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

FACTORY

public static final JdbcDialectFactory FACTORY
Constructor Detail

AccessDialect

public AccessDialect(Connection connection)
              throws SQLException
Creates an AccessDialect.

Parameters:
connection - Connection
Throws:
SQLException
Method Detail

toUpper

public String toUpper(String expr)
Description copied from interface: Dialect
Converts an expression to upper case.

For example, for MySQL, toUpper("foo.bar") returns "UPPER(foo.bar)".

Specified by:
toUpper in interface Dialect
Overrides:
toUpper in class JdbcDialectImpl
Parameters:
expr - SQL expression
Returns:
SQL syntax that converts expr into upper case.

caseWhenElse

public String caseWhenElse(String cond,
                           String thenExpr,
                           String elseExpr)
Description copied from interface: Dialect
Generates a conditional statement in this dialect's syntax.

For example, caseWhenElse("b", "1", "0") returns "case when b then 1 else 0 end" on Oracle, "Iif(b, 1, 0)" on Access.

Specified by:
caseWhenElse in interface Dialect
Overrides:
caseWhenElse in class JdbcDialectImpl
Parameters:
cond - Predicate expression
thenExpr - Expression if condition is true
elseExpr - Expression if condition is false
Returns:
Conditional expression

quoteDateLiteral

public void quoteDateLiteral(StringBuilder buf,
                             String value)
Description copied from interface: Dialect
Appends to a buffer a date literal.

For example, in the default dialect, quoteStringLiteral(buf, "1969-03-17") appends DATE '1969-03-17'.

Specified by:
quoteDateLiteral in interface Dialect
Overrides:
quoteDateLiteral in class JdbcDialectImpl
Parameters:
buf - Buffer to append to
value - Literal

quoteDateLiteral

protected void quoteDateLiteral(StringBuilder buf,
                                String value,
                                Date date)
Description copied from class: JdbcDialectImpl
Helper method for JdbcDialectImpl.quoteDateLiteral(StringBuilder, String).

Overrides:
quoteDateLiteral in class JdbcDialectImpl
Parameters:
buf - Buffer to append to
value - Value as string
date - Value as date

generateOrderByNulls

protected String generateOrderByNulls(String expr,
                                      boolean ascending,
                                      boolean collateNullsLast)
Description copied from class: JdbcDialectImpl
Generates SQL to force null values to collate last.

This default implementation makes use of the ANSI SQL 1999 CASE-WHEN-THEN-ELSE in conjunction with IS NULL syntax. The resulting SQL will look something like this:

CASE WHEN "expr" IS NULL THEN 0 ELSE 1 END

You can override this method for a particular database to use something more efficient, like ISNULL().

ANSI SQL provides the syntax "ASC/DESC NULLS LAST" and "ASC/DESC NULLS FIRST". If your database supports the ANSI syntax, implement this method by calling JdbcDialectImpl.generateOrderByNullsAnsi(java.lang.String, boolean, boolean).

This method is only called from JdbcDialectImpl.generateOrderItem(String, boolean, boolean, boolean). Some dialects override that method and therefore never call this method.

Overrides:
generateOrderByNulls in class JdbcDialectImpl
Parameters:
expr - Expression.
ascending - Whether ascending.
collateNullsLast - Whether nulls should appear first or last.
Returns:
Expression to force null values to collate last or first.

requiresUnionOrderByExprToBeInSelectClause

public boolean requiresUnionOrderByExprToBeInSelectClause()
Description copied from interface: Dialect
Returns true if this dialect allows an expression in the ORDER BY clause of a UNION (or other set operation) query only if it occurs in the SELECT clause.

For example, SELECT x, y + z FROM t
UNION ALL
SELECT x, y + z FROM t
ORDER BY y + z
is allowed but SELECT x, y, z FROM t
UNION ALL
SELECT x, y, z FROM t
ORDER BY y + z
SELECT x, y, z FROM t ORDER BY y + z is not.

Access is an example of a dialect with this restriction.

Specified by:
requiresUnionOrderByExprToBeInSelectClause in interface Dialect
Overrides:
requiresUnionOrderByExprToBeInSelectClause in class JdbcDialectImpl
Returns:
whether this dialect allows an expression in the ORDER BY clause of a UNION (or other set operation) query only if it occurs in the SELECT clause

allowsCountDistinct

public boolean allowsCountDistinct()
Description copied from interface: Dialect
Returns whether this Dialect supports distinct aggregations.

For example, Access does not allow

select count(distinct x) from t

Specified by:
allowsCountDistinct in interface Dialect
Overrides:
allowsCountDistinct in class JdbcDialectImpl
Returns:
whether Dialect allows COUNT DISTINCT

generateInline

public String generateInline(List<String> columnNames,
                             List<String> columnTypes,
                             List<String[]> valueList)
Description copied from interface: Dialect
Generates a SQL statement to represent an inline dataset.

For example, for Oracle, generates

 SELECT 1 AS FOO, 'a' AS BAR FROM dual
 UNION ALL
 SELECT 2 AS FOO, 'b' AS BAR FROM dual
 

For ANSI SQL, generates:

 VALUES (1, 'a'), (2, 'b')
 

Specified by:
generateInline in interface Dialect
Overrides:
generateInline in class JdbcDialectImpl
Parameters:
columnNames - List of column names
columnTypes - List of column types ("String" or "Numeric")
valueList - List of rows values
Returns:
SQL string

Get Mondrian at SourceForge.net. Fast, secure and free Open Source software downloads