From cdfd28bd9e593445d919906c4bbfb2846b0621b2 Mon Sep 17 00:00:00 2001 From: Nathan Rauh Date: Wed, 27 Mar 2024 14:08:07 -0500 Subject: [PATCH 1/2] Issue #458 TCK tests for queries where not all clauses are present Signed-off-by: Nathan Rauh --- .../framework/read/only/AsciiCharacters.java | 10 ++++++++ .../data/standalone/entity/EntityTests.java | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/tck/src/main/java/ee/jakarta/tck/data/framework/read/only/AsciiCharacters.java b/tck/src/main/java/ee/jakarta/tck/data/framework/read/only/AsciiCharacters.java index bddd2371d..b49aa0d7c 100644 --- a/tck/src/main/java/ee/jakarta/tck/data/framework/read/only/AsciiCharacters.java +++ b/tck/src/main/java/ee/jakarta/tck/data/framework/read/only/AsciiCharacters.java @@ -20,6 +20,7 @@ import java.util.Set; import java.util.stream.Stream; +import jakarta.data.Limit; import jakarta.data.Order; import jakarta.data.Sort; import jakarta.data.page.Page; @@ -39,6 +40,12 @@ @Repository public interface AsciiCharacters extends DataRepository, IdOperations { + @Query(" ") // it is valid to have a query with no clauses + Stream all(Limit limit, Sort... sort); + + @Query("ORDER BY id ASC") + Stream alphabetic(Limit limit); + int countByHexadecimalNotNull(); boolean existsByThisCharacter(char ch); @@ -86,6 +93,9 @@ default Stream retrieveAlphaNumericIn(long minId, long maxId) { .filter(c -> Character.isLetterOrDigit(c.getThisCharacter())); } + @Query("SELECT thisCharacter ORDER BY id DESC") + char[] reverseAlphabetic(Limit limit); + @Save List saveAll(List characters); diff --git a/tck/src/main/java/ee/jakarta/tck/data/standalone/entity/EntityTests.java b/tck/src/main/java/ee/jakarta/tck/data/standalone/entity/EntityTests.java index a617b80f7..b014950fe 100644 --- a/tck/src/main/java/ee/jakarta/tck/data/standalone/entity/EntityTests.java +++ b/tck/src/main/java/ee/jakarta/tck/data/standalone/entity/EntityTests.java @@ -463,6 +463,15 @@ public void testDescendingSort() { Arrays.toString(stream.map(number -> number.getId()).toArray())); } + @Assertion(id = "458", strategy = "Use a repository method with a JDQL query that has no clauses.") + public void testEmptyQuery() { + + assertEquals(List.of('a', 'b', 'c', 'd', 'e', 'f'), + characters.all(Limit.range(97, 102), Sort.asc("id")) + .map(AsciiCharacter::getThisCharacter) + .collect(Collectors.toList())); + } + @Assertion(id = "133", strategy = "Use a repository method that returns a single entity value where no result is found. Expect EmptyResultException.") public void testEmptyResultException() { try { @@ -1341,6 +1350,22 @@ public void testPageOfNothing() { assertEquals(0L, page.totalPages()); } + @Assertion(id = "458", strategy = "Use a repository method with a JDQL query that consists of only an ORDER BY clause.") + public void testPartialQueryOrderBy() { + + assertEquals(List.of('A', 'B', 'C', 'D', 'E', 'F'), + characters.alphabetic(Limit.range(65, 70)) + .map(AsciiCharacter::getThisCharacter) + .collect(Collectors.toList())); + } + + @Assertion(id = "458", strategy = "Use a repository method with a JDQL query that consists of only the SELECT and ORDER BY clauses.") + public void testPartialQuerySelectAndOrderBy() { + + assertEquals("zyxwvuts", + String.valueOf(characters.reverseAlphabetic(Limit.range(6, 13)))); + } + @Assertion(id = "133", strategy = "Use count and exists methods where the primary entity class is inferred from the lifecycle methods.") public void testPrimaryEntityClassDeterminedByLifeCycleMethods() { assertEquals(4, customRepo.countByIdIn(Set.of(2L, 15L, 37L, -5L, 60L))); From d773e8d77f0ea4084eb08438d8789c5c8f9e2cb6 Mon Sep 17 00:00:00 2001 From: Nathan Rauh Date: Wed, 27 Mar 2024 14:39:30 -0500 Subject: [PATCH 2/2] Additional TCK test with NULL keyword --- .../tck/data/framework/read/only/AsciiCharacters.java | 3 +++ .../ee/jakarta/tck/data/standalone/entity/EntityTests.java | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/tck/src/main/java/ee/jakarta/tck/data/framework/read/only/AsciiCharacters.java b/tck/src/main/java/ee/jakarta/tck/data/framework/read/only/AsciiCharacters.java index b49aa0d7c..f1e590414 100644 --- a/tck/src/main/java/ee/jakarta/tck/data/framework/read/only/AsciiCharacters.java +++ b/tck/src/main/java/ee/jakarta/tck/data/framework/read/only/AsciiCharacters.java @@ -85,6 +85,9 @@ Stream findByHexadecimalIgnoreCaseBetweenAndHexadecimalNotIn(Str " order by id asc") char[] getABCDFO(); + @Query("SELECT hexadecimal WHERE hexadecimal IS NOT NULL AND thisCharacter = ?1") + Optional hex(char ch); + @Query("WHERE hexadecimal <> ' ORDER BY isn''t a keyword when inside a literal' AND hexadecimal IN ('4a', '4b', '4c', ?1)") Stream jklOr(String hex); diff --git a/tck/src/main/java/ee/jakarta/tck/data/standalone/entity/EntityTests.java b/tck/src/main/java/ee/jakarta/tck/data/standalone/entity/EntityTests.java index b014950fe..360ac43b0 100644 --- a/tck/src/main/java/ee/jakarta/tck/data/standalone/entity/EntityTests.java +++ b/tck/src/main/java/ee/jakarta/tck/data/standalone/entity/EntityTests.java @@ -1384,6 +1384,13 @@ public void testQueryWithNot() { assertEquals("ABCDFO", String.valueOf(characters.getABCDFO())); } + @Assertion(id = "458", strategy = "Use a repository method with a JDQL query that uses the NULL keyword.") + public void testQueryWithNull() { + + assertEquals("4a", characters.hex('J').orElseThrow()); + assertEquals("44", characters.hex('D').orElseThrow()); + } + @Assertion(id = "458", strategy = "Use a repository method with a JDQL query that relies on the OR operator.") public void testQueryWithOr() { PageRequest page1Request = PageRequest.ofSize(4).sortBy(Sort.desc("numBitsRequired"), Sort.asc("id"));