Hello!

I would like to share some ideas that I have already implemented on the top
of GT 2.2.x. It concerns JDBC stuff and OracleDataStore as a framework for
testing of new architecture.

JDBCDataStore is about reading and writing features from/to database. The
main problem having been a force to "reinvent the wheel" for me that lot of
things was just in one place such as JDBC1DataStore with a hard coded
functionality and hard to be extended to get more complex or DB version/JDBC
driver/something_else specific functionality. To create one JDBCDataStore or
JDBCFeatureWriter more? SQL code is everywhere. Each database plugin has its
own SQL stuff that has no general design and I suppose was implemented just
as it is. 

Here is just some thoughts, I try to generalize what do I need from
JDBCDataStore, how I see ways to improve, revisit, simplify the
architecture.

JDBCDataStore functionality is the following:

1) JDBCDataStore is just about reading and writing features from database
based on Simple Feature Spec for SQL - simply when the FeatureType comes
from one table of database. The row of the table is a feature. 
2) We have SELECT/INSERT/UPDATE/DELETE operations over data in database and
its pairs for features in context of FeatureSource/FeatureStore interfaces:
read/add/modify/remove.
3) JDBCDataStore is created with credentials: username, passw, db, schema on
the specified host. All available feature types of JDBCDataStore are matched
to available tables of the database with specified credentials. The
FeatureType can be created from metadata requested from particular table and
cached. FIDMapper interfaces are responsible for mappings between database
PKs and feature IDs.
4) Application developer mostly works with FeatureSource and FeatureStore
interfaces implemented by JDBCFeatureSource and JDBCFeatureStore. They
provide basic functionality to read/add/modify/remove features. Behind these
interfaces the real job is being done to SELECT/INSERT/UPDATE/DELETE
corresponding rows in database tables. 


To customize the functionality of 4) related to particular proprietary
database or application needs more easy way is desired than to go deeply
into overriding of JDBCDataStore,JDBCFeatureWriter and etc. While the most
of the things are implemented and work well, it is enough just create couple
of new interfaces and refactor a bit the code from JDBCDataStore,
JDBCFeatureWriter, SQLEncoder, etc.

PROPOSALS

1)
I suggest to make SQLEncoder more meaningful. It takes the responsibility to
encode Filter API into WHERE clause of SQL query.  Here I don't provide
implementation and etc, I can provide later, but the idea. 

PreparedSQLEncoder extends SQLEncoder{

        public Object[] getPreparedObjects()

}
The basic class for encoding of SQL queries for PreparedStatement.


This method returns objects for PreparedStatement to be used in if " ? "
places have been created during filter encoding. OraclePreparedSQLEncoder,
for example, can encode GeometryFilter for PreparedStatement. It gives the
opportunity to create complex geometry based filters, not only BBOX based
and pass geometry with hundreds of vertices when the text based SQL request
would crash.. . This functionality of encoding of Filter API and arbitrary
geometry objects as a parameters to PreparedStatement for Oracle is
implemented by us. Any complex geometry can be encoded for PreapredStatement
and passed to query database


2)
Another improvement is a new SQLExecutor interface that encapsulates all SQL
executing job. The interface is in attachment. It can be extended by methods
performing custom SQL operations.

The destination of the interface is to encapsulate all possible SQL stuff
through set of methods that are easily extended by subclasses for
customization.


3) Refactor some functionality related to SQL code from JDBCDataStore to
SQLExecutor.. The particular implementation of JDBCDataStore is responsible
to create and retrieve SQLExecutor instance:

protected SQLExecutor createSQLExecutor(...);
public SQLExecutor getSQLExecutor();

4) Clear up DefaultSQLBuilder and its subclasses for particular databases.
SQLEncoder must be responsible for encoding parts of SQL query while
SQLBuilder just create the whole SQL from parts.
We can have just one general SQLBuilder that calls various methods of passed
SQLEncoder to encode column names, table names and , of course, Filter API.

5)
AttributeIO interface is a good structure to encode attribute values into
SQL text representation or prepared object and back from ResultSet object to
feature attribute java class based value. To and from.
We have BasicAttributeIO for base java data types and custom such as
SDOAttributeIO for Oracle geometries.

Extend FeatureTypeInfo by helper method to get an array of attribute
handlers - implementations of AttributeIO - for its FeatureType. Lazily!
For example, SQLExecutor can request handlers from FeatureTypeInfo during
inserting, updating - to convert feature attribute values for
PreparedStatement.



I tried to describe key features of design being in my mind. I have also
implemented OracleDataStore2 based on new design and interfaces. Main
changes are in:

-OraclePreparedSQLEncoder extends PreparedSQLEncoder ( .. extends
SQLEncoder).
-OracleSQLExecutor extends PreparedSQLExecutor (extends AbstractSQLExecutor
(implements SQLExecutor))
-JDBCDataStore3 extends JDBC1DataStore (with all overridden methods with
necessary changes)
-JDBCFeatureWriter3 that uses capabilities of SQLExecutor.


The letter is quite long, I would like to discuss details and get a feedback
- are these changes worth to be considering?
It is just my view at the problem and I really happy to see that it works
and looks much more clear for the developer, at least for me, anyway
everything is subjective of course:)

Regards to the community, 
Vitali Diatchkov.

Attachment: SQLExecutor.java
Description: Binary data

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Geotools-devel mailing list
Geotools-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to