From 7b32d6233c63ac0ec2beb47501da1bd753f9501a Mon Sep 17 00:00:00 2001 From: Anna Vetcininova Date: Wed, 4 Jun 2025 14:58:37 +0200 Subject: [PATCH] Bugfix orderby for an IdQueryField(ID) Squash commits of branch bugfix/orderby-id: - Bugfix orderby for an IdQueryField(ID) - Add changelog for the bugfix ordering by ID field - Add second unit test to order by name and id --- gradle/changelog/bugfix_order_by_id.yaml | 2 ++ .../store/sqlite/SQLiteQueryableStore.java | 7 +++- .../sqlite/SQLiteQueryableStoreTest.java | 33 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 gradle/changelog/bugfix_order_by_id.yaml diff --git a/gradle/changelog/bugfix_order_by_id.yaml b/gradle/changelog/bugfix_order_by_id.yaml new file mode 100644 index 0000000000..f7411adb1f --- /dev/null +++ b/gradle/changelog/bugfix_order_by_id.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Ensure query results are ordered by the ID field diff --git a/scm-persistence/src/main/java/sonia/scm/store/sqlite/SQLiteQueryableStore.java b/scm-persistence/src/main/java/sonia/scm/store/sqlite/SQLiteQueryableStore.java index 3b8d9174dc..924a138156 100644 --- a/scm-persistence/src/main/java/sonia/scm/store/sqlite/SQLiteQueryableStore.java +++ b/scm-persistence/src/main/java/sonia/scm/store/sqlite/SQLiteQueryableStore.java @@ -451,7 +451,12 @@ class SQLiteQueryableStore implements QueryableStore, QueryableMaintenance Iterator> it = orderBy.iterator(); while (it.hasNext()) { OrderBy order = it.next(); - orderByBuilder.append("json_extract(payload, '$.").append(order.field.getName()).append("') ").append(order.order.name()); + if (order.field instanceof IdQueryField) { + orderByBuilder.append("ID "); + } else { + orderByBuilder.append("json_extract(payload, '$.").append(order.field.getName()).append("') "); + } + orderByBuilder.append(order.order.name()); if (it.hasNext()) { orderByBuilder.append(", "); } diff --git a/scm-persistence/src/test/java/sonia/scm/store/sqlite/SQLiteQueryableStoreTest.java b/scm-persistence/src/test/java/sonia/scm/store/sqlite/SQLiteQueryableStoreTest.java index 648654321c..02416ef532 100644 --- a/scm-persistence/src/test/java/sonia/scm/store/sqlite/SQLiteQueryableStoreTest.java +++ b/scm-persistence/src/test/java/sonia/scm/store/sqlite/SQLiteQueryableStoreTest.java @@ -457,6 +457,39 @@ class SQLiteQueryableStoreTest { .containsExactly("Tricia"); } + @Test + void shouldQueryForIdAndOrderByDESC() { + SQLiteQueryableMutableStore store = new StoreTestBuilder(connectionString).withIds(); + store.put("1", new User("trish", "Tricia", "tricia@hog.org")); + store.put("2", new User("trillian", "Trillian McMillan", "mcmillan@gmail.com")); + store.put("3", new User("arthur", "Arthur Dent", "arthur@hog.org")); + + List all = store.query().orderBy(ID, QueryableStore.Order.DESC) + .findAll(); + + assertThat(all) + .extracting("name") + .containsExactly("arthur","trillian","trish"); + } + + @Test + void shouldOrderIdsAndPayload() { + SQLiteQueryableMutableStore store = new StoreTestBuilder(connectionString).withIds(); + store.put("1", new User("trish", "Tricia", "tricia@hog.org")); + store.put("2", new User("trillian", "Trillian McMillan", "mcmillan@gmail.com")); + store.put("3", new User("trillian", "Arthur Dent", "arthur@hog.org")); + + List all = store.query() + .orderBy(USER_NAME, QueryableStore.Order.DESC) + .orderBy(ID, QueryableStore.Order.ASC) + .findAll(); + + System.out.println(all); + assertThat(all) + .extracting("displayName") + .containsExactly("Tricia","Trillian McMillan","Arthur Dent"); + } + @Test void shouldQueryForParents() { new StoreTestBuilder(connectionString, Group.class.getName())