Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Groovy filter criteria on findAll on a list

Tags:

groovy

findall

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         } 
like image 233
Kiran Chitturi Avatar asked Aug 08 '13 21:08

Kiran Chitturi


1 Answers

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 

Edit

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 } 
like image 150
tim_yates Avatar answered Oct 02 '22 20:10

tim_yates