From 5fc3e3b9b44dc9aa68a9b1f797f0db0139189b6a Mon Sep 17 00:00:00 2001 From: Nathan Rauh Date: Thu, 28 May 2026 11:04:59 -0500 Subject: [PATCH 1/3] Instances of the CurrentDate temporal expression should be equal --- .../spi/expression/function/CurrentDate.java | 26 ++++++++++------- .../expression/function/CurrentDateTime.java | 29 ++++++++++++------- .../spi/expression/function/CurrentTime.java | 26 ++++++++++------- .../expression/TemporalExpressionTest.java | 24 ++++++++++++++- 4 files changed, 73 insertions(+), 32 deletions(-) diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java index c19c7e84e..0d3d0b361 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java @@ -37,17 +37,23 @@ public interface CurrentDate extends TemporalExpression { * * @return an expression representing the current date. */ + @SuppressWarnings("unchecked") static CurrentDate now() { - return new CurrentDate<>() { - @Override - public Class type() { - return LocalDate.class; - } + return (CurrentDate) CurrentDateInstance.instance; + } +} + +// Internal implementation of single instance obtained from CurrentDate.now() +class CurrentDateInstance implements CurrentDate { + static final CurrentDate instance = new CurrentDateInstance(); + + @Override + public Class type() { + return LocalDate.class; + } - @Override - public String toString() { - return "LOCAL DATE"; - } - }; + @Override + public String toString() { + return "LOCAL DATE"; } } diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java index 6909f550c..cae6faaa5 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java @@ -37,17 +37,24 @@ public interface CurrentDateTime extends TemporalExpression * * @return an expression representing the current date and time. */ + @SuppressWarnings("unchecked") static CurrentDateTime now() { - return new CurrentDateTime<>() { - @Override - public Class type() { - return LocalDateTime.class; - } - - @Override - public String toString() { - return "LOCAL DATETIME"; - } - }; + return (CurrentDateTime) CurrentDateTimeInstance.instance; } } + +// Internal implementation of single instance obtained from CurrentDateTime.now() +class CurrentDateTimeInstance implements CurrentDateTime { + static final CurrentDateTime instance = new CurrentDateTimeInstance(); + + @Override + public Class type() { + return LocalDateTime.class; + } + + @Override + public String toString() { + return "LOCAL DATETIME"; + } +} + diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java index 7951886aa..ea7868e09 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java @@ -37,17 +37,23 @@ public interface CurrentTime extends TemporalExpression { * * @return an expression representing the current time. */ + @SuppressWarnings("unchecked") static CurrentTime now() { - return new CurrentTime<>() { - @Override - public Class type() { - return LocalTime.class; - } + return (CurrentTime) CurrentTimeInstance.instance; + } +} + +// Internal implementation of single instance obtained from CurrentTime.now() +class CurrentTimeInstance implements CurrentTime { + static final CurrentTime instance = new CurrentTimeInstance(); + + @Override + public Class type() { + return LocalTime.class; + } - @Override - public String toString() { - return "LOCAL TIME"; - } - }; + @Override + public String toString() { + return "LOCAL TIME"; } } diff --git a/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java b/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java index ec759961a..0f633c196 100644 --- a/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java +++ b/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Contributors to the Eclipse Foundation + * Copyright (c) 2025,2026 Contributors to the Eclipse Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ */ package jakarta.data.expression; +import static org.junit.jupiter.api.Assertions.assertEquals; + import jakarta.data.constraint.Between; import jakarta.data.constraint.LessThan; import jakarta.data.mock.entity.Book; @@ -24,6 +26,8 @@ import jakarta.data.restrict.BasicRestriction; import jakarta.data.restrict.Restriction; import jakarta.data.spi.expression.function.CurrentDate; +import jakarta.data.spi.expression.function.CurrentDateTime; +import jakarta.data.spi.expression.function.CurrentTime; import jakarta.data.spi.expression.literal.TemporalLiteral; import java.time.LocalDate; @@ -98,4 +102,22 @@ void shouldRestrictLocalDateBetween() { .isEqualTo(LocalDate.of(2025, Month.APRIL, 30)); }); } + + @Test + void testCurrentDateEqualsCurrentDate() { + assertEquals(CurrentDate.now(), + CurrentDate.now()); + } + + @Test + void testCurrentDateTimeEqualsCurrentDateTime() { + assertEquals(CurrentDateTime.now(), + CurrentDateTime.now()); + } + + @Test + void testCurrentTimeEqualsCurrentTime() { + assertEquals(CurrentTime.now(), + CurrentTime.now()); + } } From c5813ab6bbf99c36e1b3425e711c8398ecb0a82c Mon Sep 17 00:00:00 2001 From: Nathan Rauh Date: Fri, 29 May 2026 08:26:29 -0500 Subject: [PATCH 2/3] code review comment from Otavio to switch to assertj --- .../data/expression/TemporalExpressionTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java b/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java index 0f633c196..f52867b99 100644 --- a/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java +++ b/api/src/test/java/jakarta/data/expression/TemporalExpressionTest.java @@ -17,7 +17,7 @@ */ package jakarta.data.expression; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; import jakarta.data.constraint.Between; import jakarta.data.constraint.LessThan; @@ -105,19 +105,19 @@ void shouldRestrictLocalDateBetween() { @Test void testCurrentDateEqualsCurrentDate() { - assertEquals(CurrentDate.now(), - CurrentDate.now()); + assertThat(CurrentDate.now()) + .isSameAs(CurrentDate.now()); } @Test void testCurrentDateTimeEqualsCurrentDateTime() { - assertEquals(CurrentDateTime.now(), - CurrentDateTime.now()); + assertThat(CurrentDateTime.now()) + .isSameAs(CurrentDateTime.now()); } @Test void testCurrentTimeEqualsCurrentTime() { - assertEquals(CurrentTime.now(), - CurrentTime.now()); + assertThat(CurrentTime.now()) + .isSameAs(CurrentTime.now()); } } From 0a0b0f007c1bfe983dfcd2d22869f854aa2545fb Mon Sep 17 00:00:00 2001 From: Nathan Rauh Date: Fri, 29 May 2026 10:17:38 -0500 Subject: [PATCH 3/3] make constructor private to prevent multiple instances --- .../java/jakarta/data/spi/expression/function/CurrentDate.java | 3 +++ .../jakarta/data/spi/expression/function/CurrentDateTime.java | 3 +++ .../java/jakarta/data/spi/expression/function/CurrentTime.java | 3 +++ 3 files changed, 9 insertions(+) diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java index 0d3d0b361..b4f26f20b 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDate.java @@ -47,6 +47,9 @@ static CurrentDate now() { class CurrentDateInstance implements CurrentDate { static final CurrentDate instance = new CurrentDateInstance(); + private CurrentDateInstance() { + } + @Override public Class type() { return LocalDate.class; diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java index cae6faaa5..8c05207b5 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentDateTime.java @@ -47,6 +47,9 @@ static CurrentDateTime now() { class CurrentDateTimeInstance implements CurrentDateTime { static final CurrentDateTime instance = new CurrentDateTimeInstance(); + private CurrentDateTimeInstance() { + } + @Override public Class type() { return LocalDateTime.class; diff --git a/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java b/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java index ea7868e09..77eb61813 100644 --- a/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java +++ b/api/src/main/java/jakarta/data/spi/expression/function/CurrentTime.java @@ -47,6 +47,9 @@ static CurrentTime now() { class CurrentTimeInstance implements CurrentTime { static final CurrentTime instance = new CurrentTimeInstance(); + private CurrentTimeInstance() { + } + @Override public Class type() { return LocalTime.class;