Class PostgresTranslator
- java.lang.Object
-
- org.linuxforhealth.fhir.database.utils.postgres.PostgresTranslator
-
- All Implemented Interfaces:
IDatabaseTranslator
- Direct Known Subclasses:
CitusTranslator
public class PostgresTranslator extends java.lang.Object implements IDatabaseTranslator
translates database access to Postgres supported access.
-
-
Constructor Summary
Constructors Constructor Description PostgresTranslator()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description java.lang.String
addForUpdate(java.lang.String sql)
Append FOR UPDATE/FOR UPDATE WITH RS depending on the target DB typeboolean
clobSupportsInline()
Does the database support inlining for clobsjava.lang.String
createGlobalTempTable(java.lang.String ddl)
java.lang.String
createSequence(java.lang.String name, int cache)
Craft the DDL for a CREATE SEQUENCE statementjava.lang.String
currentTimestampString()
Get the "CURRENT TIMESTAMP" string for the database typejava.lang.String
dropForeignKeyConstraint(java.lang.String qualifiedTableName, java.lang.String constraintName)
Generate the DDL for dropping the named FK constraint from the given tablejava.lang.String
dropView(java.lang.String qualifiedViewName)
Generate the DDL for dropping the named viewjava.lang.String
dualTableName()
The name of the "DUAL" table...that special table giving us one row/column.void
fillProperties(java.util.Properties p, ConnectionDetails cd)
Configure the properties using information from the ConnectionDetailsjava.lang.String
getDriverClassName()
Get the driver class to use for connectionsDbType
getType()
The main type of the databasejava.lang.String
getUrl(java.util.Properties connectionProperties)
Get the JDBC connection URL based on the propertiesjava.lang.String
globalTempTableName(java.lang.String tableName)
Get the proper table name based on the type of database we are connected to.boolean
isAlreadyExists(java.sql.SQLException x)
Check the exception to see if it is reporting that THE NAME OF THE OBJECT TO BE CREATED OR THE TARGET OF A RENAME STATEMENT IS IDENTICAL TO THE EXISTING NAME OF THE OBJECT TYPEboolean
isConnectionError(java.sql.SQLException x)
Returns true if the exception represents a connection errorboolean
isDeadlock(java.sql.SQLException x)
Was this statement the victim of a deadlockboolean
isDerby()
Are we working with a Derby databaseboolean
isDuplicate(java.sql.SQLException x)
Check the exception to see if it is reporting a duplicate value constraint violationboolean
isDuplicateSchema(java.sql.SQLException x)
boolean
isFamilyPostgreSQL()
True if the database type is part of the PostgreSQL family (POSTGRESQL, CITUS)boolean
isIndexUseSchemaPrefix()
Does this database use the schema prefix when defining indexesboolean
isLockTimeout(java.sql.SQLException x)
Database timed out waiting to get a lock.boolean
isUndefinedName(java.sql.SQLException x)
Returns true if the SQLException is indicating an object is undefined (e.g.java.lang.String
limit(java.lang.String arg)
Get the correct LIMIT/FETCH NEXT ROWS clause for the databasejava.util.Optional<java.lang.Integer>
maximumQueryParameters()
java.lang.String
nextValue(java.lang.String schemaName, java.lang.String sequenceName)
Statement for getting the next value (for use in a select list or insert values)java.lang.String
pagination(int offset, int rowsPerPage)
Construct a pagination clause specific to the type of databasejava.lang.String
reorgTableCommand(java.lang.String tableName)
Return the REORG TABLE command if supported, or null otherwisejava.lang.String
selectSequenceNextValue(java.lang.String schemaName, java.lang.String sequenceName)
Compose a select statement to obtain the next value from the named sequencejava.lang.String
timestampDiff(java.lang.String left, java.lang.String right, java.lang.String alias)
Returns an expression which computes the timestamp difference between left and right in secondsDataAccessException
translate(java.sql.SQLException x)
Get an appropriate instance of ReplicatorException to throw depending on the details of SQLException
-
-
-
Method Detail
-
addForUpdate
public java.lang.String addForUpdate(java.lang.String sql)
Description copied from interface:IDatabaseTranslator
Append FOR UPDATE/FOR UPDATE WITH RS depending on the target DB type- Specified by:
addForUpdate
in interfaceIDatabaseTranslator
- Returns:
-
isDerby
public boolean isDerby()
Description copied from interface:IDatabaseTranslator
Are we working with a Derby database- Specified by:
isDerby
in interfaceIDatabaseTranslator
- Returns:
-
globalTempTableName
public java.lang.String globalTempTableName(java.lang.String tableName)
Description copied from interface:IDatabaseTranslator
Get the proper table name based on the type of database we are connected to. Derby has its own handling of temp tables- Specified by:
globalTempTableName
in interfaceIDatabaseTranslator
- Returns:
-
createGlobalTempTable
public java.lang.String createGlobalTempTable(java.lang.String ddl)
- Specified by:
createGlobalTempTable
in interfaceIDatabaseTranslator
- Returns:
-
isDuplicate
public boolean isDuplicate(java.sql.SQLException x)
Description copied from interface:IDatabaseTranslator
Check the exception to see if it is reporting a duplicate value constraint violation- Specified by:
isDuplicate
in interfaceIDatabaseTranslator
- Returns:
-
isAlreadyExists
public boolean isAlreadyExists(java.sql.SQLException x)
Description copied from interface:IDatabaseTranslator
Check the exception to see if it is reporting that THE NAME OF THE OBJECT TO BE CREATED OR THE TARGET OF A RENAME STATEMENT IS IDENTICAL TO THE EXISTING NAME OF THE OBJECT TYPE- Specified by:
isAlreadyExists
in interfaceIDatabaseTranslator
- Returns:
-
isLockTimeout
public boolean isLockTimeout(java.sql.SQLException x)
Description copied from interface:IDatabaseTranslator
Database timed out waiting to get a lock. This is not the same as a deadlock, of course- Specified by:
isLockTimeout
in interfaceIDatabaseTranslator
- Returns:
-
isIndexUseSchemaPrefix
public boolean isIndexUseSchemaPrefix()
Description copied from interface:IDatabaseTranslator
Does this database use the schema prefix when defining indexes- Specified by:
isIndexUseSchemaPrefix
in interfaceIDatabaseTranslator
- Returns:
-
isDeadlock
public boolean isDeadlock(java.sql.SQLException x)
Description copied from interface:IDatabaseTranslator
Was this statement the victim of a deadlock- Specified by:
isDeadlock
in interfaceIDatabaseTranslator
- Returns:
-
isConnectionError
public boolean isConnectionError(java.sql.SQLException x)
Description copied from interface:IDatabaseTranslator
Returns true if the exception represents a connection error- Specified by:
isConnectionError
in interfaceIDatabaseTranslator
- Returns:
-
translate
public DataAccessException translate(java.sql.SQLException x)
Description copied from interface:IDatabaseTranslator
Get an appropriate instance of ReplicatorException to throw depending on the details of SQLException- Specified by:
translate
in interfaceIDatabaseTranslator
- Returns:
-
isDuplicateSchema
public boolean isDuplicateSchema(java.sql.SQLException x)
-
isUndefinedName
public boolean isUndefinedName(java.sql.SQLException x)
Description copied from interface:IDatabaseTranslator
Returns true if the SQLException is indicating an object is undefined (e.g. "DROP TABLE foo.bar", where table "foo.bar" doesn't exist)- Specified by:
isUndefinedName
in interfaceIDatabaseTranslator
- Returns:
-
fillProperties
public void fillProperties(java.util.Properties p, ConnectionDetails cd)
Description copied from interface:IDatabaseTranslator
Configure the properties using information from the ConnectionDetails- Specified by:
fillProperties
in interfaceIDatabaseTranslator
-
timestampDiff
public java.lang.String timestampDiff(java.lang.String left, java.lang.String right, java.lang.String alias)
Description copied from interface:IDatabaseTranslator
Returns an expression which computes the timestamp difference between left and right in seconds- Specified by:
timestampDiff
in interfaceIDatabaseTranslator
alias
- adds " AS alias " if alias is not null- Returns:
-
createSequence
public java.lang.String createSequence(java.lang.String name, int cache)
Description copied from interface:IDatabaseTranslator
Craft the DDL for a CREATE SEQUENCE statement- Specified by:
createSequence
in interfaceIDatabaseTranslator
cache
- the number of sequence values to cache, if supported by the database- Returns:
-
reorgTableCommand
public java.lang.String reorgTableCommand(java.lang.String tableName)
Description copied from interface:IDatabaseTranslator
Return the REORG TABLE command if supported, or null otherwise- Specified by:
reorgTableCommand
in interfaceIDatabaseTranslator
- Returns:
-
getDriverClassName
public java.lang.String getDriverClassName()
Description copied from interface:IDatabaseTranslator
Get the driver class to use for connections- Specified by:
getDriverClassName
in interfaceIDatabaseTranslator
- Returns:
-
getUrl
public java.lang.String getUrl(java.util.Properties connectionProperties)
Description copied from interface:IDatabaseTranslator
Get the JDBC connection URL based on the properties- Specified by:
getUrl
in interfaceIDatabaseTranslator
- Returns:
-
clobSupportsInline
public boolean clobSupportsInline()
Description copied from interface:IDatabaseTranslator
Does the database support inlining for clobs- Specified by:
clobSupportsInline
in interfaceIDatabaseTranslator
- Returns:
-
getType
public DbType getType()
Description copied from interface:IDatabaseTranslator
The main type of the database- Specified by:
getType
in interfaceIDatabaseTranslator
- Returns:
-
dualTableName
public java.lang.String dualTableName()
Description copied from interface:IDatabaseTranslator
The name of the "DUAL" table...that special table giving us one row/column.- Specified by:
dualTableName
in interfaceIDatabaseTranslator
- Returns:
- the name of the "DUAL" table for the database, or null if not supported
-
selectSequenceNextValue
public java.lang.String selectSequenceNextValue(java.lang.String schemaName, java.lang.String sequenceName)
Description copied from interface:IDatabaseTranslator
Compose a select statement to obtain the next value from the named sequence- Specified by:
selectSequenceNextValue
in interfaceIDatabaseTranslator
- Returns:
-
currentTimestampString
public java.lang.String currentTimestampString()
Description copied from interface:IDatabaseTranslator
Get the "CURRENT TIMESTAMP" string for the database type- Specified by:
currentTimestampString
in interfaceIDatabaseTranslator
- Returns:
-
dropForeignKeyConstraint
public java.lang.String dropForeignKeyConstraint(java.lang.String qualifiedTableName, java.lang.String constraintName)
Description copied from interface:IDatabaseTranslator
Generate the DDL for dropping the named FK constraint from the given table- Specified by:
dropForeignKeyConstraint
in interfaceIDatabaseTranslator
- Parameters:
qualifiedTableName
- such as schema.foo_tabconstraintName
- the constraint name of the FK- Returns:
-
dropView
public java.lang.String dropView(java.lang.String qualifiedViewName)
Description copied from interface:IDatabaseTranslator
Generate the DDL for dropping the named view- Specified by:
dropView
in interfaceIDatabaseTranslator
- Returns:
-
nextValue
public java.lang.String nextValue(java.lang.String schemaName, java.lang.String sequenceName)
Description copied from interface:IDatabaseTranslator
Statement for getting the next value (for use in a select list or insert values)- Specified by:
nextValue
in interfaceIDatabaseTranslator
- Returns:
-
limit
public java.lang.String limit(java.lang.String arg)
Description copied from interface:IDatabaseTranslator
Get the correct LIMIT/FETCH NEXT ROWS clause for the database- Specified by:
limit
in interfaceIDatabaseTranslator
- Parameters:
arg
- a literal int or ? bind-variable marker- Returns:
-
pagination
public java.lang.String pagination(int offset, int rowsPerPage)
Description copied from interface:IDatabaseTranslator
Construct a pagination clause specific to the type of database- Specified by:
pagination
in interfaceIDatabaseTranslator
- Parameters:
offset
- the row offsetrowsPerPage
- limit the number of rows returned (from the offset)- Returns:
-
maximumQueryParameters
public java.util.Optional<java.lang.Integer> maximumQueryParameters()
- Specified by:
maximumQueryParameters
in interfaceIDatabaseTranslator
- Returns:
- the total number of parameters supported by the data store during a query. An empty optional indicates no maximum is set.
-
isFamilyPostgreSQL
public boolean isFamilyPostgreSQL()
Description copied from interface:IDatabaseTranslator
True if the database type is part of the PostgreSQL family (POSTGRESQL, CITUS)- Specified by:
isFamilyPostgreSQL
in interfaceIDatabaseTranslator
- Returns:
-
-