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

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}