نحو فیلتر

این صفحه سینتکسی را که باید برای فیلتر کردن حساب‌ها استفاده کنید، توضیح می‌دهد.

نحو

تمام مقادیر غیر از اعداد صحیح باید داخل علامت نقل قول (") قرار گیرند. برای اطلاع از اینکه یک فیلد خاص چه مقادیری را می‌پذیرد، به مستندات مرجع آن فیلد مراجعه کنید.

شما می‌توانید 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 آورده شده است:

* همه حساب‌های فرعی MCA حاوی «فروشگاه»

accountName = "*store*" AND relationship(service(type = "ACCOUNT_AGGREGATION"))
  • همه حساب‌هایی که توسط ارائه‌دهنده ۱۲۳۴۵۶ مدیریت می‌شوند
relationship(service(type = "ACCOUNT_MANAGEMENT") AND providerId = 123456)
  • همه حساب‌هایی که دعوت‌نامه‌ای به ارائه‌دهنده ۱۲۳۴۵۶ ارسال کرده‌اند یا نیاز به پذیرش دعوت‌نامه از این ارائه‌دهنده دارند
relationship(service(handshakeState = "PENDING" AND type ="ACCOUNT_MANAGEMENT")
AND providerId = 123456)

برای فیلتر کردن حساب‌هایی که کاربر درخواست‌دهنده می‌تواند به آنها دسترسی داشته باشد، از متد google.shopping.merchant.accounts.v1.ListAccountsRequest استفاده کنید، همانطور که در نمونه زیر نشان داده شده است.

جاوا

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
    ;

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

comparator
    : " = " | " != "
    ;