סינון תחביר

דף זה מסביר את התחביר שבו יש להשתמש כדי לסנן חשבונות.

תחביר

כל הערכים מלבד מספרים שלמים צריכים להיות מוקפים במירכאות כפולות ("). על מנת לדעת אילו ערכים מקבל שדה מסוים, עיינו במסמכי התיעוד של השדה הזה.

אפשר להשתמש ב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.

מפרט

המסננים פועלים לפי קבוצת משנה של המפרט של מסנן 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
    | "callerHasAccessToProviderFilter()"
    | "externalAccountId" comparator value
    | "accountIdAlias" comparator value
    | serviceFn
    ;
serviceFn
    : "service(" serviceConj ")"
    ;
serviceConj
    : serviceFilter {" AND " serviceFilter}
    ;
serviceFilter
    : handshakeStateFilter
    | typeFilter
    ;
handshakeStateFilter
    : "handshakeState = " value
    ;
typeFilter
    : "type = " value
    ;
comparator
    : " = " | " != "
    ;