GORM 中的标准构建

发布于 2024-11-15 14:23:29 字数 2154 浏览 4 评论 0原文

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 个操作符。

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)}
                        }
                    }
                }
            }

where params.filters is following JSON text.

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

This data is coming from JQuery data grid.

Is there a better way of doing this?
In the code I have just listed only 3 operators, but in real I have 14 operations.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

め七分饶幸 2024-11-22 14:23:29

您可以使用 String 作为 Criteria 操作,例如:

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

因此您可能会遇到类似的情况

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

,无论如何,您都需要清理 Web 提交的查询,以仅允许操作的子集。您不想接收结束执行任意sqlRestriction,对吧? :D 所以无论如何,代码都会比这更复杂。

注意:将 and{}or {} 包裹在单个语句周围没有意义,您需要将其放在整个 块周围如果-s。

You can use String as Criteria operation, like:

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

so you might come to something like

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

Anyway you'll need to sanitize the web-submitted query for only allowed subset of operations. You don't want to receive end execute arbitrary sqlRestriction, right? :D So the code is going to be more complex then this anyway.

Note: wrapping and{} or or {} around single statement has no point, you need to put it around whole block of if-s.

内心荒芜 2024-11-22 14:23:29

我建议您查看 FilterPane 插件的源代码。它的服务基本上完成您正在做的事情,并且可能会给您一些增强的想法。

I suggest that you have a look at the source code of the FilterPane plugin. Its service does essentially what you are doing and may give you some ideas for enhancements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文