Criteri che costruiscono a Gorm
-
27-10-2019 - |
Domanda
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)}
}
}
}
}
dove params.filters
sta seguendo il testo JSON.
{
"groupOp":"OR",
"rules":[
{
"field":"foo1",
"op":"le",
"data":"9.5"
},
{
"field":"foo2",
"op":"eq",
"data":"12345-123"
},
{
"field":"foo3",
"op":"cn",
"data":"IDM"
}
]
}
Questi dati provengono da JQuery Data Grid.
C'è un modo migliore per farlo? Nel codice ho appena elencato solo 3 operatori, ma in realtà ho 14 operazioni.
Soluzione
È possibile utilizzare la stringa come operazione di criteri, come:
A.withCriteria {
'eq' (id, 1)
}
Quindi potresti venire a qualcosa di simile
A.withCriteria {
(groupOp) {
for (???) {
(op[i]) (fields[i], parsedVals[i])
}
}
}
Ad ogni modo dovrai disinfettare la query consumata per il Web solo per il sottoinsieme consentito di operazioni. Non vuoi ricevere Execute Execute Arbitrary sqlRestriction
, Giusto? : D Quindi il codice sarà comunque più complesso di questo.
Nota: avvolgimento and{}
o or {}
Intorno a una singola dichiarazione non ha senso, è necessario metterlo in tutto il blocco di if
-S.
Altri suggerimenti
Ti suggerisco di dare un'occhiata al codice sorgente del plug -in Filterpane. Il suo servizio fa essenzialmente ciò che stai facendo e può darti alcune idee per i miglioramenti.