根据用户输入构建谓词

时间:2014-02-03 10:05:11

标签: java conditional-statements predicate boolean-logic boolean-expression

我有一个用java编写的应用服务器,必须根据请求上下文使用不同的机器学习模型。例如,我的请求上下文看起来像

 class RequestContext {
      String clientId;
      String experimentId;
      String sessionId;
      ...
 }

目前我有一个代表团逻辑:

 if(requestContext.experimentId == "experiment1"
    && requestContext.clientId == "client1"
 ){
   // use model #1
 } else if(requestContext.experimentId == "experiment2"
           && requestContext.clientId == "client1"){
   // use model #2
 } ...

我可以使用guava的谓词来表达这些规则,并在匹配时委托给相应的模型。作为第二步,我想将这些从服务器代码中移出到外部配置存储,并让服务器定期从中读取。这使我不必每次更改委派规则时都必须部署服务器代码。此外,我可以编写一个UI,让业务用户定义条件和模型使用。

我的想法是首先指定一个可用的条件列表(在本例中为clientId,experimentId和sessionId),并允许用户编写一个简单的类似java的脚本来创建条件,例如,一个人会写

 clientId == "client1" && (sessionId != "session1" || experimentId == "experiment1")

然后指定在满足此条件时使用的模型。哪些库/技术可以帮助我将用户指定的谓词逻辑解析为类似番石榴谓词的对象?

1 个答案:

答案 0 :(得分:0)

final Pattern client_pattern = Pattern.compile("clientId\\s+==\\s+\"(.*?)\"");
Function<String, RequestContext> = new Function<String, RequestContext>() {
    public RequestContext apply(String s) {
        Matcher client_matcher = client_pattern.matcher(s);
        String client_id = client_matcher.find() ? client_matcher.group(1) : null;
        // similarly for experiment id and session id
        return new RequestContext(client_id, exp_id, session_id);
    }
};

解析。现在你有了请求上下文,guava谓词很简单:

Predicate<RequestContext> pred_1 = new Predicate<RequestContext>() {
    public boolean apply(RequestContext rc) {
        return rc.clientId.equals("client1") && rc.experimentId.equals("experiment1");
    }
};

您还可以编写更简单的原子谓词,然后使用Predicates#and将它们组合起来。