From 37f9bd0b4903e25f667625e755f980868663ee2f Mon Sep 17 00:00:00 2001 From: Louis Klein Date: Sat, 14 Mar 2026 15:45:38 +0100 Subject: [PATCH] fix: avoid mutating resource paths in ODataRequestCount --- .../client/request/ODataRequestCount.java | 20 +++++++++++++++++-- .../client/request/ODataRequestCountTest.java | 10 ++++++++++ .../odatav4/core/NestedEntityTest.java | 13 ++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCount.java b/datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCount.java index d30668c0b..893700cf5 100644 --- a/datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCount.java +++ b/datamodel/odata-client/src/main/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCount.java @@ -54,7 +54,7 @@ public ODataRequestCount( @Nullable final String encodedQuery, @Nonnull final ODataProtocol protocol ) { - super(servicePath, resourcePath.addSegment("$count"), encodedQuery, protocol); + super(servicePath, appendCountResourcePath(resourcePath), encodedQuery, protocol); } /** @@ -74,8 +74,24 @@ public ODataRequestCount( { this( servicePath, - resourcePath.addSegment(query.getEntityOrPropertyName()), + appendResourcePath(resourcePath, query.getEntityOrPropertyName()), query.getEncodedQueryString(), query.getProtocol()); } + + @Nonnull + private static ODataResourcePath appendCountResourcePath( @Nonnull final ODataResourcePath resourcePath ) + { + return appendResourcePath(resourcePath, "$count"); + } + + @Nonnull + private static + ODataResourcePath + appendResourcePath( @Nonnull final ODataResourcePath resourcePath, @Nonnull final String segment ) + { + final ODataResourcePath appendedPath = new ODataResourcePath(); + resourcePath.getSegments().forEach(s -> appendedPath.addSegment(s._1, s._2)); + return appendedPath.addSegment(segment); + } } diff --git a/datamodel/odata-client/src/test/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCountTest.java b/datamodel/odata-client/src/test/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCountTest.java index e432a9627..7eab1070a 100644 --- a/datamodel/odata-client/src/test/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCountTest.java +++ b/datamodel/odata-client/src/test/java/com/sap/cloud/sdk/datamodel/odata/client/request/ODataRequestCountTest.java @@ -92,4 +92,14 @@ void testConstructorWithStructuredQuery() assertThat(actual).isEqualTo(expected); assertThat(actual.getQueryString()).isEqualTo(expected.getQueryString()); } + + @Test + void testConstructorDoesNotMutateResourcePath() + { + final ODataResourcePath resourcePath = ODataResourcePath.of(ENTITY_NAME); + + new ODataRequestCount(SERVICE_PATH, resourcePath, "", ODataProtocol.V4); + + assertThat(resourcePath.toString()).isEqualTo("/" + ENTITY_NAME); + } } diff --git a/datamodel/odata-v4/odata-v4-core/src/test/java/com/sap/cloud/sdk/datamodel/odatav4/core/NestedEntityTest.java b/datamodel/odata-v4/odata-v4-core/src/test/java/com/sap/cloud/sdk/datamodel/odatav4/core/NestedEntityTest.java index e3b0b96e3..060cb9e4a 100644 --- a/datamodel/odata-v4/odata-v4-core/src/test/java/com/sap/cloud/sdk/datamodel/odatav4/core/NestedEntityTest.java +++ b/datamodel/odata-v4/odata-v4-core/src/test/java/com/sap/cloud/sdk/datamodel/odatav4/core/NestedEntityTest.java @@ -174,6 +174,19 @@ void testCountNestedTrip() assertThat(count.getRelativeUri()).hasToString("/TripPinServiceRW/People('russellwhyte')/Trips/$count"); } + @Test + void testCountNestedTripToRequestIsStable() + { + final Person personByKey = Person.builder().userName("russellwhyte").build(); + final CountRequestBuilder countBuilder = + service.forEntity(personByKey).navigateTo(Person.TO_TRIPS).count(); + + assertThat(countBuilder.toRequest().getRelativeUri()) + .hasToString("/TripPinServiceRW/People('russellwhyte')/Trips/$count"); + assertThat(countBuilder.toRequest().getRelativeUri()) + .hasToString("/TripPinServiceRW/People('russellwhyte')/Trips/$count"); + } + @Test void testGetByKeyNestedPlanItem() {