From b38f96f4070285a1b7008a476569dd304a6f6e5a Mon Sep 17 00:00:00 2001 From: Mustafa Berberoglu Date: Mon, 1 Nov 2021 01:10:12 +0300 Subject: [PATCH] add Long strategy --- .../springsearch/strategies/LongStrategy.kt | 27 ++++++++++ .../strategies/ParsingStrategy.kt | 1 + .../SpringSearchApplicationTest.kt | 54 +++++++++++++++++++ .../kotlin/com/sipios/springsearch/Users.kt | 3 ++ 4 files changed, 85 insertions(+) create mode 100644 src/main/kotlin/com/sipios/springsearch/strategies/LongStrategy.kt diff --git a/src/main/kotlin/com/sipios/springsearch/strategies/LongStrategy.kt b/src/main/kotlin/com/sipios/springsearch/strategies/LongStrategy.kt new file mode 100644 index 0000000..8d997c4 --- /dev/null +++ b/src/main/kotlin/com/sipios/springsearch/strategies/LongStrategy.kt @@ -0,0 +1,27 @@ +package com.sipios.springsearch.strategies + +import com.sipios.springsearch.SearchOperation +import javax.persistence.criteria.CriteriaBuilder +import javax.persistence.criteria.Path +import javax.persistence.criteria.Predicate +import kotlin.reflect.KClass + +class LongStrategy : ParsingStrategy { + override fun buildPredicate( + builder: CriteriaBuilder, + path: Path<*>, + fieldName: String, + ops: SearchOperation?, + value: Any? + ): Predicate? { + return when (ops) { + SearchOperation.GREATER_THAN -> builder.greaterThan(path.get(fieldName), value as Long) + SearchOperation.LESS_THAN -> builder.lessThan(path.get(fieldName), value as Long) + else -> super.buildPredicate(builder, path, fieldName, ops, value) + } + } + + override fun parse(value: String?, fieldClass: KClass): Any? { + return value?.toLong() + } +} diff --git a/src/main/kotlin/com/sipios/springsearch/strategies/ParsingStrategy.kt b/src/main/kotlin/com/sipios/springsearch/strategies/ParsingStrategy.kt index 28aedf7..189b42d 100644 --- a/src/main/kotlin/com/sipios/springsearch/strategies/ParsingStrategy.kt +++ b/src/main/kotlin/com/sipios/springsearch/strategies/ParsingStrategy.kt @@ -67,6 +67,7 @@ interface ParsingStrategy { fieldClass == Double::class -> DoubleStrategy() fieldClass == Float::class -> FloatStrategy() fieldClass == Int::class -> IntStrategy() + fieldClass == Long::class -> LongStrategy() fieldClass.isSubclassOf(Enum::class) -> EnumStrategy() fieldClass == Duration::class -> DurationStrategy() fieldClass == LocalDate::class -> LocalDateStrategy() diff --git a/src/test/kotlin/com/sipios/springsearch/SpringSearchApplicationTest.kt b/src/test/kotlin/com/sipios/springsearch/SpringSearchApplicationTest.kt index e0d0df4..9f939fd 100644 --- a/src/test/kotlin/com/sipios/springsearch/SpringSearchApplicationTest.kt +++ b/src/test/kotlin/com/sipios/springsearch/SpringSearchApplicationTest.kt @@ -288,6 +288,60 @@ class SpringSearchApplicationTest { Assertions.assertTrue(setOf(userWith1ChildId, userWith5ChildrenId, userWith6ChildrenId) == specificationUsers.map { user -> user.userId }.toSet()) } + @Test + fun canGetUserWithHugeDebt() { + val userWith1BDebtId = userRepository.save(Users(userDebt = 4000000000)).userId + val userWith2BDebtId = userRepository.save(Users(userDebt = 5000000000)).userId + val userWith3BDebtId = userRepository.save(Users(userDebt = 6000000000)).userId + userRepository.save(Users(userDebt = 0)) + userRepository.save(Users(userDebt = 1000)) + userRepository.save(Users(userDebt = 20000)) + userRepository.save(Users(userDebt = 300000)) + + val specification = SpecificationsBuilder(SearchSpec::class.constructors.first().call("", true)).withSearch("userDebt>1000000000").build() + val specificationUsers = userRepository.findAll(specification) + Assertions.assertTrue(setOf(userWith1BDebtId, userWith2BDebtId, userWith3BDebtId) == specificationUsers.map { user -> user.userId }.toSet()) + } + + @Test + fun canGetUserWithSmallDebt() { + userRepository.save(Users(userDebt = 4000000000)) + userRepository.save(Users(userDebt = 5000000000)) + userRepository.save(Users(userDebt = 6000000000)) + val userWith1KDebtId = userRepository.save(Users(userDebt = 1000)).userId + val userWith2KDebtId = userRepository.save(Users(userDebt = 2000)).userId + + val specification = SpecificationsBuilder(SearchSpec::class.constructors.first().call("", true)).withSearch("userDebt>0 AND userDebt<1000000000").build() + val specificationUsers = userRepository.findAll(specification) + Assertions.assertTrue(setOf(userWith1KDebtId, userWith2KDebtId) == specificationUsers.map { user -> user.userId }.toSet()) + } + + @Test + fun canGetUserWithNoDebt() { + val user1WithNoDebtId = userRepository.save(Users(userDebt = 0)).userId + val user2WithNoDebtId = userRepository.save(Users(userDebt = 0)).userId + val user3WithNoDebtId = userRepository.save(Users(userDebt = 0)).userId + userRepository.save(Users(userDebt = 1000)) + userRepository.save(Users(userDebt = 2000)) + userRepository.save(Users(userDebt = 3000)) + + val specification = SpecificationsBuilder(SearchSpec::class.constructors.first().call("", true)).withSearch("userDebt:0").build() + val specificationUsers = userRepository.findAll(specification) + Assertions.assertTrue(setOf(user1WithNoDebtId, user2WithNoDebtId, user3WithNoDebtId) == specificationUsers.map { user -> user.userId }.toSet()) + } + + @Test + fun canGetUserWithDebt() { + val user1WithNoDebtId = userRepository.save(Users(userDebt = 1000)).userId + val user2WithNoDebtId = userRepository.save(Users(userDebt = 2000)).userId + userRepository.save(Users(userDebt = 0)) + userRepository.save(Users(userDebt = 0)) + + val specification = SpecificationsBuilder(SearchSpec::class.constructors.first().call("", true)).withSearch("userDebt!0").build() + val specificationUsers = userRepository.findAll(specification) + Assertions.assertTrue(setOf(user1WithNoDebtId, user2WithNoDebtId) == specificationUsers.map { user -> user.userId }.toSet()) + } + @Test fun canGetUserWithSmallerSalary() { val smallerSalaryUserId = userRepository.save(Users(userSalary = 2223.3F)).userId diff --git a/src/test/kotlin/com/sipios/springsearch/Users.kt b/src/test/kotlin/com/sipios/springsearch/Users.kt index 02ff06c..35c821b 100644 --- a/src/test/kotlin/com/sipios/springsearch/Users.kt +++ b/src/test/kotlin/com/sipios/springsearch/Users.kt @@ -38,6 +38,9 @@ data class Users( @Column(name = "NumberOfChildren") var userChildrenNumber: Int = 3, + @Column(name = "Debt") + var userDebt: Long = 3000000000L, + @Column(name = "Salary") var userSalary: Float = 3000.0F,