Критерии построения в ГОРМ - PullRequest
0 голосов
/ 14 июня 2011
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)}
                        }
                    }
                }
            }

, где params.filters соответствует тексту JSON.

    {
   "groupOp":"OR",
   "rules":[
      {
         "field":"foo1",
         "op":"le",
         "data":"9.5"
      },
      {
         "field":"foo2",
         "op":"eq",
         "data":"12345-123"
      },
      {
         "field":"foo3",
         "op":"cn",
         "data":"IDM"
      }
   ]
}

Эти данные поступают из сетки данных JQuery.

Есть ли лучший способ сделать это?В коде я только перечислил только 3 оператора, но на самом деле у меня 14 операций.

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Вы можете использовать String as Criteria, например:

A.withCriteria {
  'eq' (id, 1)
}

, чтобы вы могли получить что-то вроде

A.withCriteria {
    (groupOp) {
        for (???) {
            (op[i]) (fields[i], parsedVals[i])
        }
    }
}

В любом случае вам нужно будет санировать отправленный в Интернете запростолько для разрешенного подмножества операций.Вы не хотите получать end execute произвольно sqlRestriction, верно?: D Так что в любом случае код будет более сложным, чем этот.

Примечание : перенос and{} или or {} вокруг одного оператора не имеет смысла, его нужно обойтицелый блок if -с.

1 голос
/ 14 июня 2011

Я предлагаю вам взглянуть на исходный код плагина FilterPane. Его сервис в основном делает то, что вы делаете, и может дать вам некоторые идеи для улучшения.

...