Filter sintaksis

Halaman ini menjelaskan sintaksis yang harus Anda gunakan untuk memfilter akun.

Sintaksis

Semua nilai selain bilangan bulat harus diapit tanda kutip ganda ("). Untuk mempelajari nilai yang diterima oleh kolom tertentu, lihat dokumentasi referensi untuk kolom tersebut.

Anda dapat menggunakan AND untuk memfilter beberapa kolom dalam kueri yang sama. Anda juga dapat menggunakan AND untuk menggabungkan beberapa filter relationship(...) dan service(...). Berikut contoh yang menggabungkan beberapa filter relationship(...) dan service(...):

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

Contoh ini menampilkan akun berikut:

  • Semua akun yang memiliki hubungan pengelolaan akun dengan akun lain, dan hubungan tambahan yang menunggu persetujuan.

  • Semua akun dengan nama tampilan "store", yang memiliki hubungan dengan akun lain.

Anda tidak dapat menggunakan AND untuk memfilter beberapa nilai dalam kolom yang sama. Misalnya, Anda tidak dapat menggunakan accountName = "*A*" AND accountName = "*B*".

Anda dapat menggunakan OR untuk memfilter dua kolom dalam kueri yang sama. Sertakan kriteria filter di setiap sisi operator OR dengan tanda kurung. Contohnya, (accountName = "storeA") OR (accountName = "storeB").

Anda hanya dapat menggunakan OR untuk menggabungkan dua kolom. Misalnya, Anda tidak dapat menggunakan (accountName = "storeA") OR (accountName = "storeB") OR (accountName = "storeC").

Tanda kurung tidak diizinkan selain dengan operator AND dan OR, dan dalam pemanggilan fungsi, seperti relationship(...) dan service(...).

Untuk kolom string seperti accountName dan accountIdAlias, Anda dapat memfilter nilai yang berisi kata atau urutan karakter tertentu dengan menyertakan urutan dalam tanda bintang (*). Misalnya, accountName = "*foo*" menampilkan semua akun dengan accountName yang berisi foo, seperti "storeFoo".

Anda dapat memfilter nilai yang tidak berisi urutan tertentu menggunakan != dan *. Misalnya, accountName != "*foo*" menampilkan semua akun dengan accountName yang tidak berisi foo.

Spasi kosong tambahan akan diabaikan. Misalnya, foo AND bar sama dengan foo AND bar.

Berikut beberapa contoh pemfilteran akun menggunakan metode account.list:

"* Semua sub-akun MCA yang berisi "Toko"

accountName = "*store*" AND relationship(service(type = "ACCOUNT_AGGREGATION"))
  • Semua akun yang dikelola oleh penyedia 123456
relationship(service(type = "ACCOUNT_MANAGEMENT") AND providerId = 123456)
  • Semua akun yang telah mengirim undangan ke penyedia 123456 atau perlu menerima undangan dari penyedia ini
relationship(service(handshakeState = "PENDING" AND type ="ACCOUNT_MANAGEMENT")
AND providerId = 123456)

Untuk memfilter akun yang dapat diakses oleh pengguna yang membuat permintaan, gunakan metode google.shopping.merchant.accounts.v1.ListAccountsRequest, seperti yang ditunjukkan dalam contoh berikut.

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

Spesifikasi

Filter mengikuti subset spesifikasi filter AIP, dan tata bahasa EBNF formalnya:

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
    : " = " | " != "
    ;