public abstract class Dialect extends Object
Modifier and Type | Class and Description |
---|---|
static class |
Dialect.DialectIdType
Type of id when stored in the database.
|
static class |
Dialect.FulltextMatchInfo
Information needed to express fulltext search with scoring.
|
static class |
Dialect.FulltextQuery
Structured fulltext query.
|
static class |
Dialect.FulltextQueryAnalyzer |
static class |
Dialect.JDBCInfo |
Modifier and Type | Field and Description |
---|---|
static String |
ARRAY_SEP |
static boolean |
DEBUG_REAL_UUIDS |
static boolean |
DEBUG_UUIDS |
static String |
DIALECT_CLASS
System property to override the dialect to use globally instead of the
one auto-detected.
|
static Map<String,Class<? extends Dialect>> |
DIALECTS |
Constructor and Description |
---|
Dialect(DatabaseMetaData metadata,
BinaryManager binaryManager,
RepositoryDescriptor repositoryDescriptor) |
Modifier and Type | Method and Description |
---|---|
String |
addPagingClause(String sql,
long limit,
long offset)
Returns the SQL query with a paging clause
|
Dialect.FulltextQuery |
analyzeFulltextQuery(String query)
Analyzes a fulltext query into a generic datastructure that can be used
for each specific database.
|
String |
castIdToVarchar(String expr)
Casts an id column to a VARCHAR type.
|
char |
closeQuote() |
Array |
createArrayOf(int type,
Object[] elements,
Connection connection)
Factory method for creating Array objects, suitable for passing to
PreparedStatement.setArray(int, java.sql.Array) . |
static Dialect |
createDialect(Connection connection,
BinaryManager binaryManager,
RepositoryDescriptor repositoryDescriptor)
Creates a
Dialect by connecting to the datasource to check what
database is used. |
abstract boolean |
doesUpdateFromRepeatSelf()
When doing an UPDATE t SET ...
|
void |
existingTableDetected(Connection connection,
Table table,
Model model,
Database database)
Called after an existing table has been detected in the database.
|
static boolean |
fulltextHasPhrase(Dialect.FulltextQuery ft)
Checks if a fulltext search has a phrase in it.
|
String |
getAddColumnString() |
String |
getAddForeignKeyConstraintString(String constraintName,
String[] foreignKeys,
String referencedTable,
String[] primaryKeys,
boolean referencesPrimaryKey) |
String |
getAddPrimaryKeyConstraintString(String constraintName) |
String |
getAncestorsIdsSql()
Gets the SQL query to get the ancestors of a set of ids.
|
BinaryManager |
getBinaryManager() |
String |
getBlobLengthFunction()
Gets the SQL function that returns the length of a blob, in bytes.
|
String |
getCascadeDropConstraintsString() |
String |
getClobCast(boolean inOrderBy)
When using a CLOB field in an expression, is some casting required and
with what pattern?
|
String |
getClusterDeleteInvalidations()
Gets the SQL to delete invalidations for this cluster node.
|
String |
getClusterGetInvalidations()
Gets the SQL to query invalidations for this cluster node.
|
String |
getClusterInsertInvalidations()
Gets the SQL to send an invalidation to the cluster.
|
String |
getClusterNodeIdSql()
Returns the cluster node id, for some databases where this info is needed
at the Java level.
|
String |
getColumnName(String name) |
String |
getConnectionSchema(Connection connection)
Gets the schema to use to query metadata about existing tables.
|
abstract String |
getCreateFulltextIndexSql(String indexName,
String quotedIndexName,
Table table,
List<Column> columns,
Model model)
Gets a CREATE INDEX statement for a fulltext index.
|
String |
getCreateIndexSql(String indexName,
Table.IndexType indexType,
Table table,
List<Column> columns,
Model model)
Gets a CREATE INDEX statement for an index.
|
String |
getCustomColumnDefinition(Table table)
Additional column definitions for CREATE TABLE.
|
List<String> |
getCustomPostCreateSqls(Table table)
Additional things to execute after CREATE TABLE.
|
String |
getDateCast()
Get the expression to use to cast a column to a DATE type.
|
String |
getDescending()
Gets the SQL descending sort direction with option to sort nulls last.
|
abstract String |
getDialectFulltextQuery(String query)
Get the dialect-specific version of a fulltext query.
|
String |
getForeignKeyConstraintName(String tableName,
String foreignColumnName,
String foreignTableName) |
String |
getFreeVariableSetterForType(ColumnType type)
Gets the JDBC expression setting a free value for this column type.
|
abstract Serializable |
getFromResultSet(ResultSet rs,
int index,
Column column) |
abstract int |
getFulltextIndexedColumns()
Specifies what columns of the fulltext table have to be indexed.
|
abstract Dialect.FulltextMatchInfo |
getFulltextScoredMatchInfo(String fulltextQuery,
String indexName,
int nthMatch,
Column mainColumn,
Model model,
Database database)
Gets the SQL information needed to do a a fulltext match, either with a
direct expression in the WHERE clause, or using a join with an additional
table.
|
int |
getFulltextType()
Gets the type of a fulltext column has known by JDBC.
|
Serializable |
getGeneratedId(Connection connection)
Gets a generated id if so configured, otherwise returns null.
|
String |
getIdentityGeneratedKeySql(Column column)
Gets the SQL query to execute to retrieve the last generated identity
key.
|
Dialect.DialectIdType |
getIdType()
Gets the type of id when stored in the database.
|
List<String> |
getIgnoredColumns(Table table)
Columns ignored if we see them in existing tables.
|
String |
getIndexName(String tableName,
List<String> columnNames) |
abstract String |
getInTreeSql(String idColumnName)
Gets the expression to use to check tree membership.
|
abstract Dialect.JDBCInfo |
getJDBCTypeAndString(ColumnType type)
Gets the JDBC type and string from Nuxeo's type abstraction.
|
String |
getMatchMixinType(Column mixinsColumn,
String mixin,
boolean positive,
String[] returnParam)
Gets the SQL fragment to match a mixin type.
|
abstract boolean |
getMaterializeFulltextSyntheticColumn()
Does the fulltext synthetic column have to be materialized.
|
int |
getMaximumArgsForIn()
Maximum number of values in a IN (?, ?, ...) statement.
|
String |
getNoColumnsInsertString() |
String |
getNullColumnString() |
List<String> |
getPostCreateIdentityColumnSql(Column column)
Gets additional SQL statements to execute after the CREATE TABLE when
creating an identity column.
|
List<String> |
getPostCreateTableSqls(Table table,
Model model,
Database database)
Gets the sql statements to call after a table has been created.
|
String |
getPrepareUserReadAclsSql()
Gets the SQL expression to prepare the user read acls cache.
|
String |
getPrimaryKeyConstraintName(String tableName) |
String |
getReadAclsCheckSql(String idColumnName)
Gets the expression to check if access is allowed using read acl the
dialect must suppportsReadAcl
|
String |
getRebuildReadAclsSql()
Gets the statement to rebuild the wall read acls
|
abstract String |
getSecurityCheckSql(String idColumnName)
Gets the expression to use to check security.
|
String |
getSoftDeleteCleanupSql()
SQL to clean soft-delete documents.
|
String |
getSoftDeleteSql()
SQL to soft delete documents.
|
abstract String |
getSQLStatementsFilename()
Gets the name of the file containing the SQL statements.
|
abstract Map<String,Serializable> |
getSQLStatementsProperties(Model model,
Database database)
Gets the properties to use with the SQL statements.
|
String |
getTableName(String name) |
String |
getTableTypeString(Table table) |
abstract String |
getTestSQLStatementsFilename() |
String |
getUpdateReadAclsSql()
Gets the statement to update the read acls
|
String |
getValidationQuery()
A query that, when executed, will make at least a round-trip to the
server to check that the connection is alive.
|
boolean |
hasIdentityGeneratedKey()
True if the dialect returns the generated key for the identity from the
insert statement.
|
boolean |
hasNullEmptyString()
Does the dialect have an empty string identical to NULL (Oracle).
|
boolean |
isAllowedConversion(int expected,
int actual,
String actualName,
int actualSize)
Check mismatches between expected and actual JDBC types read from
database introspection.
|
boolean |
isClusteringDeleteNeeded()
Does clustering fetch of invalidations (
getClusterGetInvalidations() ) need a separate delete for them (
getClusterDeleteInvalidations() ). |
boolean |
isClusteringSupported()
Checks that clustering is supported.
|
boolean |
isConcurrentUpdateException(Throwable t)
Checks if an exception received means that a concurrent update was
detected.
|
boolean |
isConnectionClosedException(Throwable t)
Checks if an exception received means that the low level connection has
been trashed and must be reset.
|
boolean |
isIdentityAlreadyPrimary()
Checks if an identity column is already defined as a primary key and does
not need a separate index added.
|
static Dialect.JDBCInfo |
jdbcInfo(String string,
int jdbcType) |
static Dialect.JDBCInfo |
jdbcInfo(String string,
int length,
int jdbcType) |
boolean |
needsAliasForDerivedTable()
Whether a derived table (subselect in a FROM statement) needs an alias.
|
boolean |
needsOracleJoins()
Whether implicit Oracle joins (instead of explicit ANSI joins) are
needed.
|
boolean |
needsOrderByKeysAfterDistinct()
When doing a SELECT DISTINCT that uses a ORDER BY, do the keys along
which we order have to be mentioned in the DISTINCT clause?
|
boolean |
needsOriginalColumnInGroupBy()
Whether a GROUP BY can only be used with the original column name and not
an alias.
|
boolean |
needsPrepareUserReadAcls()
The dialect need an extra SQL statement to populate a user read acl cache
before running the query.
|
char |
openQuote() |
void |
performAdditionalStatements(Connection connection)
Let the dialect processes additional statements after tables creation and
conditional statements.
|
void |
performPostOpenStatements(Connection connection)
Let the dialect perform additional statements just after the connection
is opened.
|
boolean |
preCreateTable(Connection connection,
Table table,
Model model,
Database database)
Called before a table is created, when it's been determined that it
doesn't exist yet.
|
boolean |
qualifyIndexName() |
void |
setId(PreparedStatement ps,
int index,
Serializable value)
Sets a prepared statement value that is a Nuxeo main id (usually UUID).
|
void |
setIdLong(PreparedStatement ps,
int index,
Serializable value)
Sets a long id (sequence) from a value that may be a String or already a
Long.
|
abstract void |
setToPreparedStatement(PreparedStatement ps,
int index,
Serializable value,
Column column) |
void |
setToPreparedStatementTimestamp(PreparedStatement ps,
int index,
Serializable value,
Column column) |
boolean |
storesUpperCaseIdentifiers() |
boolean |
supportsAncestorsTable()
Checks if the dialect supports an ancestors table.
|
boolean |
supportsArrays()
Does the dialect support passing ARRAY values (to stored procedures
mostly).
|
boolean |
supportsArraysReturnInsteadOfRows()
Does a stored function returning an result set need to access it as a
single array instead of iterating over a normal result set's rows.
|
boolean |
supportsCircularCascadeDeleteConstraints() |
boolean |
supportsConcurrentUpdateReadAcls()
Does the dialect support concurrent update of optimized security checks
|
boolean |
supportsIfExistsAfterTableName() |
boolean |
supportsIfExistsBeforeTableName() |
boolean |
supportsIlike()
Does the dialect support ILIKE operator
|
boolean |
supportsMultipleFulltextIndexes()
SQL Server supports only one fulltext index.
|
boolean |
supportsPaging()
Indicates if dialect supports paging
|
boolean |
supportsReadAcl()
Does the dialect support an optimized read security checks
|
boolean |
supportsSysNameArray()
Checks if the dialect supports storing arrays of system names (for mixins
for instance).
|
abstract boolean |
supportsUpdateFrom()
Does the dialect support UPDATE t SET ...
|
boolean |
supportsWith()
Does the dialect support SQL-99 WITH common table expressions.
|
String |
toBooleanValueString(boolean bool) |
static String |
toHexString(byte[] bytes) |
static String |
translateFulltext(Dialect.FulltextQuery ft,
String or,
String and,
String andNot,
String phraseQuote)
Translate fulltext into a common pattern used by many servers.
|
static String |
translateFulltext(Dialect.FulltextQuery ft,
String or,
String and,
String andNot,
String wordStart,
String wordEnd,
Set<Character> wordCharsReserved,
String phraseStart,
String phraseEnd,
boolean quotePhraseWords)
Translate fulltext into a common pattern used by many servers.
|
public static final boolean DEBUG_UUIDS
public static final boolean DEBUG_REAL_UUIDS
public static final String DIALECT_CLASS
public static final String ARRAY_SEP
public Dialect(DatabaseMetaData metadata, BinaryManager binaryManager, RepositoryDescriptor repositoryDescriptor) throws StorageException
StorageException
public static Dialect.JDBCInfo jdbcInfo(String string, int jdbcType)
public static Dialect.JDBCInfo jdbcInfo(String string, int length, int jdbcType)
public static Dialect createDialect(Connection connection, BinaryManager binaryManager, RepositoryDescriptor repositoryDescriptor) throws StorageException
Dialect
by connecting to the datasource to check what
database is used.StorageException
- if a SQL connection problem occurspublic BinaryManager getBinaryManager()
public String getConnectionSchema(Connection connection) throws SQLException
SQLException
public abstract Dialect.JDBCInfo getJDBCTypeAndString(ColumnType type)
public boolean isAllowedConversion(int expected, int actual, String actualName, int actualSize)
public Serializable getGeneratedId(Connection connection) throws SQLException
SQLException
public void setId(PreparedStatement ps, int index, Serializable value) throws SQLException
ps
- the prepared statementindex
- the parameter index in the prepared statementvalue
- the value to setSQLException
public void setIdLong(PreparedStatement ps, int index, Serializable value) throws SQLException
SQLException
public abstract void setToPreparedStatement(PreparedStatement ps, int index, Serializable value, Column column) throws SQLException
SQLException
public void setToPreparedStatementTimestamp(PreparedStatement ps, int index, Serializable value, Column column) throws SQLException
SQLException
public abstract Serializable getFromResultSet(ResultSet rs, int index, Column column) throws SQLException
SQLException
public boolean storesUpperCaseIdentifiers()
public char openQuote()
public char closeQuote()
public String toBooleanValueString(boolean bool)
public static String toHexString(byte[] bytes)
public String getForeignKeyConstraintName(String tableName, String foreignColumnName, String foreignTableName)
public String getCreateIndexSql(String indexName, Table.IndexType indexType, Table table, List<Column> columns, Model model)
indexName
- the index name (for fulltext)indexType
- the index typetable
- the tablecolumns
- the columns to indexmodel
- the modelpublic abstract int getFulltextIndexedColumns()
public boolean supportsMultipleFulltextIndexes()
public abstract boolean getMaterializeFulltextSyntheticColumn()
public abstract String getCreateFulltextIndexSql(String indexName, String quotedIndexName, Table table, List<Column> columns, Model model)
public Dialect.FulltextQuery analyzeFulltextQuery(String query)
List of terms containing only negative words are suppressed. Otherwise negative words are put at the end of the lists of terms.
public static String translateFulltext(Dialect.FulltextQuery ft, String or, String and, String andNot, String phraseQuote)
public static String translateFulltext(Dialect.FulltextQuery ft, String or, String and, String andNot, String wordStart, String wordEnd, Set<Character> wordCharsReserved, String phraseStart, String phraseEnd, boolean quotePhraseWords)
public static boolean fulltextHasPhrase(Dialect.FulltextQuery ft)
public abstract String getDialectFulltextQuery(String query)
query
- the CMIS-syntax-based fulltext query stringpublic abstract Dialect.FulltextMatchInfo getFulltextScoredMatchInfo(String fulltextQuery, String indexName, int nthMatch, Column mainColumn, Model model, Database database)
public String getMatchMixinType(Column mixinsColumn, String mixin, boolean positive, String[] returnParam)
public boolean supportsPaging()
public String addPagingClause(String sql, long limit, long offset)
public int getFulltextType()
This is used for setNull.
public String getFreeVariableSetterForType(ColumnType type)
Needed for columns that need an expression around the value being set,
usually for conversion (this is the case for PostgreSQL fulltext
TSVECTOR
columns for instance).
type
- the column typepublic String getNoColumnsInsertString()
public String getNullColumnString()
public String getAddPrimaryKeyConstraintString(String constraintName)
public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKeys, String referencedTable, String[] primaryKeys, boolean referencesPrimaryKey)
public boolean qualifyIndexName()
public boolean supportsIfExistsBeforeTableName()
public boolean supportsIfExistsAfterTableName()
public String getCascadeDropConstraintsString()
public boolean supportsCircularCascadeDeleteConstraints()
public String getAddColumnString()
public abstract boolean supportsUpdateFrom()
public abstract boolean doesUpdateFromRepeatSelf()
public boolean needsOrderByKeysAfterDistinct()
public boolean needsAliasForDerivedTable()
public boolean needsOriginalColumnInGroupBy()
public boolean needsOracleJoins()
public boolean needsPrepareUserReadAcls()
public String getClobCast(boolean inOrderBy)
Needed for Derby and H2.
inOrderBy
- true
if the expression is for an ORDER BY columnnull
if no cast is
requiredpublic String getDateCast()
public String castIdToVarchar(String expr)
Used for uuid/varchar joins.
public Dialect.DialectIdType getIdType()
public abstract String getSecurityCheckSql(String idColumnName)
idColumnName
- the quoted name of the id column to usepublic boolean supportsAncestorsTable()
public abstract String getInTreeSql(String idColumnName)
idColumnName
- the quoted name of the id column to usepublic boolean supportsArrays()
If not, we'll simulate them using a string and a separator.
public boolean supportsArraysReturnInsteadOfRows()
Oracle needs this.
public boolean supportsSysNameArray()
public Array createArrayOf(int type, Object[] elements, Connection connection) throws SQLException
PreparedStatement.setArray(int, java.sql.Array)
.
(An equivalent method is defined by JDBC4 on the Connection
class.)
type
- the SQL type of the elementselements
- the elements of the arrayconnection
- the connectionSQLException
public abstract String getSQLStatementsFilename()
public abstract String getTestSQLStatementsFilename()
public abstract Map<String,Serializable> getSQLStatementsProperties(Model model, Database database)
public boolean isClusteringSupported()
public String getClusterNodeIdSql()
public boolean isClusteringDeleteNeeded()
getClusterGetInvalidations()
) need a separate delete for them (
getClusterDeleteInvalidations()
).public String getClusterInsertInvalidations()
public String getClusterGetInvalidations()
public String getClusterDeleteInvalidations()
public boolean supportsIlike()
public boolean supportsReadAcl()
public boolean supportsConcurrentUpdateReadAcls()
public boolean supportsWith()
public boolean hasNullEmptyString()
public int getMaximumArgsForIn()
Beyond this size we'll do the query in several chunks.
PostgreSQL is limited to 65535 values in a prepared statement.
Oracle is limited to 1000 expressions in a list (ORA-01795).
public String getUpdateReadAclsSql()
public String getRebuildReadAclsSql()
public String getReadAclsCheckSql(String idColumnName)
idColumnName
- the quoted name of the read acl_id column to usepublic String getPrepareUserReadAclsSql()
public boolean preCreateTable(Connection connection, Table table, Model model, Database database) throws SQLException
false
if the table must actually not be createdSQLException
public List<String> getPostCreateTableSqls(Table table, Model model, Database database)
Used for migrations/upgrades.
public void existingTableDetected(Connection connection, Table table, Model model, Database database) throws SQLException
Used for migrations/upgrades.
SQLException
public boolean isConnectionClosedException(Throwable t)
public boolean isConcurrentUpdateException(Throwable t)
public void performAdditionalStatements(Connection connection) throws SQLException
connection
- SQLException
public String getValidationQuery()
The query should throw an error if the connection is dead.
public String getBlobLengthFunction()
public void performPostOpenStatements(Connection connection) throws SQLException
SQLException
public List<String> getPostCreateIdentityColumnSql(Column column)
Oracle needs both a sequence and a trigger.
public boolean isIdentityAlreadyPrimary()
MySQL defines the identity column directly as primary key.
public boolean hasIdentityGeneratedKey()
Oracle needs a separate call to CURRVAL.
public String getIdentityGeneratedKeySql(Column column)
Oracle needs a separate call to CURRVAL.
public String getAncestorsIdsSql()
public String getDescending()
public List<String> getIgnoredColumns(Table table)
public String getCustomColumnDefinition(Table table)
public List<String> getCustomPostCreateSqls(Table table)
public String getSoftDeleteSql()
public String getSoftDeleteCleanupSql()
Copyright © 2013 Nuxeo SA. All Rights Reserved.