Syntaxe des filtres

Cette page explique la syntaxe que vous devez utiliser pour filtrer les comptes.

Syntaxe

Toutes les valeurs autres que des entiers doivent être placées entre guillemets doubles ("). Pour savoir quelles valeurs un champ spécifique accepte, consultez la documentation de référence pour ce champ.

Vous pouvez utiliser AND pour filtrer plusieurs champs dans la même requête. Vous pouvez également utiliser AND pour combiner plusieurs filtres relationship(...) et service(...). Voici un exemple qui combine plusieurs filtres relationship(...) et service(...) :

(relationship(service(type = "ACCOUNT_MANAGEMENT") AND service(handshakeState = "PENDING"))) OR (accountName = "store" AND relationship(...))

Cet exemple renvoie les comptes suivants :

  • Tous les comptes ayant une relation de gestion de compte avec un autre compte et une relation supplémentaire en attente d'acceptation.

  • Tous les comptes dont le nom à afficher est "store" et qui sont associés à d'autres comptes.

Vous ne pouvez pas utiliser AND pour filtrer plusieurs valeurs dans le même champ. Par exemple, vous ne pouvez pas utiliser accountName = "*A*" AND accountName = "*B*".

Vous pouvez utiliser OR pour filtrer deux champs dans la même requête. Encadrez les critères de filtre de chaque côté de l'opérateur OR avec des parenthèses. Exemple : (accountName = "storeA") OR (accountName = "storeB").

Vous ne pouvez utiliser OR que pour combiner deux champs. Par exemple, vous ne pouvez pas utiliser (accountName = "storeA") OR (accountName = "storeB") OR (accountName = "storeC").

Les parenthèses ne sont pas autorisées, sauf avec les opérateurs AND et OR, et dans les appels de fonction, comme relationship(...) et service(...).

Pour les champs de chaîne tels que accountName et accountIdAlias, vous pouvez filtrer les valeurs qui contiennent un certain mot ou une séquence de caractères en plaçant la séquence entre astérisques (*). Par exemple, accountName = "*foo*" renvoie tous les comptes dont le accountName contient foo, comme "storeFoo".

Vous pouvez filtrer les valeurs qui ne contiennent pas une certaine séquence à l'aide de != et *. Par exemple, accountName != "*foo*" renvoie tous les comptes dont le champ accountName ne contient pas foo.

Les espaces blancs supplémentaires sont ignorés. Par exemple, foo AND bar est identique à foo AND bar.

Voici quelques exemples de filtrage de comptes à l'aide de la méthode account.list :

"* Tous les sous-comptes CM contenant "Store"

accountName = "*store*" AND relationship(service(type = "ACCOUNT_AGGREGATION"))
  • Tous les comptes gérés par le fournisseur 123456
relationship(service(type = "ACCOUNT_MANAGEMENT") AND providerId = 123456)
  • Tous les comptes qui ont envoyé une invitation au fournisseur 123456 ou qui doivent accepter une invitation de ce fournisseur
relationship(service(handshakeState = "PENDING" AND type ="ACCOUNT_MANAGEMENT")
AND providerId = 123456)

Pour filtrer les comptes auxquels l'utilisateur qui envoie la requête peut accéder, utilisez la méthode google.shopping.merchant.accounts.v1.ListAccountsRequest, comme indiqué dans l'exemple suivant.

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);
  }
}

Spécification

Les filtres suivent un sous-ensemble de la spécification de filtre AIP et de sa grammaire EBNF formelle :

filter
    : accountFilterDisj
    | accountFilterConj

accountFilterDisj
    : "(" accountFilterConj " OR " accountFilterConj ")"
    ;
accountFilterConj
    : accountFilter {" AND " accountFilter}
    ;

accountFilter
    : accountNameFilter | capabilityFilter | relationshipFn
    ;

accountNameFilter
    : "accountName" comparator value
    ;

capabilityFilter
    : "capabilities:" capabilityValue
    | "-capabilities:" capabilityValue
    | "NOT capabilities:" capabilityValue
    ;
capabilityValue
    : "CAN_UPLOAD_PRODUCTS"
    ;

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"
    | "APPROVED"
    | "REJECTED"
    ;
serviceType
    : "ACCOUNT_AGGREGATION"
    | "ACCOUNT_MANAGEMENT"
    ;

comparator
    : " = " | " != "
    ;