論理 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...) をすべて書き直さなくても、どうすればよいでしょうか?