Skip to content

Support datetime literals with less then seconds precision #2147

Open
0 of 1 issue completed
Open
Feature
0 of 1 issue completed
@piotrszul

Description

@piotrszul

Currently due to FHIR datetime parser limitations DateTime literals with less then second precision fail to parse and silently produce null in udf based operations.

Details

Expected: false but got: null ==> expected: <false> but was: <null>

  • @2019-02-03T02:00Z = @2019-02-02T21:00-04:00 [null]

Expected: true but got: null ==> expected: <true> but was: <null>

  • @2019-02-03T01:00Z = @2019-02-02T21:00-04:00 [null]

(Equality exclusions)

Details

Expected: false but got: null ==> expected: <false> but was: <null>

  • @2018-12-21T12:01 > @2018-12-21T12:01 [Same date, same time]
  • @2018-12-21T12:01 > @2018-12-21T12:02 [Same date, different time (1)]
  • @2018-12-20T12:02 > @2018-12-21T12:01 [Different dates & times (1)]
  • @2018-12-21T12:02+03:00 > @2018-12-21T12:01+02:00 [Time zone differences (1)]
  • @2018-02-02T11 = @2018-02-02T12 [DateTime literal compared with different DateTime (hour)]
  • @2018-02-02T22-04:00 = @2018-02-03T05:03+04:00 [DateTime literal compared with different precision DateTime (hour, tz diff)]
  • @2018-02-02T11+04:00 = @2018-02-02T12+04:00 [DateTime literal compared with different DateTime (hour,tz)]
  • @2018-02-02T11:01 = @2018-02-02T11:02 [DateTime literal compared with different DateTime (minute)]
  • @2018-02-02T11:01+04:00 = @2018-02-02T11:02+04:00 [DateTime literal compared with different DateTime (minute, tz)]

Expected: true but got: null ==> expected: <true> but was: <null>

  • @2018-12-21T12:02 > @2018-12-21T12:01 [Same date, different time (2)]
  • @2018-12-22T12:02 > @2018-12-21T12:01 [Different dates & times (1)]
  • @2018-12-20T12 > @2018-12-20T11:01 [Comparison with differnet precision (2)]
  • @2018-12-21T12:02+02:00 > @2018-12-21T12:01+03:00 [Time zone differences (2)]
  • @2018-02-02T11 = @2018-02-02T11 [DateTime literal compared with DateTime (hour)]
  • @2018-02-02T11+04:00 = @2018-02-02T11+04:00 [DateTime literal compared with DateTime (hour, tz)]
  • @2018-02-02T22-04:00 = @2018-02-03T06+04:00 [DateTime literal compared with same DateTime (hour, tz different)]
  • @2018-02-02T11:01 = @2018-02-02T11:01 [DateTime literal compared with DateTime (minute)]
  • @2018-02-02T11:01+04:00 = @2018-02-02T11:01+04:00 [DateTime literal compared with DateTime (minute, tz)]

org.apache.spark.SparkException: Job aborted due to stage failure: ?? (executor driver): org.apache.spark.SparkException: [FAILED_EXECUTE_UDF] Failed to execute user defined function (`datetime_add_duration (UDFRegistration$$Lambda$1739/0x0000007800a055f8)`: (string, struct<id:void,value:decimal(32,6),value_scale:int,comparator:void,unit:void,system:string,code:string,_value_canonicalized:struct<value:decimal(38,0),scale:int>,_code_canonicalized:string,_fid:void>) => string). at org.apache.spark.sql.errors.QueryExecutionErrors$.failedExecuteUserDefinedFunctionError(QueryExecutionErrors.scala:198) at org.apache.spark.sql.errors.QueryExecutionErrors.failedExecuteUserDefinedFunctionError(QueryExecutionErrors.scala) at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) at org.apache.spark.sql.execution.WholeStageCodegenEvaluatorFactory$WholeStageCodegenPartitionEvaluator$$anon$1.hasNext(WholeStageCodegenEvaluatorFactory.scala:43) at org.apache.spark.sql.execution.SparkPlan.$anonfun$getByteArrayRdd$1(SparkPlan.scala:388) at org.apache.spark.rdd.RDD.$anonfun$mapPartitionsInternal$2(RDD.scala:893) at org.apache.spark.rdd.RDD.$anonfun$mapPartitionsInternal$2$adapted(RDD.scala:893) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:367) at org.apache.spark.rdd.RDD.iterator(RDD.scala:331) at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:93) at org.apache.spark.TaskContext.runTaskWithListeners(TaskContext.scala:166) at org.apache.spark.scheduler.Task.run(Task.scala:141) at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$4(Executor.scala:620) at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally(SparkErrorUtils.scala:64) at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally$(SparkErrorUtils.scala:61) at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:94) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:623) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: ca.uhn.fhir.parser.DataFormatException: Invalid date/time format: "2018-02-18T12:00" at org.hl7.fhir.r4.model.BaseDateTimeType.throwBadDateFormat(BaseDateTimeType.java:797) at org.hl7.fhir.r4.model.BaseDateTimeType.validateLengthIsAtLeast(BaseDateTimeType.java:865) at org.hl7.fhir.r4.model.BaseDateTimeType.parse(BaseDateTimeType.java:468) at org.hl7.fhir.r4.model.BaseDateTimeType.parse(BaseDateTimeType.java:52) at org.hl7.fhir.r4.model.PrimitiveType.fromStringValue(PrimitiveType.java:108) at org.hl7.fhir.r4.model.PrimitiveType.setValueAsString(PrimitiveType.java:164) at org.hl7.fhir.r4.model.BaseDateTimeType.setValueAsString(BaseDateTimeType.java:741) at org.hl7.fhir.r4.model.BaseDateTimeType.<init>(BaseDateTimeType.java:99) at org.hl7.fhir.r4.model.DateTimeType.<init>(DateTimeType.java:102) at au.csiro.pathling.sql.dates.datetime.DateTimeArithmeticFunction.lambda$parseEncodedValue$0(DateTimeArithmeticFunction.java:44) at au.csiro.pathling.sql.dates.TemporalArithmeticFunction.call(TemporalArithmeticFunction.java:91) at au.csiro.pathling.sql.dates.TemporalArithmeticFunction.call(TemporalArithmeticFunction.java:39) at org.apache.spark.sql.UDFRegistration.$anonfun$register$354(UDFRegistration.scala:767) ... 20 more Driver stacktrace:

  • @2018-02-18T12:00 + 59 seconds = @2018-02-18T12:00 [null]
  • @2018-02-18T12:00 + 60 seconds = @2018-02-18T12:01 [null]

