Difference between revisions of "PostgreSQL Adapter Project - Code Review 1 Changes"

From CDOT Wiki
Jump to: navigation, search
(PostgreSQLSchemaManager)
 
(10 intermediate revisions by one other user not shown)
Line 1: Line 1:
 +
{{Admon/obsolete}}
 +
 
[[category: NexJ Express PostgreSQL]][[category: NexJ Express Development]] [[category: NexJ Express]]
 
[[category: NexJ Express PostgreSQL]][[category: NexJ Express Development]] [[category: NexJ Express]]
 +
  
 
=General Research=
 
=General Research=
Line 5: Line 8:
 
|-
 
|-
 
! Task
 
! Task
! Status
+
! Out Come
 
|-  
 
|-  
 
| Can postgreSQL be configured to have the where clause use case insensitive compare for string values? i.e. (<code>select 'Q' = 'q'</code> => should return true)
 
| Can postgreSQL be configured to have the where clause use case insensitive compare for string values? i.e. (<code>select 'Q' = 'q'</code> => should return true)
| (DONE)
+
| http://www.postgresql.org/docs/8.4/static/citext.html
http://www.postgresql.org/docs/8.4/static/citext.html
 
 
|-
 
|-
 
|Add UUID generation to x64 versions
 
|Add UUID generation to x64 versions
|
+
|UUID generation depends on OSSP-UUID which is not yet ported to x64.
 
|-
 
|-
 
|Does <code>extract(epoch from value)</code> return milliseconds?
 
|Does <code>extract(epoch from value)</code> return milliseconds?
Line 21: Line 23:
 
|-
 
|-
 
| How is a repeatable read with exclusive lock implemented?
 
| How is a repeatable read with exclusive lock implemented?
|
+
|It is not supported.
 
|-
 
|-
 
|Does timestamp'value', handle java.sql.timestamp.toString()?
 
|Does timestamp'value', handle java.sql.timestamp.toString()?
Line 47: Line 49:
 
http://www.postgresql.org/docs/8.3/static/lo.html#AEN104018  
 
http://www.postgresql.org/docs/8.3/static/lo.html#AEN104018  
 
|}
 
|}
 +
  
 
=Classes=
 
=Classes=
 +
 +
 
==PostgreSQLAdapter==
 
==PostgreSQLAdapter==
 
{| border="1" cellpadding="4" cellspacing="2" style="border: 1px solid black;border-collapse:collapse;"
 
{| border="1" cellpadding="4" cellspacing="2" style="border: 1px solid black;border-collapse:collapse;"
Line 55: Line 60:
 
! Status
 
! Status
 
! UnitTest
 
! UnitTest
 +
|-
 +
|* Extending CaseInsensitiveSQLAdapter
 +
|'''DONE'''
 +
|'''DONE'''
 
|-  
 
|-  
 
|Implement setQueryTime with Timer object
 
|Implement setQueryTime with Timer object
 
* if code variation is limited, extract to SQLAdapter
 
* if code variation is limited, extract to SQLAdapter
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
| Refactor escaping literals
 
| Refactor escaping literals
 
* May be make use isLiteral
 
* May be make use isLiteral
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|appendMatchExpression
 
|appendMatchExpression
Line 70: Line 79:
 
* Remove implementation of MatchNode.WEIGHT.SYMBOL
 
* Remove implementation of MatchNode.WEIGHT.SYMBOL
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|indexNameMatches
 
|indexNameMatches
 
* Use toMetadataCase and toDatabaseCase instead of toLowerCase/toUpperCase
 
* Use toMetadataCase and toDatabaseCase instead of toLowerCase/toUpperCase
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|appendSuffixHint
 
|appendSuffixHint
* Implement query locking for aggregate queries (i.e. repeatable read + exclusive lock)
+
* Implement query locking for OUTER JOIN queries (i.e. repeatable read + exclusive lock)
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
| appendLiteral
 
| appendLiteral
Line 86: Line 95:
 
* If boolean constants are supported, use those instead of string 't'/'f'
 
* If boolean constants are supported, use those instead of string 't'/'f'
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
| getBind
 
| getBind
 
* Check if override is necessary
 
* Check if override is necessary
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
| isLiteral
 
| isLiteral
 
* Use string.length and binary.getSize to ensure less than 1GB
 
* Use string.length and binary.getSize to ensure less than 1GB
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
| appendTypeConversion
 
| appendTypeConversion
Line 102: Line 111:
 
* Ensure case Primitive.TIMESTAMP_ORDINAL: returns milliseconds (extract(epoch from
 
* Ensure case Primitive.TIMESTAMP_ORDINAL: returns milliseconds (extract(epoch from
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
| isUnicode
 
| isUnicode
Line 108: Line 117:
 
* TRUE == is a unicode column FALSE == is not a unicode column null == unknown (e.g. number column or column not present)
 
* TRUE == is a unicode column FALSE == is not a unicode column null == unknown (e.g. number column or column not present)
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
| s_bindFactoryArray[Primitive.BINARY_ORDINAL]
 
| s_bindFactoryArray[Primitive.BINARY_ORDINAL]
Line 118: Line 127:
 
* Modify pattern to remove dependency on english words
 
* Modify pattern to remove dependency on english words
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|s_bindFactoryArray
 
|s_bindFactoryArray
 
* Use parent BINDS for unchanged binds
 
* Use parent BINDS for unchanged binds
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|}
 
|}
 +
  
 
==PostgreSQLSchemaManager==
 
==PostgreSQLSchemaManager==
Line 132: Line 142:
 
! Status
 
! Status
 
! UnitTest
 
! UnitTest
 +
|-
 +
|* Extending CaseInsensitiveSQLSchemaManager
 +
|'''DONE'''
 +
|'''DONE'''
 
|-
 
|-
 
|Override setCustomDatabaseProperties
 
|Override setCustomDatabaseProperties
 
*Add template fields for postgreSQL scripts
 
*Add template fields for postgreSQL scripts
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-  
 
|-  
 
|dropTable
 
|dropTable
 
* Remove <code>if exists</code>
 
* Remove <code>if exists</code>
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|getGUIDExpr
 
|getGUIDExpr
Line 150: Line 164:
 
|remove trigger and procedure suffix $uid
 
|remove trigger and procedure suffix $uid
 
|'''DONE'''
 
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|getDefaultLongspace, getDefaultTablespace, getDefaultIndexspace
 
|getDefaultLongspace, getDefaultTablespace, getDefaultIndexspace
Line 159: Line 173:
 
|getPrimaryKeys
 
|getPrimaryKeys
 
* check if override is needed
 
* check if override is needed
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|generateIndexName
 
|generateIndexName
 
* Check if toLowerCase is needed
 
* Check if toLowerCase is needed
|
+
|'''DONE''''
|
+
|'''DONE'''
 
|-
 
|-
 
|appendColumnType
 
|appendColumnType
 
* check if serial and bigserial have limits when compared to using sequences
 
* check if serial and bigserial have limits when compared to using sequences
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|Refactor creating and deleting full-text search indexes
 
|Refactor creating and deleting full-text search indexes
Line 181: Line 195:
 
** dropFullTextSearchProcedure
 
** dropFullTextSearchProcedure
 
** dropFullTextSearchTrigger
 
** dropFullTextSearchTrigger
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|Refactor checking for BLOB column to isBLOB
 
|Refactor checking for BLOB column to isBLOB
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|Refactor checking for full-text search index on a column to getFullTextIndex
 
|Refactor checking for full-text search index on a column to getFullTextIndex
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|alterColumn - use this logic
 
|alterColumn - use this logic
Line 196: Line 210:
 
* alter the column
 
* alter the column
 
* create the deleted view/s
 
* create the deleted view/s
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|renameColumn - use this logic for  
 
|renameColumn - use this logic for  
Line 205: Line 219:
 
* drop full-text search trigger
 
* drop full-text search trigger
 
* create full-text search trigger
 
* create full-text search trigger
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|dropIndex
 
|dropIndex
Line 213: Line 227:
 
** drop column$
 
** drop column$
 
** drop full-text search trigger
 
** drop full-text search trigger
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|appendColumnAlternation
 
|appendColumnAlternation
Line 223: Line 237:
 
|renameTable
 
|renameTable
 
* fix full-text search trigger maintainence
 
* fix full-text search trigger maintainence
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|deleteLargeObjects
 
|deleteLargeObjects
 
* change to use for loop instead of iterator
 
* change to use for loop instead of iterator
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|getIndexInfo
 
|getIndexInfo
 
*check if override is needed for
 
*check if override is needed for
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
| Use toMetadataCase and toDatabaseCase instead of toLowerCase/toUpperCase
 
| Use toMetadataCase and toDatabaseCase instead of toLowerCase/toUpperCase
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|}
 
|}
  
Line 263: Line 277:
 
|-
 
|-
 
|Add comment to enable PREPARE TRANSACTION
 
|Add comment to enable PREPARE TRANSACTION
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|Use template field to set location of contrib folder
 
|Use template field to set location of contrib folder
 
*make use of ${path}
 
*make use of ${path}
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|Add template field to set location for tablespace, indexspace and longspace
 
|Add template field to set location for tablespace, indexspace and longspace
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|Add SQL to create tablespace, indexspace and longspace
 
|Add SQL to create tablespace, indexspace and longspace
|
+
|'''DONE'''
|
+
|'''DONE'''
 
|-
 
|-
 
|Move function creation to postgresql_create.sql
 
|Move function creation to postgresql_create.sql

Latest revision as of 20:32, 26 January 2014

Important.png
This page may be obsolete.
It contains historical information.


General Research

Task Out Come
Can postgreSQL be configured to have the where clause use case insensitive compare for string values? i.e. (select 'Q' = 'q' => should return true) http://www.postgresql.org/docs/8.4/static/citext.html
Add UUID generation to x64 versions UUID generation depends on OSSP-UUID which is not yet ported to x64.
Does extract(epoch from value) return milliseconds? YES
What encoding (UTF-8 and/or UTF-16) does PostgreSQL use for unicode? Can this be configured per column? UTF-8
How is a repeatable read with exclusive lock implemented? It is not supported.
Does timestamp'value', handle java.sql.timestamp.toString()? YES
Does to_timestamp support milliseconds? YES

Precision is up to microseconds(10^-6) http://www.postgresql.org/docs/7.4/static/functions-datetime.html

Does postgreSQL have constants for boolean values? YES

TRUE and FALSE (they are case insensitive)

Does posrgreSQL jdbc driver support returning metadata in UpperCase NO

Since database objects are case sensitive, returning UpperCase would make for corrupt data May be consider changing SQLManager to enforce all database object names to be lowercase

Does renaming a column cause error if a view depends on it? NO

View' is updated with to use the new column name

Does lo.sql unlink large objects when table is truncated? NO

http://www.postgresql.org/docs/8.3/static/lo.html#AEN104018


Classes

PostgreSQLAdapter

Task Status UnitTest
* Extending CaseInsensitiveSQLAdapter DONE DONE
Implement setQueryTime with Timer object
  • if code variation is limited, extract to SQLAdapter
DONE DONE
Refactor escaping literals
  • May be make use isLiteral
DONE DONE
appendMatchExpression
  • Add parentheses to enforce operation order
  • Remove implementation of MatchNode.WEIGHT.SYMBOL
DONE DONE
indexNameMatches
  • Use toMetadataCase and toDatabaseCase instead of toLowerCase/toUpperCase
DONE DONE
appendSuffixHint
  • Implement query locking for OUTER JOIN queries (i.e. repeatable read + exclusive lock)
DONE DONE
appendLiteral
  • Check if timestamp accepts java.sql.timestamp.toString() format
  • If boolean constants are supported, use those instead of string 't'/'f'
DONE DONE
getBind
  • Check if override is necessary
DONE DONE
isLiteral
  • Use string.length and binary.getSize to ensure less than 1GB
DONE DONE
appendTypeConversion
  • Ensure to_timestamp accepts milliseconds
  • Ensure case Primitive.TIMESTAMP_ORDINAL: returns milliseconds (extract(epoch from
DONE DONE
isUnicode
  • Check if column is set to use UTF-16 encoding
  • TRUE == is a unicode column FALSE == is not a unicode column null == unknown (e.g. number column or column not present)
DONE DONE
s_bindFactoryArray[Primitive.BINARY_ORDINAL]
  • Use reflection to make use of postgresql jdbc objects and methods to handle large objects
DONE
DUPLICATE_KEY_NAME_PATTERN
  • Modify pattern to remove dependency on english words
DONE DONE
s_bindFactoryArray
  • Use parent BINDS for unchanged binds
DONE DONE


PostgreSQLSchemaManager

Task Status UnitTest
* Extending CaseInsensitiveSQLSchemaManager DONE DONE
Override setCustomDatabaseProperties
  • Add template fields for postgreSQL scripts
DONE DONE
dropTable
  • Remove if exists
DONE DONE
getGUIDExpr
  • Implement solution for x64 versions
remove trigger and procedure suffix $uid DONE DONE
getDefaultLongspace, getDefaultTablespace, getDefaultIndexspace
  • move to SQLAdapter
getPrimaryKeys
  • check if override is needed
DONE DONE
generateIndexName
  • Check if toLowerCase is needed
DONE' DONE
appendColumnType
  • check if serial and bigserial have limits when compared to using sequences
DONE DONE
Refactor creating and deleting full-text search indexes
  • createFullTextIndex
    • generateFullTextSearchProcedureName
    • createFullTextSearchProcedure
    • createFullTextSearchTrigger
  • dropFullTextIndex
    • generateFullTextSearchProcedureName
    • dropFullTextSearchProcedure
    • dropFullTextSearchTrigger
DONE DONE
Refactor checking for BLOB column to isBLOB DONE DONE
Refactor checking for full-text search index on a column to getFullTextIndex DONE DONE
alterColumn - use this logic
  • execute SQL to drop all dependent view/s for the column's table
  • alter the column
  • create the deleted view/s
DONE DONE
renameColumn - use this logic for
  • check if column has full-text search index
  • rename the column
  • rename column$
  • drop full-text search trigger
  • create full-text search trigger
DONE DONE
dropIndex
  • call super
  • if index is TEXT index
    • drop column$
    • drop full-text search trigger
DONE DONE
appendColumnAlternation
  • run UnitTest to check for change in nullness and precision
DONE
renameTable
  • fix full-text search trigger maintainence
DONE DONE
deleteLargeObjects
  • change to use for loop instead of iterator
DONE DONE
getIndexInfo
  • check if override is needed for
DONE DONE
Use toMetadataCase and toDatabaseCase instead of toLowerCase/toUpperCase DONE DONE

Scripts

postgresql_create.sql

Task Status UnitTest


postgresql_setup.sql

Task Status UnitTest
Add comment to enable PREPARE TRANSACTION DONE DONE
Use template field to set location of contrib folder
  • make use of ${path}
DONE DONE
Add template field to set location for tablespace, indexspace and longspace DONE DONE
Add SQL to create tablespace, indexspace and longspace DONE DONE
Move function creation to postgresql_create.sql


postgresql_drop.sql

Task Status UnitTest
Add sql to drop custom functions