I trying to build dynamic filters using findAll on a list. I have a variable that needs to be included in the filter only if not null.
@Test void testSample(){ def list = [ new Employee(age:22, isManager:false), new Employee(age:23, isManager:true), new Employee(age:22, isManager:true) ] as Set def var = 22; String query1 = "it.age == var && it.isManager == true " String query2 = "it.isManager == true" println list println list.findAll { var ? query1 : query2 } // Should give 1 record age = 22 and manager var = null; println list.findAll { var ? query1 : query2 } // should give 2 records-only manager }
Both of them giving all the records. Is there anyway I can achieve this in one condition without need to write muiltiple queries ?
Looking some like below (this doesn't work though)
println list.findAll{ if(var) it.age == var && it.isManager == true }
Try with Closures rather than Strings describing what you want to do:
def list = [ new Employee(age:22, isManager:false), new Employee(age:23, isManager:true), new Employee(age:22, isManager:true) ] as Set def var = 22; Closure query1 = { it.age == var && it.isManager == true } Closure query2 = { it.isManager == true } println list println list.findAll( var ? query1 : query2 ) // Should give 1 record age = 22 and manager var = null; println list.findAll( var ? query1 : query2 ) // should give 2 records-only manager
Do you mean:
println list.findAll{ ( var ? it.age == var : true ) && it.isManager == true }
Or better:
println list.findAll{ ( var != null ? it.age == var : true ) && it.isManager == true }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With