org.apache.spark.SparkException: Job aborted due to stage failure: ?? (executor driver): org.apache.spark.SparkException: [FAILED_EXECUTE_UDF] Failed to execute user defined function (`datetime_add_duration (UDFRegistration$$Lambda$1739/0x0000007800a055f8)`: (string, struct<id:void,value:decimal(32,6),value_scale:int,comparator:void,unit:void,system:string,code:string,_value_canonicalized:void,_code_canonicalized:void,_fid:void>) => string). at org.apache.spark.sql.errors.QueryExecutionErrors$.failedExecuteUserDefinedFunctionError(QueryExecutionErrors.scala:198) at org.apache.spark.sql.errors.QueryExecutionErrors.failedExecuteUserDefinedFunctionError(QueryExecutionErrors.scala) at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source) at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) at org.apache.spark.sql.execution.WholeStageCodegenEvaluatorFactory$WholeStageCodegenPartitionEvaluator$$anon$1.hasNext(WholeStageCodegenEvaluatorFactory.scala:43) at org.apache.spark.sql.execution.SparkPlan.$anonfun$getByteArrayRdd$1(SparkPlan.scala:388) at org.apache.spark.rdd.RDD.$anonfun$mapPartitionsInternal$2(RDD.scala:893) at org.apache.spark.rdd.RDD.$anonfun$mapPartitionsInternal$2$adapted(RDD.scala:893) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:367) at org.apache.spark.rdd.RDD.iterator(RDD.scala:331) at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:93) at org.apache.spark.TaskContext.runTaskWithListeners(TaskContext.scala:166) at org.apache.spark.scheduler.Task.run(Task.scala:141) at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$4(Executor.scala:620) at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally(SparkErrorUtils.scala:64) at org.apache.spark.util.SparkErrorUtils.tryWithSafeFinally$(SparkErrorUtils.scala:61) at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:94) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:623) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: ca.uhn.fhir.parser.DataFormatException: Invalid date/time format: "2018-02-18T12" at org.hl7.fhir.r4.model.BaseDateTimeType.throwBadDateFormat(BaseDateTimeType.java:797) at org.hl7.fhir.r4.model.BaseDateTimeType.validateLengthIsAtLeast(BaseDateTimeType.java:865) at org.hl7.fhir.r4.model.BaseDateTimeType.parse(BaseDateTimeType.java:468) at org.hl7.fhir.r4.model.BaseDateTimeType.parse(BaseDateTimeType.java:52) at org.hl7.fhir.r4.model.PrimitiveType.fromStringValue(PrimitiveType.java:108) at org.hl7.fhir.r4.model.PrimitiveType.setValueAsString(PrimitiveType.java:164) at org.hl7.fhir.r4.model.BaseDateTimeType.setValueAsString(BaseDateTimeType.java:741) at org.hl7.fhir.r4.model.BaseDateTimeType.<init>(BaseDateTimeType.java:99) at org.hl7.fhir.r4.model.DateTimeType.<init>(DateTimeType.java:102) at au.csiro.pathling.sql.dates.datetime.DateTimeArithmeticFunction.lambda$parseEncodedValue$0(DateTimeArithmeticFunction.java:44) at au.csiro.pathling.sql.dates.TemporalArithmeticFunction.call(TemporalArithmeticFunction.java:91) at au.csiro.pathling.sql.dates.TemporalArithmeticFunction.call(TemporalArithmeticFunction.java:39) at org.apache.spark.sql.UDFRegistration.$anonfun$register$354(UDFRegistration.scala:767) ... 20 more Driver stacktrace:

  • @2018-02-18T12 + 59 minutes = @2018-02-18T12 [null]
  • @2018-02-18T12 + 60 minutes = @2018-02-18T13 [null]

Sub-issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    fhirpathRelated to fhirpath reference implementationnew featureNew feature or request

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions