public interface P2JDialect
Dialect
class
to add methods required by the P2J persistence framework. The
implementations of these methods are necessarily specific to the backing
database and may be different for different database vendors.
NOTE: a longer term goal is to eliminate this interface by merging these
methods back into the mainstream Hibernate Dialect
class.
Modifier and Type | Method and Description |
---|---|
void |
addRtrimmedExpression(java.lang.String expr,
java.lang.StringBuilder sb)
Composes a rtrim equivalent call for a specified expression.
|
void |
beforeDriverLoad()
Set any database parameters before, to be available when the database
driver is loaded.
|
java.lang.String |
buildRemoteURL(java.lang.String url,
Database database)
Build the URL to be used for a remote connection, based on the given
URL and database.
|
int |
computeIndexKeySize(BaseDataType value)
Computes the size (in bytes) occupied by this value when stored as index-key in an index.
|
java.lang.Object |
createContext(Persistence persistence)
Create a data object, the purpose of which is specific to a particular
dialect implementation, to be stored as a context-local object.
|
SequenceHandler |
createSequenceHandler(java.lang.String ldbName)
Creates and returns a
SequenceHandler for a database. |
boolean |
explicitSetCollation()
Check if the dialect needs to set an explicit collation during schema
DDL generation.
|
java.lang.String |
extractColumnName(java.lang.String expr)
Given a column expression as queried from database metadata, extract the root name of a
column.
|
java.lang.String |
formatDate(date d)
Format a date object as a string which is appropriate for use in an SQL
statement.
|
java.lang.String |
getAlterComputedColumnString(java.lang.String tableName,
org.hibernate.cfg.Configuration config,
java.lang.String implClassName,
java.lang.String colName,
boolean ignoreCase)
Build the DDL to set the formula for the computed columns associated
with an indexed, character column.
|
java.lang.String |
getComputedColumnFormula(java.lang.String colName,
boolean ignoreCase)
Returns the formula for character computed columns.
|
java.lang.String |
getComputedColumnPrefix(boolean caseSensitive)
Get the prefix, if any, which should be prepended to computed column and/or property names.
|
java.lang.String |
getCreateIndexString(P2JIndex index,
boolean unique,
boolean toFile)
Build the DDL to create an index based upon the specified definition.
|
java.lang.String |
getCreateSequenceString(java.lang.String name,
long start)
Generate a DDL string which will create a global sequence with the given
starting value.
|
java.lang.String |
getCreateSequenceString(java.lang.String name,
java.lang.Long init,
java.lang.Long increment,
java.lang.Long minVal,
java.lang.Long maxVal,
java.lang.Boolean cycle)
Generate a DDL string which will create a sequence with given
properties.
|
java.util.List<java.lang.String> |
getDatabasePrepareStatements(Database database)
Get a list of database prepare DDL statements.
|
java.lang.String |
getDelimiter()
Get the statement delimiter for this dialect.
|
java.lang.String |
getDropIndexString(P2JIndex index)
Build the DDL to drop an index based upon the specified definition.
|
java.lang.String |
getDropSequenceString(java.lang.String name)
Generate a DDL string which will drop a sequence with given
properties.
|
java.sql.Date |
getHighDate()
Retrieve the latest possible date value which is valid for the backing
database.
|
int |
getIndexLengthLimit()
Some dialects do have constraints about the maximum size of fields that compose an index.
|
java.sql.Date |
getLowDate()
Retrieve the earliest possible date value which is valid for the
backing database.
|
int |
getMaxParameterCount()
Obtain the number of parameters a query of this dialect is allowed by the SQL server.
|
java.lang.String |
getProcessedCharacterColumnName(java.lang.String name,
boolean ignoreCase)
Adjust a character column name appropriate to this dialect, such that it
can be inserted into an index.
|
java.lang.String |
getSequenceCurrValString(java.lang.String sequenceName)
Generate the appropriate select statement to retrieve the current
value of a sequence.
|
java.lang.String |
getSequenceNextValString(java.lang.String sequenceName)
Generate the appropriate select statement to retrieve the next
value of a sequence.
|
java.lang.String |
getSequencePrefetchString(java.lang.String sequenceName)
Generate the appropriate select statement to pre-fetch multiple, ascending values from a
sequence.
|
java.lang.String |
getSequenceSetValString(java.lang.String sequenceName,
long newVal)
Generate the appropriate select statement to reset the value of a
sequence.
|
int |
getSyntheticIndexSize(boolean unique)
Returns the size of the synthetic part of the index.
|
boolean |
hasFullSequenceSupport()
Returns
true if this dialect fully support the sequences as
4GL language (most important: bounded values, cycle). |
boolean |
injectComputedColumns()
Report whether the computed columns should be injected on table creating.
|
void |
inlineLimit(boolean on)
Enable/disable limit clause inlining.
|
boolean |
isCaseInsensitiveColumn(java.lang.String name)
Report whether the given column name represents an alias or an expression which indicates
the column is case insensitive.
|
boolean |
isComputedColumn(java.lang.String name)
Report whether the given column name represents an alias or an expression which indicates
the column is computed.
|
boolean |
isConnectionError(java.lang.Exception exc)
Given an exception, this method will check if it indicates a database
connectivity error.
|
boolean |
isMetadataSortAsc(java.lang.String value)
Check if the given value is a desceding clause for a column index.
|
boolean |
isMetadataSortDesc(java.lang.String value)
Check if the given value is an asceding clause for a column index.
|
boolean |
isQueryRangeParameterInlined()
Indicate whether a query parameter which is part of a range check should
be inlined into the where clause, or whether it should be substituted
into a prepared statement.
|
boolean |
needsComputedColumns()
Indicate whether this dialect requires computed columns to participate
within index definitions, instead of embedded expressions.
|
void |
postTransaction(Persistence persistence,
java.lang.Object context,
boolean rollback)
A dialect-specific callback hook which is invoked by the persistence
runtime framework after a transaction is complete.
|
java.lang.String |
prepareMetadataParameter(java.lang.String param)
Prepare the given metadata query parameter.
|
java.lang.String |
processMetadataResult(java.lang.String value)
Process the given metadata query result.
|
java.lang.String |
quote(java.lang.String expr)
Apply dialect-specific quoting.
|
boolean |
requiresExplicitCastInsideTernary()
Determines whether substitution parameters should be explicitly casted
to their datatypes inside "then ? else ?" statement.
|
boolean |
supportsBooleanDatatype()
Indicates whether this dialect supports boolean datatype.
|
boolean |
supportsFunctionOverloading()
Indicate whether this dialect natively supports the overloading of user
defined functions by parameter number and data type.
|
java.lang.Object createContext(Persistence persistence)
Since the context-local data is specific to a particular dialect
implementation, it is optional. Dialect implementations which do not
have a need for this data should simply return null
.
persistence
- Provider of persistence services.null
.void postTransaction(Persistence persistence, java.lang.Object context, boolean rollback) throws PersistenceException
persistence
- Provider of persistence services.context
- Optional, context-local data created previously by createContext(com.goldencode.p2j.persist.Persistence)
.rollback
- true
if transaction ended with a rollback;
false
if transaction ended with a commit.PersistenceException
- if any persistence-related error occurs.java.sql.Date getLowDate()
java.sql.Date getHighDate()
java.lang.String formatDate(date d)
d
- Date to be formatted as a string.java.lang.String extractColumnName(java.lang.String expr)
upper(rtrim("key"::text))We are interested only in the
key
root name, so we strip away the upper()
and rtrim()
functions, the double quotes, and the ::text
suffix.expr
- Expression containing column name as natively represented by
the database dialect.java.lang.String getProcessedCharacterColumnName(java.lang.String name, boolean ignoreCase)
name
- Base column name.ignoreCase
- true
to cause case to be ignored, else false
.boolean isCaseInsensitiveColumn(java.lang.String name)
name
is
already determined to be the appropriate data type for textual data.name
- Column name, alias, or expression.true
if name
represents case-insensitive data.boolean isComputedColumn(java.lang.String name)
name
is
already determined to be the appropriate data type for textual data.name
- Column name, alias, or expression.true
if name
represents a computed column.boolean needsComputedColumns()
true
to indicate computed columns are required;
false
if the backing database can embed an
expression within an index definition.java.lang.String getComputedColumnPrefix(boolean caseSensitive)
caseSensitive
- true
if this is a character field was declared with
CASE-SENSITIVE
attribute. In each case the column name will be
name-decorated differently.null
if the
backing database does not use computed columns.needsComputedColumns()
boolean supportsFunctionOverloading()
true
if the backing database natively supports
overloading, else false
.boolean supportsBooleanDatatype()
true
and false
literals;
true
if the above mentioned items are supported or false
if they
are handled by a replacement datatype (integer).java.lang.String getCreateSequenceString(java.lang.String name, long start)
name
- Sequence name.start
- Sequence starting value.null
if not supported.java.lang.String getCreateSequenceString(java.lang.String name, java.lang.Long init, java.lang.Long increment, java.lang.Long minVal, java.lang.Long maxVal, java.lang.Boolean cycle)
name
- Sequence name. Mandatory not null.init
- Sequence starting value. Mandatory not null.increment
- Sequence incrementing value. Mandatory not null.minVal
- Sequence minimum value. Optional.maxVal
- Sequence maximum value. Optional.cycle
- Sequence cycling property.
Optional, if missing assumed not cycling.null
if not supported.java.lang.String getDropSequenceString(java.lang.String name)
name
- The name of the sequence to be dropped.null
if not supported.java.lang.String getSequenceSetValString(java.lang.String sequenceName, long newVal)
sequenceName
- The name of the sequence.newVal
- The new value to be set.null
if not supported.java.lang.String getSequenceNextValString(java.lang.String sequenceName)
sequenceName
- The name of the sequence to be queried.null
if not supported.java.lang.String getSequenceCurrValString(java.lang.String sequenceName)
sequenceName
- The name of the sequence to be queried.null
if not supported.boolean hasFullSequenceSupport()
true
if this dialect fully support the sequences as
4GL language (most important: bounded values, cycle). If not fully
supported, additional code is needed in P2J sequence class
implementation to fix this.java.lang.String getSequencePrefetchString(java.lang.String sequenceName)
sequenceName
- The name of the sequence from which the values are to be retrieved.null
if this feature is not supported
by the dialect.boolean isConnectionError(java.lang.Exception exc)
exc
- The exception to be checked.true
if the exception indicates a database
connectivity error.boolean isQueryRangeParameterInlined()
where value ≥ ? and id = ?along with respective substitution parameters of 45 and 100, the inlined version would read:
where value ≥ 45 and id = ?Only the
id
substitution parameter of 100 would be
substituted into the prepared statement.
Inlining in such a way can give some database dialects the opportunity to choose a better query plan, than if the parameter being tested with a range check were to be substituted at statement execution time.
Note: this serves as a hint which may be overridden by runtime logic or other configuration settings.
true
to inline range check parameters;
false
to use normal parameter substitution.void inlineLimit(boolean on)
Dialects are free to treat this method as a hint.
on
- true
to enable inlining; false
to
disable it.boolean requiresExplicitCastInsideTernary()
true
if they should be casted.java.lang.String getDropIndexString(P2JIndex index)
index
- Definition of the index to be dropped.java.lang.String getCreateIndexString(P2JIndex index, boolean unique, boolean toFile)
index
- Definition of the index to be created.unique
- If true
, create the index as a unique index,
false
to omit the unique constraint.toFile
- true
if the string will be output to a file or
false
if it will be directly submitted via JDBC.java.lang.String getAlterComputedColumnString(java.lang.String tableName, org.hibernate.cfg.Configuration config, java.lang.String implClassName, java.lang.String colName, boolean ignoreCase)
needsComputedColumns()
call
returns true
.tableName
- Table name possible containing backticks.config
- The hibernate's configuration object.implClassName
- The full name of the implementing class for the DMO.colName
- The column name which needs to have a computed version. This is
not the computed column name, but the name of its "parent".ignoreCase
- true
if this is a character field which has the
"ignore case" flag set.java.lang.String getComputedColumnFormula(java.lang.String colName, boolean ignoreCase)
colName
- The base column name.ignoreCase
- true
if this is a char field which has the "ignore case" flag set.null
if the dialect does not support
computed columns.java.lang.String prepareMetadataParameter(java.lang.String param)
param
- The metadata query parameter.java.lang.String processMetadataResult(java.lang.String value)
value
- The metadata query result.boolean isMetadataSortDesc(java.lang.String value)
value
- The value to be checked.true
if the value is the "ascending" clause.boolean isMetadataSortAsc(java.lang.String value)
value
- The value to be checked.true
if the value is the "descending" clause.java.util.List<java.lang.String> getDatabasePrepareStatements(Database database)
database
- The database which needs to be prepared.boolean explicitSetCollation()
true
if the collation needs to be explicitly set.java.lang.String getDelimiter()
void beforeDriverLoad()
java.lang.String buildRemoteURL(java.lang.String url, Database database) throws PersistenceException
url
- The URL as received from the remote server.database
- The database to which this URL belongs.PersistenceException
- if the specified connection URL is invalid.SequenceHandler createSequenceHandler(java.lang.String ldbName)
SequenceHandler
for a database.ldbName
- The logical name of the database to create the SequenceHandler
for.SequenceHandler
for respective database.boolean injectComputedColumns()
true
if the computed columns should be injected on table creating
else false
.java.lang.String quote(java.lang.String expr)
By default, the incoming value is checked to see if its first character is the back-tick (`). If so, the dialect specific quoting is applied.
expr
- String expression.int getIndexLengthLimit()
int computeIndexKeySize(BaseDataType value)
getIndexLengthLimit()
returns
positive values.
If this dialect does not have index-size constraints then this method should return 0.
If the value or value type is unknown or cannot be handled by the dialect -1 will be
returned.value
- The value that is part of an index.int getSyntheticIndexSize(boolean unique)
id
of the record may be additionally added to an index to add custom properties (eg uniqueness)
but other fields could be added. This part of the index is not visible using index
reflection routines from IndexHelper
. The synthetic components may differ
between unique and non-unique indexes.unique
- true
if the index is uniquevoid addRtrimmedExpression(java.lang.String expr, java.lang.StringBuilder sb)
rtrim(expr)The rtrim-med expression is appended to the string builder. The return value (the number of occurrences of the initial expr added to sb) should be use by caller to count the number of possible parameters from a query.
expr
- The expression to be rtrim -med. It's up to the caller if it is
a qualified field or not or any other kind of character-type expression.sb
- The StringBuilder
to append the trimmed filed to.int getMaxParameterCount()