1

論理 OR を使用してコンテナを複数の値でフィルタリングしたいソリューションを探しています。

たとえば、値をフィルタリングして、値 == "A" または "B" の結果を取得したいと考えています。

このコードは、値が 1 つしかない場合に機能します。

private void applyTextFilters(List<String> filters)
{
    unselectAllItems();

    IndexedContainer container = (IndexedContainer) valuesTable.getContainerDataSource();
    container.removeContainerFilters(Columns.SEARCH.id());

    for (String filter : filters) {
        container.addContainerFilter(Columns.SEARCH.id(), filter, true, false);
    }

    clinicalValuesGraph.refreshGraph(container, getLabel("clinicalvalues.graph.caption"));
    // if it is the case ...
    //toggleEmptyResultNotification();
    handleView(viewMode);
}

私は何が欠けていますか?繰り返しますが、コードに 2 つのフィルター (「A」、「B」) がある場合、結果は表示されませんが、「A」を渡すと機能します。

私の質問を続けるために...

6.5.7 を使用して、"patrick" または "john" などの検索名のように、2 つの基準でコンテナーをフィルター処理する必要があります。

私はコードを調べましたが、これはメソッド(保護されている)を変更する必要がある場所です:

protected boolean passesFilters(Object itemId) {
    IndexedContainerItem item = new IndexedContainerItem(itemId);
    if (filters == null) {
        return true;
    }
    final Iterator<Filter> i = filters.iterator();
    while (i.hasNext()) {
        final Filter f = i.next();
        if (!f.passesFilter(item)) {
            return false;
        }
    }
    return true;
}

これに:

protected boolean passesFilters(Object itemId) {
    IndexedContainerItem item = new IndexedContainerItem(itemId);
    if (filters == null) {
        return true;
    }
    boolean previouslyPassedFilter = false;
    boolean PassesFilter = true;

    final Iterator<Filter> i = filters.iterator();
    while (i.hasNext()) {
        final Filter f = i.next();
        if (!f.passesFilter(item) && !previouslyPassedFilter) {
            passesFilter = false;
        } else {
            previouslyPassedFilter = true;
        }
    }
    return passesFilter ;
}

これらのクラス (IndexedContainer、IndexContainerItem...) をすべて書き直さなくても、どうすればよいでしょうか?

4

0 に答える 0