この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

Apex Connector Framework の複合検索条件

検索条件には子検索条件を設定でき、子は subfilters プロパティに保存されます。

検索条件に子がある場合、検索条件 type は次のいずれかである必要があります。

検索条件種別 説明
AND_ すべてのサブ条件に一致するすべての行が返されます。
OR_ いずれかのサブ条件に一致するすべての行が返されます。
NOT_ この検索条件は、子検索条件が行を評価する方法を逆にします。この種別の検索条件にはサブ条件を 1 つしか設定できません。

次のサンプルコードは、複合検索条件の処理方法を示しています。

1override global DataSource.TableResult query(DataSource.QueryContext context) {
2    // Call out to an external data source and retrieve a set of records.
3    // We should attempt to get as much information as possible about the 
4    // query from the QueryContext, to minimize the number of records 
5    // that we return.
6    List<Map<String,Object>> rows = retrieveData(context);
7    
8    // This only filters the results. Anything in the query that we don’t 
9    // currently support, such as aggregation or sorting, is ignored.
10    return DataSource.TableResult.get(context, postFilterRecords(
11        context.tableSelection.filter, rows));
12}
13
14private List<Map<String,Object>> retrieveData(DataSource.QueryContext context) {
15    // Call out to an external data source. Form the callout so that
16    // it filters as much as possible on the remote site,
17    // based on the parameters in the QueryContext.
18    return ...;
19}
20
21private List<Map<String,Object>> postFilterRecords(
22    DataSource.Filter filter, List<Map<String,Object>> rows) {
23    if (filter == null) {
24        return rows;
25    }
26    DataSource.FilterType type = filter.type;
27    List<Map<String,Object>> retainedRows = new List<Map<String,Object>>();
28    if (type == DataSource.FilterType.NOT_) {
29        // We expect one Filter in the subfilters.
30        DataSource.Filter subfilter = filter.subfilters.get(0);
31        for (Map<String,Object> row : rows) {
32            if (!evaluate(filter, row)) {
33                retainedRows.add(row);
34            }
35        }
36        return retainedRows;
37    } else if (type == DataSource.FilterType.AND_) {
38        // For each filter, find all matches; anything that matches ALL filters 
39        // is returned.
40        retainedRows = rows;
41        for (DataSource.Filter subfilter : filter.subfilters) {
42            retainedRows = postFilterRecords(filter, retainedRows);
43        }
44        return retainedRows;
45    } else if (type == DataSource.FilterType.OR_) {
46        // For each filter, find all matches. Anything that matches 
47        // at least one filter is returned.
48        for (DataSource.Filter subfilter : filter.subfilters) {
49            List<Map<String,Object>> matchedRows = postFilterRecords(
50                subfilter, rows);
51            retainedRows.addAll(matchedRows);
52        }
53        return retainedRows;
54    } else {
55        // Find all matches for this filter in our collection of records.
56        for (Map<String,Object> row : rows) {
57            if (evaluate(filter, row)) {
58                retainedRows.add(row);
59            }
60        }
61        return retainedRows;
62    }
63}
64
65private Boolean evaluate(DataSource.Filter filter, Map<String,Object> row) {
66    if (filter.type == DataSource.FilterType.EQUALS) {
67        String columnName = filter.columnName;
68        Object expectedValue = filter.columnValue;
69        Object foundValue = row.get(columnName);
70        return expectedValue.equals(foundValue);
71    } else {
72        // Throw an exception; implementing other filter types is left
73        // as an exercise for the reader.
74        throwException('Unexpected filter type: ' + filter.type);
75    }
76    return false;
77}