So, nobody is using GeoTools with time dimension on top of Oracle? Nobody is having difficulties with times cut off? Or are you guys just busy and didn't have time to look at this issue (I can totally understand that)?

I'd like to know if the community considers this behavior a bug or a "feature" (for the sake of backwards compatibility). For me, the current state of things is unacceptable. I'll have to patch it in the source somehow or switch to PostGIS. The thing is, maybe a patch that works for me won't work for somebody else. So I'd like to come up with a patch that is acceptable to others as well and which can be included in the GeoTools source tree. I think that will be the best for everybody involved.

And that's why I'm writing again, to ask the community if my proposed solutions are okay or not...


What can we do about it? Is it better to discard the DATE -> java.sql.Date mapping and leave it all to Oracle JDBC defaults; or we should add another mapping saying java.sql.Timestamp should go to the TIMESTAMP database type? Or do nothing, because there is some hidden Oracle JDBC switch which achieves the desired mapping and I'm just not aware of it?

I'm looking forward to any suggestions.



On 9. 11. 2016 23:11, Jody Garnett wrote:
Thanks for the detailed email, this one is a bit tough to sneak up on as we are hitting the JDBCDataStore code (for OracleDialect) and ImageMosaic code.

Does anyone else have experience on the difference between Date and Timestamp to draw on?

Thanks for testing with the latest release.

--
Jody Garnett

On 8 November 2016 at 11:06, Peter Kovac <[email protected] <mailto:[email protected]>> wrote:

    Dear GeoTools comunity,

    I'm struggling to make ImageMosaic work with time dimension when
    using Oracle database. I'm not quite sure if this should go to the
    devel mailing list or to the issue tracker directly so I'm using
    this list as a starting point for discussion.


    The following schema (an excerpt from the indexer.xml file) does
    not work with Oracle datastore (however, it works perfectly in
    Postgres):

          <schema name="default">
    
<attributes>*the_geom:Polygon,location:String,time:java.util.Date</attributes>
          </schema>

    The problem is that my data have date AND time, but /something
    /between GeoServer and the database itself truncates the time part.

    After digging into the GeoServer and GeoTools code I found out my
    main suspect. I believe that the existing mapping between Oracle
    database types and Java types in the
    org.geotools.data.oracle.OracleDialect class in
    gt-jdbc-oracle/src/main/java/org/geotools/data/oracle/OracleDialect.java
    is the cause. On line 165 (in current geotools 16.x branch) it
    maps the DATE type to the java.sql.Date class. As we all know,
    java.sql.Date does not store the time information.

    In my opinion, this mapping is incorrect. The correct mapping
    should be DATE to java.sql.Timestamp, because the DATE type in
    Oracle database includes the time down to a second. The current
    Oracle JDBC driver maps DATE to java.sql.Timestamp by default, as
    stated on their website (they used to have it wrong too, but fixed
    it):
    
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#08_01
    
<http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#08_01>

    ...the 11.1 drivers by default convert SQL DATE to Timestamp when
    reading from the database. This always was the right thing to do
    and the change in 9i was a mistake...


    The commit which introduced the DATE ->java.sql.Date mapping looks
    like it was a deliberate decision (
    
https://github.com/geotools/geotools/commit/ba023c75ebd13279c3beb69721bfd361bf3a6908
    
<https://github.com/geotools/geotools/commit/ba023c75ebd13279c3beb69721bfd361bf3a6908>
    https://osgeo-org.atlassian.net/browse/GEOT-3216
    <https://osgeo-org.atlassian.net/browse/GEOT-3216> ). Maybe
    changing the mapping is not a good idea after all (I don't know
    what might break in the GeoTools universe).

    So, I tried to change my schema to the following:

          <schema name="default">
<attributes>*the_geom:Polygon,location:String,time:java.sql.Timestamp</attributes>
          </schema>

    Unfortunately, it creates the /same /database table, with the DATE
    type for the time column. Maybe if this schema would create a
    TIMESTAMP column, then the default JDBC mapping would be from
    TIMESTAMP to java.sql.Timestamp and the time information would be
    retained.

    When figuring out why java.sql.Timestamp is translated to the DATE
    database column, I found out that:

    * initially, there is no mapping from java.sql.Timestamp to any
    Oracle data type (org.geotools.jdbc.JDBCDataStore.getSQLTypeNames,
    lines 3126 to 3156). the integer value to map is 93 (
    
http://docs.oracle.com/javase/8/docs/api/constant-values.html#java.sql.Types.TIMESTAMP
    
<http://docs.oracle.com/javase/8/docs/api/constant-values.html#java.sql.Types.TIMESTAMP>
    )
    * the metaData.getTypeInfo() (line 3198) is used to get default
    database type mappings
    * the type java.sql.Timestamp gets mapped to DATE database type in
    an interation of the following while loop


    To sum up:

    1)  Oracle JDBC driver mapsjava.sql.Timestamp to the DATE database
    type because, well, it's theirs decision (if there is any
    millisecond information in the Timestamp it would be lost I guess,
    but who wants milliseconds anyway?).

    2) GeoTools maps DATE database type to java.sql.Date type,
    apparently because of backwards compatibility issues.

    Therefore, when creating ImageMosaic with time dimension and some
    actual time values, the features-to-be-inserted are converted from
    java.sql.Timestamp to java.sql.Date and the time information is lost.


    What can we do about it? Is it better to discard the DATE ->
    java.sql.Date mapping and leave it all to Oracle JDBC defaults; or
    we should add another mapping saying java.sql.Timestamp should go
    to the TIMESTAMP database type? Or do nothing, because there is
    some hidden Oracle JDBC switch which achieves the desired mapping
    and I'm just not aware of it?

    I'm looking forward to any suggestions.


    I found all of this while working with GeoServer 2.10.0 and
    GeoTools 16. My Oracle version is 12cR1, I'm using the ojdbc7.jar,
    my Java is jdk1.8.0_102, everything runs in Tomcat 8.5.4 and I'm
    using the -Doracle.jdbc.J2EE13Compliant=true property to get
    java.sql.Timestamp instead of oracle.sql.TIMESTAMP when using SQL
    Views in GeoServer.



    Cheers,

    Peter

-- Peter Kovac
    IMS Programmer
    MicroStep-MIS
    [email protected] <mailto:[email protected]>


    
------------------------------------------------------------------------------
    Developer Access Program for Intel Xeon Phi Processors
    Access to Intel Xeon Phi processor-based developer platforms.
    With one year of Intel Parallel Studio XE.
    Training and support from Colfax.
    Order your platform today. http://sdm.link/xeonphi
    _______________________________________________
    GeoTools-GT2-Users mailing list
    [email protected]
    <mailto:[email protected]>
    https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users
    <https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users>



--
Peter Kovac
IMS Programmer
MicroStep-MIS
[email protected]

------------------------------------------------------------------------------
_______________________________________________
GeoTools-GT2-Users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to