JDBC driver prepared statement set* methods #31494
Conversation
…ded the byte[] setter.
| @Override | ||
| public void setBytes(int parameterIndex, byte[] x) throws SQLException { | ||
| throw new UnsupportedOperationException("Bytes not implemented yet"); | ||
| setObject(parameterIndex, x); |
There was a problem hiding this comment.
Why isn't Types specified as in the methods above?
| return; | ||
| } | ||
|
|
||
| setDate(parameterIndex, new Date(TypeConverter.convertFromCalendarToUTC(x.getTime(), cal))); |
There was a problem hiding this comment.
This should call setObject directly not setDate (with 2 params) which effectively is setDate(paramIndex,x,NULL).
The 2 arg method should invoke the 3 arg one not vice-versa since the former is a subset of the latter.
| return; | ||
| } | ||
|
|
||
| setTime(parameterIndex, new Time(TypeConverter.convertFromCalendarToUTC(x.getTime(), cal))); |
| @Override | ||
| public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { | ||
| throw new UnsupportedOperationException("Dates not implemented yet"); | ||
| if (cal == null) { |
| // this is also a way to check early for the validity of the desired sql type | ||
| targetJDBCType = JDBCType.valueOf(targetSqlType); | ||
| } catch (IllegalArgumentException e) { | ||
| throw new SQLException(e.getMessage()); |
There was a problem hiding this comment.
The exception should be more precise, either SQLDataException or its parent SQLNonTransientException.
The same comment applies for the rest of the method.
| } | ||
|
|
||
| private Calendar getDefaultCalendar() { | ||
| return Calendar.getInstance(cfg.timeZone(), Locale.ROOT); |
There was a problem hiding this comment.
This used to be a final field, why was it moved to a method?
| throw new SQLFeatureNotSupportedException("Batching not supported"); | ||
| } | ||
|
|
||
| private boolean checkNull(int parameterIndex, Object o, int type) throws SQLException { |
There was a problem hiding this comment.
The method name seems incorrect since it's not a check but a set. Something like setIfNull or handleNull is more appropriate.
| Calendar c = (Calendar) cal.clone(); | ||
| c.setTimeInMillis(value); | ||
|
|
||
| ZonedDateTime convertedDateTime = ZonedDateTime |
There was a problem hiding this comment.
There should be a way to do the conversion without doing the raw math in there (not to mention the whole /1000, * 1000 losses approximation).
Why not use the ZoneId from the calendar to compute the offset:
ZonedDateTime zdt = Instant.ofEpochMillis(value).atZone(cal.getTimeZone().toZoneId());
or potentially use getOffset() instead of getRawOffset()
There was a problem hiding this comment.
Changed the way the conversion is done
| */ | ||
| @SuppressWarnings("unchecked") | ||
| static <T> T convert(Object val, JDBCType columnType, Class<T> type) throws SQLException { | ||
| static <T> T convert(Object val, JDBCType columnType, Class<T> type) throws SQLException, ClassCastException { |
There was a problem hiding this comment.
CCE is never a good idea to throw out - especially since it forces the caller to handle it.
It should be handled inside convert directly.
| assertEquals("true", value(jps)); | ||
| assertEquals(VARCHAR, jdbcType(jps)); | ||
|
|
||
| SQLException sqle = expectThrows(SQLException.class, () -> jps.setObject(1, true, Types.TIMESTAMP)); |
There was a problem hiding this comment.
This should sit in its own test (setInvalidBooleanObject), something applied to the rest of the test suite.
|
Pinging @elastic/es-search-aggs |
…rs are converted before being sent to ES.
|
LGTM |
nik9000
left a comment
There was a problem hiding this comment.
I left a few small things. I'm super happy about the new test though!
| || x instanceof Float | ||
| || x instanceof Double | ||
| || x instanceof String) | ||
| { |
There was a problem hiding this comment.
Usually we'd stick this on the end of the last line.
| // converting to {@code java.util.Date} because this is the type supported by {@code XContentBuilder} for serialization | ||
| java.util.Date dateToSet; | ||
| if (x instanceof Timestamp) { | ||
| dateToSet = new java.util.Date(((Timestamp) x).getTime()); |
There was a problem hiding this comment.
That's round the fractional milliseconds. Are we sure that is right? I think it is worth a comment if we are. If not, worth thinking about some more.
There was a problem hiding this comment.
@nik9000 I did it like this since ES deals with dates in milliseconds since epoch. The parameters will be serialized using a java.util.Date when being sent to ES in queries.
There was a problem hiding this comment.
Right. I think maybe this is worth playing with some more and documenting any strange things that come out of it. Though I think it'd be fine to do in a followup.
| || x instanceof LocalDateTime | ||
| || x instanceof Time | ||
| || x instanceof java.util.Date) { | ||
| if (targetJDBCType == JDBCType.TIMESTAMP ) { |
There was a problem hiding this comment.
Could you do these with a single instanceof? rather than check each one twice? Maybe call setParam(parameterIndex, dateToSet, Types.TIMESTAMP); on the result each time and return?
There was a problem hiding this comment.
@nik9000 Haven't found a better/easier-to-follow way of refactoring this block of code mostly due to the inner if-else for the target jdbc type. I have gotten rid of the else if bunch though.
| } | ||
| } | ||
|
|
||
| private void checkKnownUnsupportedTypes(Object x) throws SQLFeatureNotSupportedException { |
There was a problem hiding this comment.
I feel like it'd be cleaner to have this be the result of falling off the end of an if statement chain.
| throw new SQLFeatureNotSupportedException("Batching not supported"); | ||
| } | ||
|
|
||
| private boolean setIfNull(int parameterIndex, Object o, int type) throws SQLException { |
There was a problem hiding this comment.
I think it might be easier to read the code without this method to be honest. It saves a line every time you call it makes me go "what is going on here?" every time I see it. Not sure.
| // according to B-4 table from the jdbc4.2 spec | ||
| javaToJDBC.put(Calendar.class, JDBCType.TIMESTAMP); | ||
| javaToJDBC.put(java.util.Date.class, JDBCType.TIMESTAMP); | ||
| javaToJDBC.put(LocalDateTime.class, JDBCType.TIMESTAMP); |
There was a problem hiding this comment.
It'd be nice if the map were unmodifiable.
|
|
||
|
|
||
| static JDBCType fromJavaToJDBC(Class<?> clazz) throws SQLException { | ||
| for (Class<?> key : javaToJDBC.keySet()) { |
There was a problem hiding this comment.
I'd prefer iterating over the map entries here.
| assertEquals("Numeric " + randomLongNotShort + " out of range", sqle.getMessage()); | ||
| } | ||
|
|
||
| public void testSettingFloatValues() throws SQLException { |
|
@nik9000 thank you for the review and the valuable comments. I've addressed most of them. |
Added setObject functionality and tests for it
|
Backported to 6.x as well. |
* elastic/master: (57 commits) HLRest: Fix test for explain API [TEST] Fix RemoteClusterConnectionTests Add Create Snapshot to High-Level Rest Client (elastic#31215) Remove legacy MetaDataStateFormat (elastic#31603) Add explain API to high-level REST client (elastic#31387) Preserve thread context when connecting to remote cluster (elastic#31574) Unify headers for full text queries Remove redundant 'minimum_should_match' JDBC driver prepared statement set* methods (elastic#31494) [TEST] call yaml client close method from test suite (elastic#31591) ingest: Add ignore_missing property to foreach filter (elastic#22147) (elastic#31578) Fix a formatting issue in the docvalue_fields documentation. (elastic#31563) reduce log level at gradle configuration time [TEST] Close additional clients created while running yaml tests (elastic#31575) Docs: Clarify sensitive fields watcher encryption (elastic#31551) Watcher: Remove never executed code (elastic#31135) Add support for switching distribution for all integration tests (elastic#30874) Improve robustness of geo shape parser for malformed shapes (elastic#31449) QA: Create xpack yaml features (elastic#31403) Improve test times for tests using `RandomObjects::addFields` (elastic#31556) ...
* master: Docs: Remove duplicate test setup Print output when the name checker IT fails (#31660) Fix syntax errors in get-snapshots docs (#31656) Docs: Fix description of percentile ranks example example (#31652) Add MultiSearchTemplate support to High Level Rest client (#30836) Add test for low-level client round-robin behaviour (#31616) SQL: Refactor package names of sql-proto and sql-shared-proto projects (#31622) Remove deprecation warnings to prepare for Gradle 5 (sourceSets.main.output.classesDirs) (#30389) Correct integTest enable logic (#31646) Fix missing get-snapshots docs reference #31645 Do not check for Azure container existence (#31617) Merge AwsS3Service and InternalAwsS3Service in a S3Service class (#31580) Upgrade gradle wrapper to 4.8 (#31525) Only set vm.max_map_count if greater than default (#31512) Add Get Snapshots High Level REST API (#31537) QA: Merge query-builder-bwc to restart test (#30979) Update reindex.asciidoc (#31626) Docs: Skip xpack snippet tests if no xpack (#31619) mute CreateSnapshotRequestTests HLRest: Fix test for explain API [TEST] Fix RemoteClusterConnectionTests Add Create Snapshot to High-Level Rest Client (#31215) Remove legacy MetaDataStateFormat (#31603) Add explain API to high-level REST client (#31387) Preserve thread context when connecting to remote cluster (#31574) Unify headers for full text queries Remove redundant 'minimum_should_match' JDBC driver prepared statement set* methods (#31494) [TEST] call yaml client close method from test suite (#31591)
* 6.x: Docs: Remove duplicate test setup Docs: Fix description of percentile ranks example example (#31652) Remove deprecation warnings to prepare for Gradle 5 (sourceSets.main.output.classesDirs) (#30389) Do not check for Azure container existence (#31617) Merge AwsS3Service and InternalAwsS3Service in a S3Service class (#31580) Remove item listed in 6.3 notes that's not in 6.3 (#31623) remove unused import Upgrade gradle wrapper to 4.8 (#31525) Only set vm.max_map_count if greater than default (#31512) QA: Merge query-builder-bwc to restart test (#30979) Docs: Skip xpack snippet tests if no xpack (#31619) [TEST] Fix RemoteClusterConnectionTests Remove legacy MetaDataStateFormat (#31603) [TEST] call yaml client close method from test suite (#31591) [TEST] Close additional clients created while running yaml tests (#31575) Node selector per client rather than per request (#31471) Preserve thread context when connecting to remote cluster (#31574) Remove redundant 'minimum_should_match' Unify headers for full text queries JDBC driver prepared statement set* methods (#31494) add logging breaking changes from 5.3 to 6.0 (#31583) Fix a formatting issue in the docvalue_fields documentation. (#31563) Improve robustness of geo shape parser for malformed shapes QA: Create xpack yaml features (#31403)
Fixes #31493