Skip to content

Conversation

@exceptionfactory
Copy link
Contributor

Summary

NIFI-15305 Corrects String to LocalDateTime conversion for floating point numbers represented as strings.

The current implementation checks long numbers for values larger than the year 10,000, but does not implement a similar check for floating point numbers represented as strings.

The corrected approach checks the integral part of a floating point number for values larger than the year 10,000 in seconds, and then handles the number as epoch milliseconds. The parsing strategy also handles the fractional part as either the number of microseconds or the number of milliseconds.

Tracking

Please complete the following tracking steps prior to pull request creation.

Issue Tracking

Pull Request Tracking

  • Pull Request title starts with Apache NiFi Jira issue number, such as NIFI-00000
  • Pull Request commit message starts with Apache NiFi Jira issue number, as such NIFI-00000

Pull Request Formatting

  • Pull Request based on current revision of the main branch
  • Pull Request refers to a feature branch with one commit containing changes

Verification

Please indicate the verification steps performed prior to pull request creation.

Build

  • Build completed using ./mvnw clean install -P contrib-check
    • JDK 21
    • JDK 25

Licensing

  • New dependencies are compatible with the Apache License 2.0 according to the License Policy
  • New dependencies are documented in applicable LICENSE and NOTICE files

Documentation

  • Documentation formatting appears as expected in rendered files

- Added check for integral numbers greater than expected number of seconds for year 10,000 and handled as milliseconds
Copy link
Contributor

@pvillard31 pvillard31 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, left some minor comments, not blockers.

Comment on lines 43 to 44
private static final long MICROSECOND_MULTIPLIER = 1_000;
private static final long MILLISECOND_MULTIPLIER = 1_000_000;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thoughts about using something like MICROS_TO_NANOS and FRACTION_TO_MICROS_SECONDS to be more self-explanatory?


private LocalDateTime toLocalDateTime(final long epochSeconds, final long nanosPastSecond) {
final Instant instant = Instant.ofEpochSecond(epochSeconds).plusNanos(nanosPastSecond);
private LocalDateTime convertIntegralFractional(final long integral, final double fractional) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd add a comment to explain the dual case logic. Could also be an in-line comment.

Suggested change
private LocalDateTime convertIntegralFractional(final long integral, final double fractional) {
/**
* Convert integral and fractional components to LocalDateTime.
*
* Large integral values (beyond year 10,000 in seconds) indicate the input
* is in milliseconds, with the fractional part representing microseconds.
* Smaller integral values are treated as seconds, with the fractional part
* representing the fraction of a second (converted to microseconds).
*
* Example: 1765056655230.7461765056655230 ms + 746 µs
* Example: 1707238288.3515671707238288 s + 351567 µs
*/
private LocalDateTime convertIntegralFractional(final long integral, final double fractional) {

@exceptionfactory
Copy link
Contributor Author

Thanks for the review @pvillard31, I pushed an update adjusting the variable naming and adding some clarifying comments on the implementation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants