谓词Java OR问题

时间:2013-11-29 17:33:15

标签: java predicate predicatebuilder

我有一些麻烦来实现我需要的东西。

代码优于文字: 这是我设置谓词的地方,它是在DBManager中添加FilterRow。 我想要的是获得ID为64和61的所有会员条目。 我的问题是,我只是得到ID为61的id。

PredicateManager    pred = new PredicateManager();      
String[]            nameColumn = new String[]{"id", "id"};      
String[]            criteria = new String[]{"eq", "eq"};        
Comparable<?>[]     min = new Comparable[]{61, 64};     
Comparable<?>[]     max = new Comparable[]{0, 0};       
Predicate           test = new PredicateORImpl(min, max, null, nameColumn, criteria);

pred.addFilter("Filtre 1", test);
members = facade.read("resources/XML/member.xml", pred);
for (int i = 0 ; i < members.size(); i++) {
    AbstractMember maValeur = members.get(i);
    System.out.println(maValeur.toString());
}

这是我的Predicate经理,如果我需要几个谓词:

private Map<String,Predicate>               filters;

@Override
public boolean                              evaluate(RowSet rs) {
    boolean isOk = true;
    for (Predicate predicate : filters.values()){
        isOk = predicate.evaluate(rs);
    }
    return isOk;
}

这是我的谓词实施​​:

@Override
public boolean                              evaluate(RowSet rs) {
    try {
        boolean isOk = true;
        int rowNb = (row != null) ? row.length : rowName.length;
        for (int i = 0; i < rowNb && isOk; i++) {
            switch (criteria[i]) {
            case "eq":
                isOk &= equal(rs.getObject(rowName[i]), rowName[i]);
                break;
            case "gt":
                isOk &= greaterThan(rs.getObject(rowName[i]), rowName[i]);
                break;
            case "lt":
                isOk &= lessThan(rs.getObject(rowName[i]), rowName[i]);
                break;
            case "ge":
                isOk &= greaterOrEqualThan(rs.getObject(rowName[i]), rowName[i]);
                break;
            case "le":
                isOk &= lessOrEqualThan(rs.getObject(rowName[i]), rowName[i]);
                break;
            case "between":
                isOk &= between(rs.getObject(rowName[i]), rowName[i]);
                break;
            default: break;
            }
        }
        return isOk;
    }
    catch(SQLException sqle) { return false; }
}

private boolean                             equal(Object value, String columnName) {
    int column = Arrays.asList(rowName).indexOf(columnName);
    Comparable min = this.min[column];
    return (min.compareTo(value) == 0);
}

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

  

我的所有成员条目的ID等于64和61

我怀疑问题是您需要ID为64或61的记录.ID不能同时为64和61.

通过尝试在同一个字段上放置两个冲突的条件,您将第一个替换为第二个。

我建议你对表达式的每个元素都有一个谓词,比如树。 e.g。

interface Predicate<T> {
    boolean test(T t);
}

class EqualsColumnPredicate implement Predicate<ResultSet> {
    final String columnName;
    final Object value;
    // create a constructor to set these

    public boolean test(ResultSet rs) {
         return rs.getObject(columnName).equals(value); // TODO check for nulls
    }
}

class OrPredicate<T> implements Predicate<T> {
    final Prediate<T>[] preciates;
    // create a constructor for this field
    public boolean test(T t) {
         for(Predicate<T> p : predicates)
             if(p.test(t)) return true;
        return false;
    }
}

Predicate<T> where = new OrPredicate<ResultSet>(
   new EqualsColumnPredicate("column", 64),
   new EqualsColumnPredicate("column", 61));

while(rs.next())
   if (where.test(rs))
       // found !!