סינון תחביר

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

תחביר

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

אפשר להשתמש ב-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
    : " = " | " != "
    ;