Для некоторых list методов Merchant API, например account.list, можно настроить фильтрацию, чтобы получать только нужные результаты.
Чтобы отфильтровать результаты, используйте параметр filter с синтаксисом, определенным в грамматике EBNF. На этой странице рассказывается, как использовать синтаксис для фильтрации аккаунтов.
Синтаксис
Все значения, кроме целых чисел, должны быть заключены в двойные кавычки ("). Чтобы узнать, какие значения принимает определенное поле, ознакомьтесь с справочной документацией по этому полю.
С помощью оператора AND можно фильтровать данные по нескольким полям в одном запросе. Вы также можете использовать AND, чтобы объединить несколько фильтров relationship(...) и service(...).
Вот пример, в котором используются несколько фильтров relationship(...) и service(...):
(relationship(service(type = "ACCOUNT_MANAGEMENT") AND service(handshakeState = "PENDING"))) OR (accountName = "store" AND relationship(...))
В этом примере возвращаются следующие аккаунты:
Все аккаунты, связанные с другими аккаунтами, и аккаунты, в которых есть запросы на установление дополнительных связей, ожидающие подтверждения.
Все аккаунты с отображаемым именем
"store", связанные с другими аккаунтами.
С помощью AND нельзя фильтровать несколько значений в одном поле. Например, вы не можете использовать accountName = "*A*" AND accountName = "*B*".
С помощью оператора OR можно отфильтровать два поля в одном запросе. Заключите критерии фильтрации по обе стороны оператора OR в скобки. Пример:(accountName = "storeA") OR (accountName = "storeB").
Для объединения двух полей можно использовать только OR. Например, нельзя использовать значение (accountName = "storeA") OR (accountName = "storeB") OR (accountName =
"storeC").
Скобки разрешены только с операторами AND и OR, а также при вызове функций, например relationship(...) и service(...).
Для строковых полей, таких как accountName и accountIdAlias, можно отфильтровать значения, содержащие определенное слово или последовательность символов, заключив последовательность в звездочки (*). Например, accountName = "*foo*" вернет все аккаунты с полем accountName, содержащим foo, например "storeFoo".
Вы можете отфильтровать значения, которые не содержат определенную последовательность, с помощью !=
и *. Например, accountName != "*foo*" возвращает все аккаунты с accountName, в котором нет foo.
Лишние пробелы игнорируются. Например, foo AND bar и foo
AND bar – это одно и то же.
Ниже приведены примеры фильтрации аккаунтов с помощью метода account.list.
- Все дочерние аккаунты расширенного аккаунта, содержащие слово "Магазин":
accountName = "*store*" AND relationship(service(type = "ACCOUNT_AGGREGATION"))
- Все аккаунты, которыми управляет поставщик 123456:
relationship(service(type = "ACCOUNT_MANAGEMENT") AND providerId = 123456)
- Все аккаунты, которые отправили приглашение поставщику 123456 или должны принять приглашение от него:
relationship(service(handshakeState = "PENDING" AND type ="ACCOUNT_MANAGEMENT")
AND providerId = 123456)
Чтобы отфильтровать аккаунты, к которым у пользователя, отправившего запрос, есть доступ, используйте метод google.shopping.merchant.accounts.v1.ListAccountsRequest, как показано в следующем примере.
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.Account;
import com.google.shopping.merchant.accounts.v1.AccountsServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountsServiceClient.ListAccountsPagedResponse;
import com.google.shopping.merchant.accounts.v1.AccountsServiceSettings;
import com.google.shopping.merchant.accounts.v1.ListAccountsRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to filter the accounts the user making the request has access to. */
public class FilterAccountsSample {
public static void filterAccounts(Config config) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
AccountsServiceSettings accountsServiceSettings =
AccountsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (AccountsServiceClient accountsServiceClient =
AccountsServiceClient.create(accountsServiceSettings)) {
// Filter for accounts with display names containing "store" and a provider with the ID "123":
String filter = "accountName = \"*store*\" AND relationship(providerId = 123)";
// Filter for all subaccounts of account "123":
// String filter2 = "relationship(providerId = 123 AND service(type =
// \"ACCOUNT_AGGREGATION\"))";
// String filter3 = "relationship(service(handshakeState = \"APPROVED\" AND type =
// \"ACCOUNT_MANAGEMENT\") AND providerId = 123)";
ListAccountsRequest request = ListAccountsRequest.newBuilder().setFilter(filter).build();
System.out.println("Sending list accounts request with filter:");
ListAccountsPagedResponse response = accountsServiceClient.listAccounts(request);
int count = 0;
// Iterates over all rows in all pages and prints the sub-account
// in each row.
// `response.iterateAll()` automatically uses the `nextPageToken` and recalls the
// request to fetch all pages of data.
for (Account account : response.iterateAll()) {
System.out.println(account);
count++;
}
System.out.print("The following count of elements were returned: ");
System.out.println(count);
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
filterAccounts(config);
}
}
Спецификация
Фильтры соответствуют подмножеству спецификации фильтров AIP и ее формальной грамматике EBNF:
filter
: accountFilterDisj
| accountFilterConj
accountFilterDisj
: "(" accountFilterConj " OR " accountFilterConj ")"
;
accountFilterConj
: accountFilter {" AND " accountFilter}
;
accountFilter
: accountNameFilter | capabilityFilter | relationshipFn | accessFilter
;
accountNameFilter
: "accountName" comparator value
;
capabilityFilter
: "capabilities:" capabilityValue
| "-capabilities:" capabilityValue
| "NOT capabilities:" capabilityValue
;
capabilityValue
: "CAN_UPLOAD_PRODUCTS"
;
accessFilter
: "access = " accessType
;
accessType
: "DIRECT"
| "INDIRECT"
| "ALL"
;
relationshipFn
: "relationship(" relationshipConj ")"
;
relationshipConj
: relationshipFilter {" AND " relationshipFilter}
;
relationshipFilter
: "providerId = " numValue
| "accountIdAlias" comparator value
| serviceFn
;
serviceFn
: "service(" serviceConj ")"
;
serviceConj
: serviceFilter {" AND " serviceFilter}
;
serviceFilter
: "externalAccountId" comparator value
| "handshakeState = " handshakeState
| "type = " serviceType
;
handshakeState
: "PENDING"
| "WAITING"
| "ESTABLISHED"
| "REJECTED"
;
serviceType
: "ACCOUNT_AGGREGATION"
| "ACCOUNT_MANAGEMENT"
;
comparator
: " = "
| " != "
;