diff --git a/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md b/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md index 9dd275119e18..ffb04336d322 100644 --- a/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md +++ b/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md @@ -7,6 +7,7 @@ #### Breaking Changes #### Bugs Fixed +* Fixed when IN statement in annotated query didn't work with Long values - See [PR 36249](https://github.com/Azure/azure-sdk-for-java/pull/36249). #### Other Changes diff --git a/sdk/spring/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/repository/support/StringBasedCosmosQuery.java b/sdk/spring/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/repository/support/StringBasedCosmosQuery.java index baa27113e679..5e0e2f4b51a4 100644 --- a/sdk/spring/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/repository/support/StringBasedCosmosQuery.java +++ b/sdk/spring/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/repository/support/StringBasedCosmosQuery.java @@ -70,8 +70,7 @@ public Object execute(final Object[] parameters) { if (!("").equals(paramName)) { String inParamCheck = "array_contains(@" + paramName.toLowerCase(Locale.US); if (parameters[paramIndex] instanceof Collection && !modifiedExpandedQuery.contains(inParamCheck)) { - List expandParam = ((Collection) parameters[paramIndex]).stream() - .map(Object::toString).collect(Collectors.toList()); + List expandParam = ((Collection) parameters[paramIndex]).stream().collect(Collectors.toList()); List expandedParamKeys = new ArrayList<>(); for (int arrayIndex = 0; arrayIndex < expandParam.size(); arrayIndex++) { expandedParamKeys.add("@" + paramName + arrayIndex); diff --git a/sdk/spring/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/repository/support/StringBasedReactiveCosmosQuery.java b/sdk/spring/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/repository/support/StringBasedReactiveCosmosQuery.java index 5df429898fae..994af109b579 100644 --- a/sdk/spring/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/repository/support/StringBasedReactiveCosmosQuery.java +++ b/sdk/spring/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/repository/support/StringBasedReactiveCosmosQuery.java @@ -72,8 +72,7 @@ public Object execute(final Object[] parameters) { if (!("").equals(paramName)) { String inParamCheck = "array_contains(@" + paramName.toLowerCase(Locale.US); if (parameters[paramIndex] instanceof Collection && !modifiedExpandedQuery.contains(inParamCheck)) { - ArrayList expandParam = (ArrayList) ((Collection) parameters[paramIndex]).stream() - .map(Object::toString).collect(Collectors.toList()); + List expandParam = ((Collection) parameters[paramIndex]).stream().collect(Collectors.toList()); List expandedParamKeys = new ArrayList<>(); for (int arrayIndex = 0; arrayIndex < expandParam.size(); arrayIndex++) { expandedParamKeys.add("@" + paramName + arrayIndex); diff --git a/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/common/TestConstants.java b/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/common/TestConstants.java index 20c1c22566b5..3a96dab6c8df 100644 --- a/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/common/TestConstants.java +++ b/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/common/TestConstants.java @@ -5,6 +5,7 @@ import com.azure.cosmos.models.IndexingMode; import com.azure.spring.data.cosmos.domain.Address; +import java.time.LocalDate; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -134,6 +135,18 @@ public final class TestConstants { public static final int PRECONDITION_FAILED_STATUS_CODE = 412; public static final int CONFLICT_STATUS_CODE = 409; + public static final Long LONG_ID_1 = Long.valueOf(10000001); + public static final Long LONG_ID_2 = Long.valueOf(20000002); + public static final Long LONG_ID_3 = Long.valueOf(54600003); + + public static final Integer HOME_NUMBER_1 = 1; + public static final Integer HOME_NUMBER_2 = 99; + public static final Integer HOME_NUMBER_3 = 4444; + + public static final LocalDate REGISTRATION_TIME_1D_AGO = LocalDate.now().minusDays(1); + public static final LocalDate REGISTRATION_TIME_1W_AGO = LocalDate.now().minusDays(7); + public static final LocalDate REGISTRATION_TIME_1M_AGO = LocalDate.now().minusMonths(1); + public static final Map PASSPORT_IDS_BY_COUNTRY = new HashMap() {{ put("United States of America", "123456789"); put("Côte d'Ivoire", "IC1234567"); diff --git a/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/domain/Address.java b/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/domain/Address.java index 8d87690c6a5e..e312efd17092 100644 --- a/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/domain/Address.java +++ b/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/domain/Address.java @@ -7,6 +7,7 @@ import com.azure.spring.data.cosmos.core.mapping.PartitionKey; import org.springframework.data.annotation.Id; +import java.time.LocalDate; import java.util.Objects; @Container(ru = TestConstants.DEFAULT_MINIMUM_RU) @@ -24,6 +25,15 @@ public class Address { @Id String postalCode; String street; + + Long longId; + + Integer homeNumber; + + LocalDate registrationDate; + + boolean isOffice; + @PartitionKey String city; @@ -47,10 +57,34 @@ public String getCity() { return city; } + public Long getLongId() { + return longId; + } + + public Integer getHomeNumber() { + return homeNumber; + } + + public LocalDate getRegistrationDate() { + return registrationDate; + } + + public boolean getIsOffice() { + return isOffice; + } + public void setCity(String city) { this.city = city; } + public void setLongId(Long longId) { this.longId = longId; } + + public void setHomeNumber(Integer homeNumber) { this.homeNumber = homeNumber; } + + public void setRegistrationDate(LocalDate registrationDate) { this.registrationDate = registrationDate; } + + public void setIsOffice(boolean isOffice) { this.isOffice = isOffice; } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/integration/AnnotatedQueryIT.java b/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/integration/AnnotatedQueryIT.java index daca354e4263..62bdfab39155 100644 --- a/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/integration/AnnotatedQueryIT.java +++ b/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/integration/AnnotatedQueryIT.java @@ -24,6 +24,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -281,6 +282,68 @@ public void testAnnotatedQueryWithMultipleCitiesAndSort() { assertAddressOrder(resultsAsc2, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2, Address.TEST_ADDRESS1_PARTITION1); } + @Test + public void testAnnotatedQueryWithInLongParameters() { + Address.TEST_ADDRESS1_PARTITION1.setLongId(TestConstants.LONG_ID_1); + Address.TEST_ADDRESS2_PARTITION1.setLongId(TestConstants.LONG_ID_1); + Address.TEST_ADDRESS1_PARTITION2.setLongId(TestConstants.LONG_ID_2); + Address.TEST_ADDRESS4_PARTITION3.setLongId(TestConstants.LONG_ID_3); + + final List longListForIn = Arrays.asList(TestConstants.LONG_ID_1, TestConstants.LONG_ID_2); + + final List
addresses = Arrays.asList(Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2, Address.TEST_ADDRESS4_PARTITION3); + addressRepository.saveAll(addresses); + + final List
resultsAsc = addressRepository.annotatedFindByInLongParameters(longListForIn, Sort.by(Sort.Direction.ASC, "longId")); + assertAddressOrder(resultsAsc, Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2); + } + + @Test + public void testAnnotatedQueryWithInIntParameters() { + Address.TEST_ADDRESS1_PARTITION1.setHomeNumber(TestConstants.HOME_NUMBER_1); + Address.TEST_ADDRESS2_PARTITION1.setHomeNumber(TestConstants.HOME_NUMBER_1); + Address.TEST_ADDRESS1_PARTITION2.setHomeNumber(TestConstants.HOME_NUMBER_2); + Address.TEST_ADDRESS4_PARTITION3.setHomeNumber(TestConstants.HOME_NUMBER_3); + + final List homeNumbersForIn = Arrays.asList(TestConstants.HOME_NUMBER_1, TestConstants.HOME_NUMBER_2); + + final List
addresses = Arrays.asList(Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2, Address.TEST_ADDRESS4_PARTITION3); + addressRepository.saveAll(addresses); + + final List
resultsAsc = addressRepository.annotatedFindByInHomeNumberParameters(homeNumbersForIn, Sort.by(Sort.Direction.ASC, "longId")); + assertAddressOrder(resultsAsc, Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2); + } + + @Test + public void testAnnotatedQueryWithInDateParameters() { + Address.TEST_ADDRESS1_PARTITION1.setRegistrationDate(TestConstants.REGISTRATION_TIME_1D_AGO); + Address.TEST_ADDRESS2_PARTITION1.setRegistrationDate(TestConstants.REGISTRATION_TIME_1D_AGO); + Address.TEST_ADDRESS1_PARTITION2.setRegistrationDate(TestConstants.REGISTRATION_TIME_1M_AGO); + Address.TEST_ADDRESS4_PARTITION3.setRegistrationDate(TestConstants.REGISTRATION_TIME_1W_AGO); + + final List datesForIn = Arrays.asList(TestConstants.REGISTRATION_TIME_1D_AGO, TestConstants.REGISTRATION_TIME_1M_AGO); + + final List
addresses = Arrays.asList(Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2, Address.TEST_ADDRESS4_PARTITION3); + addressRepository.saveAll(addresses); + + final List
resultsAsc = addressRepository.annotatedFindByInRegistrationDateParameters(datesForIn, Sort.by(Sort.Direction.ASC, "longId")); + assertAddressOrder(resultsAsc, Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2); + } + + @Test + public void testAnnotatedQueryWithInBooleanParameters() { + Address.TEST_ADDRESS1_PARTITION1.setIsOffice(true); + Address.TEST_ADDRESS4_PARTITION3.setIsOffice(true); + + final List boolForIn = Arrays.asList(true); + + final List
addresses = Arrays.asList(Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2, Address.TEST_ADDRESS4_PARTITION3); + addressRepository.saveAll(addresses); + + final List
resultsAsc = addressRepository.annotatedFindByInIsOfficeParameters(boolForIn, Sort.by(Sort.Direction.ASC, "longId")); + assertAddressOrder(resultsAsc, Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS4_PARTITION3); + } + @Test public void testAnnotatedQueryWithArrayContains() { final List
addresses = Arrays.asList(Address.TEST_ADDRESS1_PARTITION1, Address.TEST_ADDRESS2_PARTITION1, Address.TEST_ADDRESS1_PARTITION2); diff --git a/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/repository/AddressRepository.java b/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/repository/AddressRepository.java index 9244d2ad4d5b..876a4db00fb7 100644 --- a/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/repository/AddressRepository.java +++ b/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/repository/AddressRepository.java @@ -13,6 +13,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.List; @Repository @@ -57,6 +58,18 @@ public interface AddressRepository extends CosmosRepository { @Query(value = "select * from a where a.city IN (@cities)") List
annotatedFindByCityIn(@Param("cities") List cities, Sort sort); + @Query(value = "select * from a where a.longId IN (@longList)") + List
annotatedFindByInLongParameters(@Param("longList") List longsList, Sort sort); + + @Query(value = "select * from a where a.homeNumber IN (@homeNumbers)") + List
annotatedFindByInHomeNumberParameters(@Param("homeNumbers") List longsList, Sort sort); + + @Query(value = "select * from a where a.registrationDate IN (@registrationDates)") + List
annotatedFindByInRegistrationDateParameters(@Param("registrationDates") List registrationDates, Sort sort); + + @Query(value = "select * from a where a.isOffice IN (@isOffices)") + List
annotatedFindByInIsOfficeParameters(@Param("isOffices") List isOffices, Sort sort); + @Query(value = "SELECT * FROM a WHERE ARRAY_CONTAINS(@cities, a.city) ") List
annotatedFindByCities(@Param("cities") List cities);