بنية الفلتر

توضّح هذه الصفحة بنية الجملة التي يجب استخدامها لفلترة الحسابات.

البنية

يجب إحاطة جميع القيم غير الصحيحة بعلامات اقتباس مزدوجة ("). وللاطّلاع على القيم التي يقبلها حقل معيّن، اطّلِع على مستندات المراجع الخاصة بهذا الحقل.

يمكنك استخدام 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 لفلترة حقلين في الاستعلام نفسه. احط معايير filtering بكل جانب من عامل التشغيل 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.

لفلترة الحسابات التي يمكن للمستخدم الذي يقدّم الطلب الوصول إليها، يمكنك استخدام الطريقة google.shopping.merchant.accounts.v1beta.ListAccountsRequest ، كما هو موضّح في العيّنة التالية.

Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1beta.Account;
import com.google.shopping.merchant.accounts.v1beta.AccountsServiceClient;
import com.google.shopping.merchant.accounts.v1beta.AccountsServiceClient.ListAccountsPagedResponse;
import com.google.shopping.merchant.accounts.v1beta.AccountsServiceSettings;
import com.google.shopping.merchant.accounts.v1beta.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
    : displayNameFilter | relationshipFn
    ;
displayNameFilter
    : "displayName" comparator value
    ;
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
    : " = " | " != "
    ;