运行时高效的公式绑定

时间:2013-01-11 15:06:56

标签: java runtime formula jvm-languages

我的UI的一个元素是一个表格,其中显示了按类别汇总的项目列表,以及一些公式(请参阅下面的目标输出)。

允许用户将单元格绑定到类似电子表格的公式的最佳方法是什么?

  • 性能:实际数据频繁变化,表格大而公式复杂,因此性能和CPU使用率都是一个问题。
  • 易于配置(假设配置由开发人员完成,因此可能涉及编程)
  • 配置的可维护性

到目前为止我设想的方法:

  1. 使用Java Scripting API但我宁愿坚持使用基于JVM的方法以获得更好的性能
  2. 创建一个interface Formula { double calculate(); }并在运行时生成,编译和加载实现 - 允许JIT编译生成的方法
  3. 与2相同但使用另一种基于JVM的语言,例如clojure,它允许简单的动态编译并具有非常适合的功能方法(map / reduce有助于下面的平均和总和计算) - 不确定性能影响。
  4. 哪种方法更有意义?我还应该考虑其他任何解决方案或库吗?


    示例

    为了让目标更清晰,这是一个人为的例子 - 我们假设表中的项目是:

    public class Item() {
        public String category;
        public String name;
        public int quantity;
        public double price;
    }
    

    目标输出

    Category     Name        Quantity    Price (avg)     Value (sum)
    All                                      82            1,090
    
    Bikes                                    45              650
                 Bike 1         10           40              400
                 Bike 2          5           50              250
    
    Cars                                    120              440
                 Car 1           3          100              300
                 Car 2           1          140              140
    

    列配置

    列可以这样定义:

    Column #      Formula
        1         item.name;
        2         item.quantity;
        3         item.price;
        4         Math.abs(column_2 * column_3); //calls a JDK method
    

    汇总配置

    汇总类别和汇总公式可以这样定义:

    AGGREGATION #1: Category cat = item.category();
    Column #      Formula
        1         cat;
        2         "";
        3         thisColumn.filter(cat).items().average(); //utility method
        //this one is more complex
        4         { double sum = 0;
                    for (double value : thisColumn.filter(cat).items())
                        sum += value;
                    return sum;
                  }
    

1 个答案:

答案 0 :(得分:0)

我使用用户可以使用的自定义域特定语言,让ANTLR在java中生成一个本机解析器,将表达式解析为可执行函数。

参见例如http://arcanecoder.blogspot.be/2008/04/using-antlr-to-create-excel-like.html表示执行类似操作的示例,或http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator表示更近期的操作。

您可以定义'sum','average'等函数,并将其映射到自定义java代码,并使用例如$ 1或$ {name}让他们引用属性。

您只定义了您希望用户使用的那些功能,因此他们不能使用通用脚本语言中可用的任何有害功能。