Construcción de criterios en Gorm
-
27-10-2019 - |
Pregunta
if (params.filters) {
def o = JSON.parse(params.filters);
def groupOp = o.groupOp
def fields = o.rules.field
def values = o.rules.data
def op = o.rules.op
println fields
println values
if(groupOp == "AND") {
fields.eachWithIndex {a, i ->
println op[i]
if(op[i].equals( "eq")) {
and{ eq(fields[i], values[i])}
}
if(op[i].equals("ne")) {
and{ ne(fields[i], values[i])}
}
if(op[i].equals("ge")) {
def valu = Double.valueOf( values[i]);
and{ ge(fields[i], valu)}
}
}
}
if(groupOp == "OR") {
fields.eachWithIndex {a, i ->
println op[i]
if(op[i].equals( "eq")) {
println 'eq';
or{ eq(fields[i], values[i])}
}
if(op[i].equals("ne")) {
println 'ne';
or{ ne(fields[i], values[i])}
}
if(op[i].equals("ge")) {
def valu = Double.valueOf( values[i]);
or{ ge(fields[i], valu)}
}
}
}
}
dónde params.filters
está siguiendo el texto JSON.
{
"groupOp":"OR",
"rules":[
{
"field":"foo1",
"op":"le",
"data":"9.5"
},
{
"field":"foo2",
"op":"eq",
"data":"12345-123"
},
{
"field":"foo3",
"op":"cn",
"data":"IDM"
}
]
}
Estos datos provienen de JQuery Data Grid.
¿Hay una mejor manera de hacer esto? En el código acabo de enumerar solo 3 operadores, pero en realidad tengo 14 operaciones.
Solución
Puede usar String como operación de criterios, como:
A.withCriteria {
'eq' (id, 1)
}
Entonces podrías llegar a algo como
A.withCriteria {
(groupOp) {
for (???) {
(op[i]) (fields[i], parsedVals[i])
}
}
}
De todos modos, deberá desinfectar la consulta enviada por web para un subconjunto de operaciones solo permitido. No quieres recibir FIN EXCUTE ARBITRARY sqlRestriction
, ¿Correcto? : D Entonces el código será más complejo que esto de todos modos.
Nota: envoltura and{}
o or {}
Alrededor de una sola declaración no tiene sentido, debe ponerlo en todo el bloque de Bloque de if
-s.
Otros consejos
Sugiero que eche un vistazo al código fuente del complemento FilterPane. Su servicio es esencialmente lo que está haciendo y puede darle algunas ideas para las mejoras.