diff --git a/README.md b/README.md index d3f0d18..56dbaf2 100644 --- a/README.md +++ b/README.md @@ -171,6 +171,14 @@ Request : `/cars?search=creationyear:2018 AND price<300000 AND (color:Yellow OR 15. Using the BETWEEN operator Request : `/cars?search=creationyear BETWEEN 2017 AND 2019` +## Blocking the search on a field +```java +@GetMapping +public List getUsers(@SearchSpec(blackListedFields = {"password"}) Specification specs) { + return userRepository.findAll(Specification.where(specs)); +} +``` + ## Troubleshooting diff --git a/src/main/kotlin/com/sipios/springsearch/QueryVisitorImpl.kt b/src/main/kotlin/com/sipios/springsearch/QueryVisitorImpl.kt index d5fbcd7..1917a32 100644 --- a/src/main/kotlin/com/sipios/springsearch/QueryVisitorImpl.kt +++ b/src/main/kotlin/com/sipios/springsearch/QueryVisitorImpl.kt @@ -4,6 +4,8 @@ import com.sipios.springsearch.anotation.SearchSpec import com.sipios.springsearch.grammar.QueryBaseVisitor import com.sipios.springsearch.grammar.QueryParser import org.springframework.data.jpa.domain.Specification +import org.springframework.http.HttpStatus +import org.springframework.web.server.ResponseStatusException class QueryVisitorImpl(private val searchSpecAnnotation: SearchSpec) : QueryBaseVisitor>() { private val valueRegExp = Regex(pattern = "^(?\\*?)(?.+?)(?\\*?)$") @@ -32,6 +34,7 @@ class QueryVisitorImpl(private val searchSpecAnnotation: SearchSpec) : QueryB override fun visitIsCriteria(ctx: QueryParser.IsCriteriaContext): Specification { val key = ctx.key().text + verifyBlackList(key) val op = if (ctx.IS() != null) { SearchOperation.IS } else { @@ -42,6 +45,7 @@ class QueryVisitorImpl(private val searchSpecAnnotation: SearchSpec) : QueryB override fun visitEqArrayCriteria(ctx: QueryParser.EqArrayCriteriaContext): Specification { val key = ctx.key().text + verifyBlackList(key) val op = if (ctx.IN() != null) { SearchOperation.IN_ARRAY } else { @@ -58,6 +62,7 @@ class QueryVisitorImpl(private val searchSpecAnnotation: SearchSpec) : QueryB override fun visitBetweenCriteria(ctx: QueryParser.BetweenCriteriaContext): Specification { val key = ctx.key().text + verifyBlackList(key) val leftValue = if (ctx.left.STRING() != null) { clearString(ctx.left.text) } else { @@ -93,6 +98,7 @@ class QueryVisitorImpl(private val searchSpecAnnotation: SearchSpec) : QueryB } else { ctx.value().text } + verifyBlackList(key) val matchResult = this.valueRegExp.find(value) val op = SearchOperation.getSimpleOperation(ctx.op().text) ?: throw IllegalArgumentException("Invalid operation") val criteria = SearchCriteria( @@ -106,6 +112,16 @@ class QueryVisitorImpl(private val searchSpecAnnotation: SearchSpec) : QueryB return SpecificationImpl(criteria, searchSpecAnnotation) } + private fun verifyBlackList(key: String?) { + val blackList = this.searchSpecAnnotation.blackListedFields + if (blackList.contains(key)) { + throw ResponseStatusException( + HttpStatus.BAD_REQUEST, + "Field $key is blacklisted" + ) + } + } + private fun clearString(value: String) = value .removeSurrounding("'") .removeSurrounding("\"") diff --git a/src/main/kotlin/com/sipios/springsearch/anotation/SearchSpec.kt b/src/main/kotlin/com/sipios/springsearch/anotation/SearchSpec.kt index dd2a43d..2b73666 100644 --- a/src/main/kotlin/com/sipios/springsearch/anotation/SearchSpec.kt +++ b/src/main/kotlin/com/sipios/springsearch/anotation/SearchSpec.kt @@ -16,5 +16,10 @@ annotation class SearchSpec( /** * A flag to indicate if the search needs to be case-sensitive or not */ - val caseSensitiveFlag: Boolean = true + val caseSensitiveFlag: Boolean = true, + + /** + * A list of fields that should be excluded from the search + */ + val blackListedFields: Array = [] ) diff --git a/src/test/kotlin/com/sipios/springsearch/SpringSearchApplicationTest.kt b/src/test/kotlin/com/sipios/springsearch/SpringSearchApplicationTest.kt index 632e180..0171906 100644 --- a/src/test/kotlin/com/sipios/springsearch/SpringSearchApplicationTest.kt +++ b/src/test/kotlin/com/sipios/springsearch/SpringSearchApplicationTest.kt @@ -42,7 +42,7 @@ class SpringSearchApplicationTest { userRepository.save(Users()) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userId:$userId").build() Assertions.assertEquals(userId, userRepository.findAll(specification).get(0).userId) } @@ -53,7 +53,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "Bob")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:Alice").build() Assertions.assertEquals(aliceId, userRepository.findAll(specification).get(0).userId) } @@ -66,7 +66,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "Bob", userLastName = "Two")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:Alice AND userLastName:One").build() Assertions.assertEquals(aliceId, userRepository.findAll(specification).get(0).userId) } @@ -76,7 +76,7 @@ class SpringSearchApplicationTest { val edouardProstId = userRepository.save(Users(userFirstName = "Édouard", userLastName = "Pröst")).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:Édouard AND userLastName:Pröst").build() Assertions.assertEquals(edouardProstId, userRepository.findAll(specification).get(0).userId) } @@ -86,7 +86,7 @@ class SpringSearchApplicationTest { val sunDemingId = userRepository.save(Users(userFirstName = "孫德明")).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:孫德明").build() Assertions.assertEquals(sunDemingId, userRepository.findAll(specification).get(0).userId) } @@ -96,7 +96,7 @@ class SpringSearchApplicationTest { val sunDemingId = userRepository.save(Users(userFirstName = "孫德明")).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:孫德明").build() Assertions.assertEquals(sunDemingId, userRepository.findAll(specification).get(0).userId) } @@ -106,7 +106,7 @@ class SpringSearchApplicationTest { val hackermanId = userRepository.save(Users(userFirstName = "&@#*\"''^^^\$``%=+§__hack3rman__")).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:&@#*\"''^^^\$``%=+§__hack3rman__").build() Assertions.assertEquals(hackermanId, userRepository.findAll(specification).get(0).userId) } @@ -116,7 +116,7 @@ class SpringSearchApplicationTest { val robertJuniorId = userRepository.save(Users(userFirstName = "robert junior")).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:'robert junior'").build() Assertions.assertEquals(robertJuniorId, userRepository.findAll(specification).get(0).userId) } @@ -129,7 +129,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röbert")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:robe*").build() val robeUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(robertId, robertaId) == robeUsers.map { user -> user.userId }.toSet()) @@ -143,7 +143,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röbęrt")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:*ert").build() val robeUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(robertId, robertaId) == robeUsers.map { user -> user.userId }.toSet()) @@ -157,7 +157,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röb*rt")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:rob**").build() val robeUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(robertId, robertaId) == robeUsers.map { user -> user.userId }.toSet()) @@ -173,7 +173,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "Röbert")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:*obe*").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -196,7 +196,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röb*rt")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:*ob**").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -219,7 +219,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röb*rt")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:'*ob**'").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -242,7 +242,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röb*rt")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName:\"*ob**\"").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -265,7 +265,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robèrta")).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName!*è*").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -286,7 +286,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "Bob")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName!B*").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(aliceId, aliceId2, bobId) == specificationUsers.map { user -> user.userId }.toSet()) @@ -300,7 +300,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "alice")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName!*e").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(boBId, alicEId, bobId) == specificationUsers.map { user -> user.userId }.toSet()) @@ -317,7 +317,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userChildrenNumber = 2)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber>4").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -340,7 +340,7 @@ class SpringSearchApplicationTest { val user2With2ChildrenId = userRepository.save(Users(userChildrenNumber = 2)).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber<4").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -365,7 +365,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userChildrenNumber = 5)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber:4").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -386,7 +386,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userChildrenNumber = 2)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber!2").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -407,7 +407,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userSalary = 2300.0F)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userSalary<2300").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -426,7 +426,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userSalary = 1500.2F)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userSalary>4000.001").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -445,7 +445,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userSalary = 5350.7F)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userSalary<4000.1 AND userSalary>1500.2").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(medianUserId) == specificationUsers.map { user -> user.userId }.toSet()) @@ -458,7 +458,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userAgeInSeconds = 23222223.0)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userAgeInSeconds>23222223.2").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(olderUserId) == specificationUsers.map { user -> user.userId }.toSet()) @@ -471,7 +471,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userAgeInSeconds = 23222223.3)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userAgeInSeconds<23222223.2").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(youngerUserId) == specificationUsers.map { user -> user.userId }.toSet()) @@ -484,7 +484,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userAgeInSeconds = 23222223.0)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userAgeInSeconds:23222223.2").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(middleUserId) == specificationUsers.map { user -> user.userId }.toSet()) @@ -500,7 +500,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userSalary = 1500.2F, userLastName = "Three")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userSalary>1500.1 AND ( userLastName:One OR userLastName:Two )").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -521,7 +521,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userSalary = 1502F, userLastName = "One")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userSalary<1502 AND ( ( userLastName:One OR userLastName:one ) OR userLastName!*n* )").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -542,7 +542,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userSalary = 1502F, userLastName = "One")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userSalary<1502 AND ((userLastName:One OR userLastName:one) OR userLastName!*n*)").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertTrue( @@ -559,7 +559,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(isAdmin = false)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("isAdmin:true").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(1, specificationUsers.size) @@ -572,7 +572,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(createdAt = sdf.parse("2019-01-03"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt<'2019-01-02'").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(1, specificationUsers.size) @@ -585,13 +585,13 @@ class SpringSearchApplicationTest { userRepository.save(Users(createdAt = sdf.parse("2019-01-03"))) var specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt>'2019-01-02'").build() var specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(1, specificationUsers.size) specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt>'2019-01-04'").build() specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(0, specificationUsers.size) @@ -604,13 +604,13 @@ class SpringSearchApplicationTest { userRepository.save(Users(createdAt = sdf.parse("2019-01-03"))) var specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt>:'2019-01-01'").build() var specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(2, specificationUsers.size) specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt>:'2019-01-04'").build() specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(0, specificationUsers.size) @@ -623,13 +623,13 @@ class SpringSearchApplicationTest { userRepository.save(Users(createdAt = sdf.parse("2019-01-03"))) var specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt<:'2019-01-01'").build() var specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(1, specificationUsers.size) specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt<:'2019-01-03'").build() specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(2, specificationUsers.size) @@ -642,7 +642,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(createdAt = date)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt:'${sdf.format(date)}'").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(1, specificationUsers.size) @@ -655,7 +655,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(createdAt = date)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("createdAt!'2019-01-02'").build() val specificationUsers = userRepository.findAll(specification) Assertions.assertEquals(1, specificationUsers.size) @@ -669,7 +669,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röbęrt")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("userFirstName:robe*").build() val robeUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(robertId, robertaId) == robeUsers.map { user -> user.userId }.toSet()) @@ -683,7 +683,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röbęrt")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("userFirstName:*ert").build() val robeUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(robertId, roubertId) == robeUsers.map { user -> user.userId }.toSet()) @@ -697,7 +697,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "röbęrt")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("userFirstName:*er*").build() val robeUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(robertId, roubertId) == robeUsers.map { user -> user.userId }.toSet()) @@ -710,7 +710,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("userFirstName!*rob*").build() val robeUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(roubertId) == robeUsers.map { user -> user.userId }.toSet()) @@ -723,7 +723,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("userFirstName!rob*").build() val robeUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(roubertId) == robeUsers.map { user -> user.userId }.toSet()) @@ -736,7 +736,7 @@ class SpringSearchApplicationTest { val robotId = userRepository.save(Users(userFirstName = "robot")).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("userFirstName!*rt").build() val robotUsers = userRepository.findAll(specification) Assertions.assertTrue(setOf(robotId) == robotUsers.map { user -> user.userId }.toSet()) @@ -750,7 +750,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", type = UserType.ADMINISTRATOR)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("type:ADMINISTRATOR").build() val robeUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robeUsers.size) @@ -764,7 +764,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", type = UserType.TEAM_MEMBER)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("type!TEAM_MEMBER").build() val irehUsers = userRepository.findAll(specification) Assertions.assertEquals(1, irehUsers.size) @@ -777,7 +777,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedAt = LocalDateTime.parse("2020-01-11T10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedAt>'2020-01-11T09:20:30'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -795,7 +795,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedInstantAt = Instant.parse("2020-01-11T10:20:30Z"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedInstantAt>'2020-01-11T09:20:30Z'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -813,7 +813,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedInstantAt = Instant.parse("2020-01-11T10:20:30Z"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedInstantAt>:'2020-01-11T09:20:30Z'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -831,7 +831,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedInstantAt = Instant.parse("2020-01-11T10:20:30Z"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedInstantAt<:'2020-01-11T09:20:30Z'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -844,7 +844,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedAt = LocalDateTime.parse("2020-01-11T10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedAt<'2020-01-11T09:20:30'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -857,7 +857,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedAt = LocalDateTime.parse("2020-01-11T10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedAt:'2020-01-10T10:15:30'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -870,7 +870,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedAt = LocalDateTime.parse("2020-01-11T10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedAt!'2020-01-11T10:20:30'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -883,7 +883,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedAt = LocalDateTime.parse("2020-01-11T10:20:30"))) userRepository.save(Users(userFirstName = "robot2", updatedAt = LocalDateTime.parse("2020-01-12T10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedAt>:'2020-01-11T10:20:30'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -896,7 +896,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedAt = LocalDateTime.parse("2020-01-11T10:20:30"))) userRepository.save(Users(userFirstName = "robot2", updatedAt = LocalDateTime.parse("2020-01-12T10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedAt<:'2020-01-11T10:20:30'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -909,7 +909,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedDateAt = LocalDate.parse("2020-01-11"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt>'2020-01-10'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -922,7 +922,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedDateAt = LocalDate.parse("2020-01-11"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt<'2020-01-11'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -935,7 +935,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedDateAt = LocalDate.parse("2020-01-11"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt:'2020-01-10'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -948,7 +948,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedDateAt = LocalDate.parse("2020-01-11"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt!'2020-01-11'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -962,7 +962,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot2", updatedDateAt = LocalDate.parse("2020-01-12"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt<:'2020-01-11'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -976,7 +976,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot2", updatedDateAt = LocalDate.parse("2020-01-12"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt>:'2020-01-11'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -989,7 +989,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedTimeAt = LocalTime.parse("10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedTimeAt>'10:15:30'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -1002,7 +1002,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedTimeAt = LocalTime.parse("10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedTimeAt<'10:16:30'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -1015,7 +1015,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedTimeAt = LocalTime.parse("10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedTimeAt:'10:15:30'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -1029,7 +1029,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot2", updatedTimeAt = LocalTime.parse("10:25:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedTimeAt<:'10:20:30'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1043,7 +1043,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot2", updatedTimeAt = LocalTime.parse("10:25:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedTimeAt>:'10:20:30'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1056,7 +1056,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", updatedTimeAt = LocalTime.parse("10:20:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedTimeAt!'10:20:30'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -1069,7 +1069,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", validityDuration = Duration.parse("PT15H"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("validityDuration>'PT10H'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -1082,7 +1082,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", validityDuration = Duration.parse("PT15H"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("validityDuration<'PT11H'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -1095,7 +1095,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", validityDuration = Duration.parse("PT15H"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("validityDuration:'PT10H'").build() val hamidrezaUsers = userRepository.findAll(specification) Assertions.assertEquals(1, hamidrezaUsers.size) @@ -1108,7 +1108,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "robot", validityDuration = Duration.parse("PT15H"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("validityDuration!'PT10H'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -1120,7 +1120,7 @@ class SpringSearchApplicationTest { val userUUID = UUID.randomUUID() userRepository.save(Users(userFirstName = "Diego", uuid = userUUID)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("uuid:'$userUUID'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -1134,7 +1134,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "Diego", uuid = userUUID)) userRepository.save(Users(userFirstName = "Diego two", uuid = user2UUID)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("uuid!'$userUUID'").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -1147,7 +1147,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "jane", userChildrenNumber = 3)) userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 4)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber<:2").build() val users = userRepository.findAll(specification) Assertions.assertEquals(1, users.size) @@ -1160,7 +1160,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "jane", userChildrenNumber = 3)) userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 4)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber>:3").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1172,7 +1172,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "jane", userChildrenNumber = 3)) userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 4)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber<3").build() val users = userRepository.findAll(specification) Assertions.assertEquals(1, users.size) @@ -1185,7 +1185,7 @@ class SpringSearchApplicationTest { val janeId = userRepository.save(Users(userFirstName = "jane", userChildrenNumber = 3)).userId userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 4)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName IN [\"john\", \"jane\"]").build() val users = userRepository.findAll(specification) Assertions.assertTrue(setOf(johnId, janeId) == users.map { user -> user.userId }.toSet()) @@ -1197,7 +1197,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "jane", userChildrenNumber = 3)) userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 4)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName IN []").build() val users = userRepository.findAll(specification) Assertions.assertTrue(users.isEmpty()) @@ -1209,7 +1209,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "jane", userChildrenNumber = 3)) val joeId = userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 4)).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName NOT IN [\"john\", \"jane\"]").build() val users = userRepository.findAll(specification) Assertions.assertTrue(setOf(joeId) == users.map { user -> user.userId }.toSet()) @@ -1221,7 +1221,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "jane", userChildrenNumber = 3)) val joeId = userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 4)).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber NOT IN [2, 3]").build() val users = userRepository.findAll(specification) Assertions.assertTrue(setOf(joeId) == users.map { user -> user.userId }.toSet()) @@ -1233,7 +1233,7 @@ class SpringSearchApplicationTest { val janeId = userRepository.save(Users(userFirstName = "jane", userChildrenNumber = 3)).userId userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 4)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber IN [2, 3]").build() val users = userRepository.findAll(specification) Assertions.assertTrue(setOf(janeId, johnId) == users.map { user -> user.userId }.toSet()) @@ -1245,7 +1245,7 @@ class SpringSearchApplicationTest { val janeId = userRepository.save(Users(userFirstName = "jane", type = UserType.ADMINISTRATOR)).userId userRepository.save(Users(userFirstName = "joe", type = UserType.MANAGER)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("type IN [ADMINISTRATOR, TEAM_MEMBER]").build() val users = userRepository.findAll(specification) Assertions.assertTrue(setOf(janeId, johnId) == users.map { user -> user.userId }.toSet()) @@ -1259,7 +1259,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "jane", updatedDateAt = LocalDate.parse("2020-01-15"))).userId userRepository.save(Users(userFirstName = "joe", updatedDateAt = LocalDate.parse("2021-01-10"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt IN ['2020-01-10', '2020-01-15']").build() val users = userRepository.findAll(specification) Assertions.assertTrue(setOf(janeId, johnId) == users.map { user -> user.userId }.toSet()) @@ -1278,7 +1278,7 @@ class SpringSearchApplicationTest { jane.addBook(janeBook) authorRepository.save(jane) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS EMPTY").build() val users = authorRepository.findAll(specification) Assertions.assertTrue(users.isEmpty()) @@ -1297,13 +1297,13 @@ class SpringSearchApplicationTest { jane.addBook(janeBook) authorRepository.save(jane) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("name IS EMPTY").build() Assertions.assertThrows( ResponseStatusException::class.java ) { authorRepository.findAll(specification) } val specification2 = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("name IS NOT EMPTY").build() Assertions.assertThrows( ResponseStatusException::class.java @@ -1320,7 +1320,7 @@ class SpringSearchApplicationTest { jane.name = "jane" authorRepository.save(jane) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS EMPTY").build() val users = authorRepository.findAll(specification) Assertions.assertTrue(users.size == 1) @@ -1338,7 +1338,7 @@ class SpringSearchApplicationTest { jane.name = "jane" authorRepository.save(jane) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS NOT EMPTY").build() val users = authorRepository.findAll(specification) Assertions.assertTrue(users.size == 1) @@ -1358,7 +1358,7 @@ class SpringSearchApplicationTest { jane.addBook(janeBook) authorRepository.save(jane) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS NOT EMPTY").build() val users = authorRepository.findAll(specification) Assertions.assertTrue(users.size == 2) @@ -1373,7 +1373,7 @@ class SpringSearchApplicationTest { jane.name = "jane" authorRepository.save(jane) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS NOT EMPTY").build() val users = authorRepository.findAll(specification) Assertions.assertTrue(users.size == 0) @@ -1387,13 +1387,13 @@ class SpringSearchApplicationTest { jane.name = "jane" authorRepository.save(jane) val spec = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS NULL").build() Assertions.assertThrows( ResponseStatusException::class.java ) { authorRepository.findAll(spec) } val specNotNull = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS NOT NULL").build() Assertions.assertThrows( ResponseStatusException::class.java @@ -1407,7 +1407,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", userChildrenNumber = 5)) userRepository.save(Users(userFirstName = "jean", userChildrenNumber = 10)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userChildrenNumber BETWEEN 4 AND 10").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1422,7 +1422,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", updatedDateAt = LocalDate.parse("2020-01-12"))) userRepository.save(Users(userFirstName = "jean", updatedDateAt = LocalDate.parse("2020-01-13"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt BETWEEN 2020-01-12 AND 2020-01-13").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1437,7 +1437,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", updatedDateAt = LocalDate.parse("2020-01-12"))) userRepository.save(Users(userFirstName = "jean", updatedDateAt = LocalDate.parse("2020-01-13"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt NOT BETWEEN 2020-01-12 AND 2020-01-13").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1452,7 +1452,7 @@ class SpringSearchApplicationTest { val joeId = userRepository.save(Users(userFirstName = "joe", updatedDateAt = LocalDate.parse("2020-01-12"))).userId val jeanId = userRepository.save(Users(userFirstName = "jean", updatedDateAt = LocalDate.parse("2020-01-13"))).userId val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt BETWEEN 2020-01-11 AND 2020-01-13 AND userId IN [$joeId, $jeanId]").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1467,7 +1467,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "connor")) userRepository.save(Users(userFirstName = "david")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName BETWEEN 'aaron' AND 'cyrano'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(3, users.size) @@ -1481,7 +1481,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "connor")) userRepository.save(Users(userFirstName = "david")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName NOT BETWEEN 'aaron' AND 'cyrano'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(1, users.size) @@ -1495,7 +1495,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "connor")) userRepository.save(Users(userFirstName = "david")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName > barry'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(3, users.size) @@ -1510,7 +1510,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "connor")) userRepository.save(Users(userFirstName = "david")) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName < barry'").build() val users = userRepository.findAll(specification) Assertions.assertEquals(1, users.size) @@ -1526,7 +1526,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "david")) // create spec with case sensitive flag val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", true) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName : A*").build() val users = userRepository.findAll(specification) Assertions.assertEquals(1, users.size) @@ -1537,32 +1537,32 @@ class SpringSearchApplicationTest { fun badRequestWithWrongSearch() { Assertions.assertThrows(ResponseStatusException::class.java) { SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName : ").build() } Assertions.assertThrows(ResponseStatusException::class.java) { SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt BETWEEN AND 2020-01-11").build() } Assertions.assertThrows(ResponseStatusException::class.java) { SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("updatedDateAt BETWEEN 2020-01-11 AND").build() } Assertions.assertThrows(ResponseStatusException::class.java) { SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS EMPT ").build() } Assertions.assertThrows(ResponseStatusException::class.java) { SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("books IS NOT EMPT ").build() } Assertions.assertThrows(ResponseStatusException::class.java) { SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userId IN [").build() } } @@ -1574,7 +1574,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", type = UserType.MANAGER)) userRepository.save(Users(userFirstName = "jean", type = null)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("type IS NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1589,7 +1589,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", type = UserType.MANAGER)) userRepository.save(Users(userFirstName = "jean", type = null)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("type IS NOT NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1604,7 +1604,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", type = UserType.MANAGER)) userRepository.save(Users(userFirstName = "jean", type = null)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", true, emptyArray()) ).withSearch("userFirstName IS NOT NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(4, users.size) @@ -1617,19 +1617,28 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "john", userSalary = 100.0F)) userRepository.save(Users(userFirstName = "jane", userSalary = 1000.0F)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("userSalary IS NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(0, users.size) } + @Test + fun canNotSearchABlackListedField() { + Assertions.assertThrows(ResponseStatusException::class.java) { + SpecificationsBuilder( + SearchSpec::class.constructors.first().call("", false, arrayOf("userFirstName")) + ).withSearch("userFirstName : A* AND userId : 3").build() + } + } + @Test fun canGetUsersWithUUIDNull() { val userUUID = UUID.randomUUID() userRepository.save(Users(userFirstName = "Diego", uuid = userUUID)) userRepository.save(Users(userFirstName = "Diego two", uuid = null)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("uuid IS NULL").build() val robotUsers = userRepository.findAll(specification) Assertions.assertEquals(1, robotUsers.size) @@ -1643,7 +1652,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", updatedDateAt = null)) userRepository.save(Users(userFirstName = "jean", updatedDateAt = null)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("updatedDateAt IS NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1658,7 +1667,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", updatedAt = null)) userRepository.save(Users(userFirstName = "jean", updatedAt = LocalDateTime.parse("2020-01-13T10:15:30"))) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("updatedAt IS NOT NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(3, users.size) @@ -1672,7 +1681,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", active = null)) userRepository.save(Users(userFirstName = "jean", active = null)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("active IS NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1686,7 +1695,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", userChildrenNumber = null)) userRepository.save(Users(userFirstName = "jean", userChildrenNumber = null)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("userChildrenNumber IS NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size) @@ -1700,7 +1709,7 @@ class SpringSearchApplicationTest { userRepository.save(Users(userFirstName = "joe", createdAt = null)) userRepository.save(Users(userFirstName = "jean", createdAt = null)) val specification = SpecificationsBuilder( - SearchSpec::class.constructors.first().call("", false) + SearchSpec::class.constructors.first().call("", false, emptyArray()) ).withSearch("createdAt IS NULL").build() val users = userRepository.findAll(specification) Assertions.assertEquals(2, users.size)