يعمل هذا المستند كمرجع موحّد لمستندات واجهة برمجة التطبيقات الخاصة بلغة التعبير الشائعة (CEL). تعرض هذه الصفحة جميع وحدات الماكرو والمعاملات والدوال العادية، مع توضيح تواقيعها وسلوكياتها وحالة توفّرها في جميع حِزم CEL الرسمية.
لمزيد من التفاصيل حول سلوك اللغة ومواصفاتها، يُرجى الرجوع إلى تعريف لغة CEL.
إصدارات الحزمة
يستند هذا المستند المرجعي إلى الإصدارات التالية من حِزم CEL:
- CEL Go: الإصدار
v0.29.2(والإصدارات الأحدث) - CEL C++:
v0.15.0 - CEL Java:
v0.13.1 - CEL Python:
v0.1.3 - CEL C: لقطة تطوير (لم يتم إصدارها)
مرايا GitHub
يتم عرض عمليات التنفيذ الرسمية للغة CEL على GitHub ضمن مؤسسة cel-expr:
1. وحدات الماكرو الأساسية
هذه وحدات ماكرو مضمّنة يتم توسيعها في وقت الترجمة البرمجية.
| وحدة الماكرو | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
has(container.field) |
تختبر هذه الدالة ما إذا كان حقل معيّن متوفّرًا في رسالة أو مفتاح في خريطة. التوقيعات: has(container.field) -> boolأمثلة: has(request.auth.claims.email) |
✓ | ✓ | ✓ | ✓ | ✓ |
list.all(var, predicate) |
تختبر هذه الدالة ما إذا كانت جميع العناصر في القائمة تستوفي شرطًا معيّنًا. التوقيعات: list.all(var, predicate) -> boolأمثلة: [1, 2, 3].all(x, x > 0) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.exists(var, predicate) |
تختبر هذه الدالة ما إذا كان عنصر واحد على الأقل في القائمة يستوفي شرطًا. التوقيعات: list.exists(var, predicate) -> boolأمثلة: [1, 2, 3].exists(x, x > 2) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.exists_one(var, predicate) |
تختبر ما إذا كان عنصر واحد فقط في القائمة يستوفي شرطًا. التوقيعات: list.exists_one(var, predicate) -> boolأمثلة: [1, 2, 3].exists_one(x, x == 2) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.filter(var, predicate) |
تفلتر هذه الدالة عناصر القائمة وفقًا لدالة منطقية. التوقيعات: list.filter(var, predicate) -> listأمثلة: [1, 2, 3].filter(x, x > 1) // [2, 3] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.map(var, transform) |
تحوّل كل عنصر في القائمة باستخدام تعبير. التوقيعات: list.map(var, transform) -> listأمثلة: [1, 2, 3].map(x, x * 2) // [2, 4, 6] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.map(var, filter, transform) |
تحويل عناصر القائمة التي تستوفي شرط الفلتر. التوقيعات: list.map(var, filter, transform) -> listأمثلة: [1, 2, 3].map(x, x > 1, x * 2) // [4, 6] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
¹ يتم توفير الدعم في وقت تشغيل C لأنّه يتم توسيع وحدات الماكرو إلى عبارات أثناء التجميع بواسطة المجمّع المضيف.
2. عوامل التشغيل الأساسية
| عامل التشغيل | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
الحساب (+، -، *، /، %) |
عمليات حسابية عادية النفي (-x) والهوية (+x). يمكن دمج القوائم (list + list) في Go وC++ وJava وPython.التواقيع: T + T -> TT - T -> TT * T -> TT / T -> TT % T -> T-T -> T+T -> Tlist + list -> listأمثلة: 1 + 2 * 3 // 7[1] + [2] // [1, 2] |
✓ | ✓ | ✓ | ✓ | ✓² |
المقارنة (==، !=، <، <=، >، >=) |
المقارنة العادية تكون المقارنات الرقمية غير متجانسة (مثل 1 == 1.0).التوقيعات: T == T -> boolT != T -> boolT < T -> boolT <= T -> boolT > T -> boolT >= T -> boolأمثلة: x < 42.01 == 1.0 // true |
✓ | ✓ | ✓ | ✓ | ✓ |
المنطقية (!، &&، ||، ? :) |
Logical NOT وAND وOR وTernary Conditional استخدِم التقييم المختصر. التواقيع: !bool -> boolbool && bool -> boolbool || bool -> boolbool ? T : T -> Tأمثلة: x > 0 ? "positive" : "non-positive" |
✓ | ✓ | ✓ | ✓ | ✓ |
الفهرسة ([]) |
الوصول إلى عنصر في قائمة حسب الفهرس أو مفتاح البحث في خريطة التوقيعات: list[int] -> Tmap[K] -> Vأمثلة: tags[0]users['john'] |
✓ | ✓ | ✓ | ✓ | ✓ |
الاشتراك (in) |
للتحقّق مما إذا كان العنصر في قائمة أو المفتاح في خريطة التوقيعات: T in list -> boolK in map -> boolأمثلة: 'admin' in roles |
✓ | ✓ | ✓ | ✓ | ✓ |
² لا تتوافق عملية ربط القوائم (list + list) مع وقت تشغيل C،
على الرغم من أنّ عوامل التشغيل الحسابية الأخرى متوافقة.
3- الوظائف الأساسية
الدوال العامة ودوال السلاسل
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
size |
تعرض هذه الدالة حجم سلسلة (أحرف) أو وحدات بايت أو قائمة أو خريطة. التواقيع: size(T) -> int (حيث T هي string أو bytes أو list أو map)<br /><br />**Examples:**<br />size("hello") // 5` |
✓ | ✓ | ✓ | ✓ | ✓ |
contains |
تعرض هذه الدالة ما إذا كانت السلسلة تحتوي على سلسلة فرعية. التوقيعات: string.contains(string) -> boolأمثلة: "hello".contains("ell") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
startsWith |
تعرِض ما إذا كانت السلسلة تبدأ بالبادئة. التواقيع: string.startsWith(string) -> boolأمثلة: "hello".startsWith("he") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
endsWith |
تعرِض ما إذا كانت السلسلة تنتهي باللاحقة. التواقيع: string.endsWith(string) -> boolأمثلة: "hello".endsWith("lo") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
matches |
تعرض هذه الدالة ما إذا كانت السلسلة تطابق التعبير العادي RE2. التوقيعات: string.matches(string) -> boolأمثلة: "123".matches(r"^\d+$") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
وظائف أداة اختيار التاريخ والوقت
تستخرج هذه الدوال مكوّنات من google.protobuf.Timestamp أو google.protobuf.Duration.
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
getFullYear |
تعرض هذه الدالة السنة المكوّنة من 4 أرقام. التوقيعات: timestamp.getFullYear([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getFullYear() // 2026 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMonth |
تعرض هذه الدالة الشهر (من 0 إلى 11). التوقيعات: timestamp.getMonth([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getMonth() // 6 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfMonth |
تعرض هذه الدالة اليوم من الشهر (من 1 إلى 31). التوقيعات: timestamp.getDayOfMonth([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getDayOfMonth() // 23 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfWeek |
تعرض هذه الدالة اليوم من الأسبوع (0 = الأحد). التوقيعات: timestamp.getDayOfWeek([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getDayOfWeek() // 4 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfYear |
تعرض هذه الدالة اليوم من السنة (من 0 إلى 365). التوقيعات: timestamp.getDayOfYear([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getDayOfYear() // 203 |
✓ | ✓ | ✓ | ✓ | ✗ |
getHours |
تعرض هذه الدالة الساعات (من 0 إلى 23). التوقيعات: timestamp.getHours([tz]) -> intduration.getHours() -> intأمثلة: duration("1h30m").getHours() // 1 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMinutes |
تعرض هذه الدالة الدقائق (من 0 إلى 59). التوقيعات: timestamp.getMinutes([tz]) -> intduration.getMinutes() -> intأمثلة: duration("1h30m").getMinutes() // 30 |
✓ | ✓ | ✓ | ✓ | ✗ |
getSeconds |
تعرِض هذه الدالة الثواني (من 0 إلى 59). التوقيعات: timestamp.getSeconds([tz]) -> intduration.getSeconds() -> intأمثلة: duration("1h30m45s").getSeconds() // 45 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMilliseconds |
تعرض هذه الدالة قيمة الملّي ثانية (من 0 إلى 999). التوقيعات: timestamp.getMilliseconds([tz]) -> intduration.getMilliseconds() -> intأمثلة: duration("1.5s").getMilliseconds() // 500 |
✓ | ✓ | ✓ | ✓ | ✗ |
تحويل الأنواع
| نوع الاستهداف | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
bool |
تحويل إلى قيمة منطقية التوقيعات: bool(bool) -> boolbool(string) -> boolأمثلة: bool("true") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
bytes |
تحويل إلى وحدات بايت التوقيعات: bytes(bytes) -> bytesbytes(string) -> bytesأمثلة: bytes("hello") // b"hello" |
✓ | ✓ | ✓ | ✓ | ✓ |
double |
تحويل إلى عدد فاصل عائم للدقة المزدوجة التواقيع: double(double) -> doubledouble(int) -> doubledouble(uint) -> doubledouble(string) -> doubleأمثلة: double(1) // 1.0 |
✓ | ✓ | ✓ | ✓ | ✓ |
duration |
تحويل إلى مدة التوقيعات: duration(duration) -> durationduration(string) -> durationأمثلة: duration("1.5s") // 1.5s duration |
✓ | ✓ | ✓ | ✓ | ✓ |
int |
تحويل إلى عدد صحيح بعلامة 64 بت التوقيعات: int(int) -> intint(uint) -> intint(double) -> int (يتم التقريب إلى صفر)int(string) -> intint(timestamp) -> int (الثواني منذ بداية الحقبة)أمثلة: int(1.5) // 1 |
✓ | ✓ | ✓ | ✓ | ✓ |
string |
يتم التحويل إلى سلسلة. التواقيع: string(T) -> string (يتوافق مع bool وint وuint وdouble وbytes وtimestamp وduration)<br /><br />**Examples:**<br />string(1.5) // "1.5"` |
✓ | ✓ | ✓ | ✓ | ✓ |
timestamp |
تحويل إلى طابع زمني التوقيعات: timestamp(timestamp) -> timestamptimestamp(string) -> timestamp (RFC3339)أمثلة: timestamp("2026-07-23T00:00:00Z") |
✓ | ✓ | ✓ | ✓ | ✓ |
uint |
تحويل إلى عدد صحيح غير موقّع 64 بت التواقيع: uint(uint) -> uintuint(int) -> uintuint(double) -> uintuint(string) -> uintأمثلة: uint(1) // 1u |
✓ | ✓ | ✓ | ✓ | ✓ |
dyn |
تحويل القيمة إلى نوع ديناميكي للتحقّق من النوع التوقيعات: dyn(T) -> dynأمثلة: dyn([1, "two"]) |
✓ | ✓ | ✓ | ✓ | ✗ |
type |
تعرض هذه الدالة نوع القيمة. التوقيعات: type(T) -> typeأمثلة: type(1) // int |
✓ | ✓ | ✓ | ✓ | ✗ |
4. الإضافات (المكتبات)
مكتبة الروابط
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
cel.bind |
يربط هذا الإجراء متغيّرًا محليًا لتجنُّب التقييم المكرّر. التوقيعات: cel.bind(varName, initExpr, resultExpr) -> Tأمثلة: cel.bind(x, a + b, x * x) |
✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Bindings()إلىcel.NewEnv(). - C++: أضِف
BindingsCompilerLibrary()إلىCompilerBuilder. (تتم معالجة وقت التشغيل تلقائيًا). - Java: أضِف
CelExtensions.bindings()إلىCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_bindingsواستخدِمExtBindings()فيcel.NewEnv(extensions=[...]).
مكتبة برامج الترميز
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
base64.encode |
ترميز وحدات البايت إلى سلسلة base64 التواقيع: base64.encode(bytes) -> stringأمثلة: base64.encode(b"hello") // "aGVsbG8=" |
✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
base64.decode |
يفك ترميز سلسلة base64 إلى وحدات بايت. يُظهر هذا الإجراء خطأً عند إدخال بيانات غير صالحة. التوقيعات: base64.decode(string) -> bytesأمثلة: base64.decode("aGVsbG8=") // b"hello" |
✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
json.encode |
تحوّل قيمة CEL إلى سلسلة JSON. التوقيعات: json.encode(dyn) -> stringأمثلة: json.encode([1, 2]) // "[1,2]" |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Encoders()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
EncodersCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterEncodersFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.encoders()إلىCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_encodersواستخدِمExtEncoders()فيcel.NewEnv(extensions=[...]).
مكتبة الرياضيات
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
math.greatest |
تعرض هذه الدالة أكبر قيمة من الوسيطات الرقمية (أو قائمة الأرقام). التوقيعات: math.greatest(arg, ...) -> Tأمثلة: math.greatest(1, 3, 2) // 3 |
✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
math.least |
تعرض هذه الدالة أصغر الوسيطات الرقمية (أو قائمة الأرقام). التوقيعات: math.least(arg, ...) -> Tأمثلة: math.least([1, 3, 2]) // 1 |
✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
math.abs |
القيمة المطلقة. التوقيعات: math.abs(T) -> T (يتوافق مع int وuint وdouble)<br /><br />**Examples:**<br />math.abs(-1) // 1` |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.sqrt |
الجذر التربيعي. التواقيع: math.sqrt(T) -> double (تتيح int وuint وdouble)<br /><br />**Examples:**<br />math.sqrt(9) // 3.0` |
✓ (الإصدار 0.25.1) | ✓ (الإصدار 0.12.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitAnd |
عملية AND الثنائية التوقيعات: math.bitAnd(T, T) -> T (تتيح int وuint)<br /><br />**Examples:**<br />math.bitAnd(5, 3) // 1` |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitOr |
استخدام OR على مستوى البت. التوقيعات: math.bitOr(T, T) -> T (يتوافق مع int وuint)<br /><br />**Examples:**<br />math.bitOr(5, 3) // 7` |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitXor |
عملية XOR على مستوى البتات التوقيعات: math.bitXor(T, T) -> T (متوافق مع int وuint)<br /><br />**Examples:**<br />math.bitXor(5, 3) // 6` |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitNot |
استخدام NOT على مستوى البت التوقيعات: math.bitNot(T) -> T (يتوافق مع int وuint)<br /><br />**Examples:**<br />math.bitNot(1) // -2` |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitShiftLeft |
إزاحة بتية إلى اليسار التواقيع: math.bitShiftLeft(T, int) -> T (متوافق مع int وuint)<br /><br />**Examples:**<br />math.bitShiftLeft(1, 2) // 4` |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitShiftRight |
إزاحة بتية إلى اليمين التوقيعات: math.bitShiftRight(T, int) -> T (تتوافق مع int وuint)<br /><br />**Examples:**<br />math.bitShiftRight(4, 2) // 1` |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.ceil |
تقريب السقف التواقيع: math.ceil(double) -> doubleأمثلة: math.ceil(1.2) // 2.0 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.floor |
التقريب إلى أقرب عدد صحيح أصغر التوقيعات: math.floor(double) -> doubleأمثلة: math.floor(1.8) // 1.0 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.round |
التقريب إلى أقرب عدد صحيح التوقيعات: math.round(double) -> doubleأمثلة: math.round(1.5) // 2.0 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.trunc |
التقريب إلى أقرب عدد صحيح (باتجاه الصفر). التوقيعات: math.trunc(double) -> doubleأمثلة: math.trunc(-1.8) // -1.0 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.isInf |
للتحقّق ممّا إذا كانت القيمة المضاعفة موجبة أو سالبة. التوقيعات: math.isInf(double) -> boolأمثلة: math.isInf(1.0/0.0) // true |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.isNaN |
تتحقّق هذه الدالة ممّا إذا كانت القيمة المزدوجة NaN. التوقيعات: math.isNaN(double) -> boolأمثلة: math.isNaN(0.0/0.0) // true |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.isFinite |
تتحقّق هذه الدالة مما إذا كان الرقم المزدوج محدودًا. التوقيعات: math.isFinite(double) -> boolأمثلة: math.isFinite(1.2) // true |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.sign |
تعرض هذه الدالة إشارة القيمة (-1 أو 0 أو 1). التواقيع: math.sign(T) -> T (تتوافق مع int وuint وdouble)<br /><br />**Examples:**<br />math.sign(-42) // -1` |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Math()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
MathCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterMathExtensionFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.math()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_mathواستخدِمExtMath()فيcel.NewEnv(extensions=[...]).
Protos Library
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
proto.getExt |
يحصل على حقل إضافة proto2 أو القيمة التلقائية إذا لم يتم ضبطه. التوقيعات: proto.getExt(msg, extName) -> Tأمثلة: proto.getExt(msg, google.api.expr.test.int32_ext) |
✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
proto.hasExt |
تتحقّق هذه الدالة مما إذا تم ضبط حقل إضافة proto2. التوقيعات: proto.hasExt(msg, extName) -> boolأمثلة: proto.hasExt(msg, google.api.expr.test.int32_ext) |
✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Protos()إلىcel.NewEnv(). - C++: أضِف
ProtoExtCompilerLibrary()إلىCompilerBuilder. (تتم معالجة وقت التشغيل تلقائيًا). - Java: أضِف
CelExtensions.protos()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_protoواستخدِمExtProto()فيcel.NewEnv(extensions=[...]).
مكتبة القوائم
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
distinct |
تعرض هذه الدالة عناصر مميزة. التوقيعات: list.distinct() -> listأمثلة: [1, 2, 2].distinct() // [1, 2] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
flatten |
تعمل هذه الدالة على تسوية القوائم المتداخلة. التوقيعات: list.flatten([depth]) -> listأمثلة: [[1], [2, 3]].flatten() // [1, 2, 3] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.7.1) | ✓ (الإصدار 0.1.1) | ✗ |
lists.range |
تعرض هذه الدالة قائمة بالأعداد الصحيحة [0, ..., n-1].التوقيعات: lists.range(int) -> list(int)أمثلة: lists.range(3) // [0, 1, 2] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
reverse |
تعكس ترتيب القائمة. التوقيعات: list.reverse() -> listأمثلة: [1, 2].reverse() // [2, 1] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
slice |
تعرض هذه السمة قائمة فرعية من المرتجعات (تتضمّن بداية النطاق ولا تتضمّن نهايته). التوقيعات: list.slice(start, end) -> listأمثلة: [1, 2, 3].slice(1, 3) // [2, 3] |
✓ (الإصدار 0.17.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
sort |
ترتّب هذه السمة قائمة العناصر القابلة للمقارنة. التوقيعات: list.sort() -> listأمثلة: [3, 1, 2].sort() // [1, 2, 3] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
sortBy |
ترتّب القائمة حسب المفتاح الذي تم تقييمه من التعبير. التوقيعات: list.sortBy(var, expr) -> listأمثلة: [{"val": 2}, {"val": 1}].sortBy(x, x.val) // [{"val": 1}, {"val": 2}] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
first |
تعرض هذه السمة العنصر الأول كعنصر اختياري. يتطلّب هذا الخيار إضافة Optional. التواقيع: list.first() -> optionalأمثلة: [1, 2].first() // optional(1) |
✓ (الإصدار 0.23.0) | ✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.2) | ✗ |
last |
تعرض هذه السمة العنصر الأخير كعنصر اختياري. يتطلّب هذا الخيار إضافة Optional. التواقيع: list.last() -> optionalأمثلة: [1, 2].last() // optional(2) |
✓ (الإصدار 0.23.0) | ✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.2) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Lists()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
ListsCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterListsFunctions()فيFunctionRegistryوالاتصال بالرقمRegisterListsMacros()فيMacroRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.lists()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: فعِّل هذه الميزة من خلال
cel.EnvConfigعن طريق إضافةlistsإلى قائمةextensions.
مكتبة المجموعات
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
sets.contains |
تتحقّق هذه الدالة ممّا إذا كانت list1 تحتوي على جميع عناصر list2. التوقيعات: sets.contains(list1, list2) -> boolأمثلة: sets.contains([1, 2], [1]) // true |
✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.1.1) | ✗ |
sets.equivalent |
تتحقّق هذه الدالة مما إذا كانت القوائم متطابقة (أي تحتوي على العناصر الفريدة نفسها). التوقيعات: sets.equivalent(list1, list2) -> boolأمثلة: sets.equivalent([1, 2], [2, 1, 1]) // true |
✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.1.1) | ✗ |
sets.intersects |
تتحقّق هذه الدالة ممّا إذا كانت القوائم تتضمّن عنصرًا واحدًا على الأقل. التوقيعات: sets.intersects(list1, list2) -> boolأمثلة: sets.intersects([1, 2], [2, 3]) // true |
✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Sets()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
SetsCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterSetsFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.sets()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: فعِّل هذه الميزة من خلال
cel.EnvConfigعن طريق إضافةsetsإلى قائمةextensions.
مكتبة السلاسل
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
charAt |
تعرض هذه الدالة الحرف في الفهرس. التوقيعات: string.charAt(int) -> stringأمثلة: "hello".charAt(1) // "e" |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
indexOf |
تعرض هذه الدالة فهرس أول تكرار للسلسلة الفرعية، أو القيمة -1. التوقيعات: string.indexOf(substr, [start]) -> intأمثلة: "hello".indexOf("l") // 2 |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
lastIndexOf |
تعرض هذه الدالة فهرس آخر تكرار للسلسلة الفرعية، أو القيمة -1. التواقيع: string.lastIndexOf(substr, [end]) -> intأمثلة: "hello".lastIndexOf("l") // 3 |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
join |
تدمج السلاسل. التوقيعات: list(string).join([separator]) -> stringأمثلة: ["a", "b"].join("-") // "a-b" |
✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
split |
تقسيم السلسلة حسب الفاصل التوقيعات: string.split(separator, [limit]) -> list(string)أمثلة: "a-b".split("-") // ["a", "b"] |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
substring |
تعرض هذه الدالة السلسلة الفرعية (بداية شاملة ونهاية غير شاملة). التوقيعات: string.substring(start, [end]) -> stringأمثلة: "hello".substring(1, 3) // "el" |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
trim |
تزيل هذه الدالة المسافات البيضاء في Unicode. التوقيعات: string.trim() -> stringأمثلة: " hello ".trim() // "hello" |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
replace |
يستبدل هذا الإجراء القيم القديمة بالقيم الجديدة. التوقيعات: string.replace(old, new, [limit]) -> stringأمثلة: "hello".replace("l", "w") // "hewwo" |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
reverse |
تعكس نقاط رموز Unicode. التوقيعات: string.reverse() -> stringأمثلة: "abc".reverse() // "cba" |
✓ (الإصدار 0.18.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.1.1) | ✗ |
lowerAscii |
تحويل أحرف ASCII إلى أحرف صغيرة التوقيعات: string.lowerAscii() -> stringأمثلة: "Hello".lowerAscii() // "hello" |
✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
upperAscii |
تحويل أحرف ASCII إلى أحرف كبيرة التواقيع: string.upperAscii() -> stringأمثلة: "Hello".upperAscii() // "HELLO" |
✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
quote |
تُستخدَم هذه الدالة لتجنُّب أي مشاكل عند طباعة السلسلة. التوقيعات: strings.quote(string) -> stringأمثلة: strings.quote("a\tb") // "\"a\\tb\"" |
✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Strings()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
StringsCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterStringsFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.strings()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_stringsواستخدِمExtStrings()فيcel.NewEnv(extensions=[...]).
مكتبة التعبيرات العادية
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
regex.replace |
يستبدل التطابقات بسلسلة الاستبدال (يتيح المراجع الخلفية). التوقيعات: regex.replace(target, pat, repl, [limit]) -> stringأمثلة: regex.replace("123-456", r"(\d+)-(\d+)", r"\2-\1") // "456-123" |
✓ (الإصدار 0.25.1) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
regex.extract |
عرض أول تطابق للنمط (يجب أن يتضمّن مجموعة التقاط واحدة) التوقيعات: regex.extract(target, pat) -> optional(string)أمثلة: regex.extract("a123b", r"(\d+)") // optional("123") |
✓ (الإصدار 0.25.1) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
regex.extractAll |
تعرِض هذه الدالة جميع المطابقات للنمط (يجب أن تتضمّن مجموعة التقاط واحدة). التوقيعات: regex.extractAll(target, pat) -> list(string)أمثلة: regex.extractAll("a1b2", r"(\d+)") // ["1", "2"] |
✓ (الإصدار 0.25.1) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Regex()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
RegexExtCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterRegexExtensionFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.regex()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: فعِّل هذه الميزة من خلال
cel.EnvConfigعن طريق إضافةregexوoptionalإلى قائمةextensions.
Two-Variable Comprehensions
| وحدة الماكرو | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
all |
اختصار عملية الربط المنطقي AND على المفتاح/الفهرس والقيمة التوقيعات: list.all(i, v, pred) -> boolmap.all(k, v, pred) -> boolأمثلة: [1, 2].all(i, v, v > 0) // true |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
exists |
اختصار منطق "أو" على المفتاح/الفهرس والقيمة التوقيعات: list.exists(i, v, pred) -> boolmap.exists(k, v, pred) -> boolأمثلة: [1, 2].exists(i, v, v == 2) // true |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
existsOne |
للتحقّق ممّا إذا كان هناك زوج واحد فقط يستوفي المسند. التوقيعات: list.existsOne(i, v, pred) -> boolmap.existsOne(k, v, pred) -> boolأمثلة: [1, 2].existsOne(i, v, v == 2) // true |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
transformList |
تحويل/فلترة القائمة/الخريطة إلى قائمة التواقيع: list.transformList(i, v, [filter], transform) -> listmap.transformList(k, v, [filter], transform) -> listأمثلة: [1, 2].transformList(i, v, v * 2) // [2, 4] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
transformMap |
تحويل قيم القائمة أو الخريطة إلى خريطة (تبقى المفاتيح ثابتة). التوقيعات: list.transformMap(i, v, [filter], transform) -> mapmap.transformMap(k, v, [filter], transform) -> mapأمثلة: [1, 2].transformMap(i, v, v * 2) // {0: 2, 1: 4} |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
transformMapEntry |
يتحوّل إلى خريطة. التوقيعات: list.transformMapEntry(i, v, [filter], transform_entry) -> mapmap.transformMapEntry(k, v, [filter], transform_entry) -> mapأمثلة: [1, 2].transformMapEntry(i, v, {string(v): v * 2}) // {"1": 2, "2": 4} |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.TwoVarComprehensions()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
ComprehensionsV2CompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterComprehensionsV2Functions()علىFunctionRegistryوالاتصال بالرقمRegisterComprehensionsV2Macros()علىMacroRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.comprehensions()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: فعِّل هذه الميزة من خلال
cel.EnvConfigعن طريق إضافةtwo-var-comprehensionsإلى قائمةextensions.
مكتبة الأنواع الأصلية
| الميزة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
| Native Structs | تسجيل أنواع أصلية للمضيف وإنشاؤها (بنى Go / كائنات Java POJO) في CEL أمثلة: Account{id: 123} (كائن Java POJO تم إنشاؤه في CEL) |
✓ (الإصدار 0.13.0) | ✗ | ✓ (الإصدار 0.13.0) | ✗ | ✗ |
كيفية التفعيل
- القيمة: تمرير
ext.NativeTypes(...)(توفير أنواع الانعكاس) إلىcel.NewEnv(). - C++: غير متوافق.
- Java: أضِف
CelExtensions.nativeTypes()(الذي يوفّر فئات Java) إلى أدوات الإنشاءCelCompilerوCelRuntime. - Python: غير متاح.
مكتبة الشبكة
توفّر مكتبة الشبكة دوالاً لتحليل عناوين IP وكتل CIDR والتحقّق من صحتها ومعالجتها.
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
ip |
تحلّل هذه الدالة سلسلة إلى عنوان IP، أو تستخرج عنوان IP من CIDR. التوقيعات: ip(string) -> IPCIDR.ip() -> IPأمثلة: ip("192.168.0.1")cidr("192.168.0.0/24").ip() |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isIP |
للتحقّق مما إذا كانت السلسلة تمثّل عنوان IP صالحًا. التوقيعات: isIP(string) -> boolأمثلة: isIP("192.168.0.1") // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
ip.isCanonical |
للتحقّق مما إذا كانت سلسلة عنوان IP بالتنسيق الأساسي. التوقيعات: ip.isCanonical(string) -> boolأمثلة: ip.isCanonical("192.168.0.1") // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
cidr |
تحلّل هذه الدالة سلسلة إلى حظر CIDR. التواقيع: cidr(string) -> CIDRأمثلة: cidr("192.168.0.0/24") |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isCIDR |
للتحقّق مما إذا كانت السلسلة عبارة عن مجموعة CIDR صالحة. التوقيعات: isCIDR(string) -> boolأمثلة: isCIDR("192.168.0.0/24") // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
containsIP |
للتحقّق مما إذا كان حظر CIDR يتضمّن عنوان IP. التواقيع: CIDR.containsIP(IP) -> boolCIDR.containsIP(string) -> boolأمثلة: cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
containsCIDR |
تتحقّق هذه الدالة ممّا إذا كانت إحدى كتل CIDR تتضمّن كتلة CIDR أخرى. التوقيعات: CIDR.containsCIDR(CIDR) -> boolCIDR.containsCIDR(string) -> boolأمثلة: cidr("192.168.0.0/16").containsCIDR(cidr("192.168.1.0/24")) // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
family |
تعرِض هذه السمة عائلة عناوين IP (4 لـ IPv4 و6 لـ IPv6). التوقيعات: IP.family() -> intأمثلة: ip("192.168.0.1").family() // 4 |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isGlobalUnicast |
للتحقّق مما إذا كان عنوان IP هو عنوان أحادي البث عالمي. التوقيعات: IP.isGlobalUnicast() -> boolأمثلة: ip("192.168.0.1").isGlobalUnicast() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLinkLocalMulticast |
للتحقّق ممّا إذا كان عنوان IP هو عنوان بث متعدّد محلي للرابط. التوقيعات: IP.isLinkLocalMulticast() -> boolأمثلة: ip("224.0.0.1").isLinkLocalMulticast() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLinkLocalUnicast |
تتحقّق هذه الدالة مما إذا كان عنوان IP هو عنوان أحادي البث محلي الارتباط. التوقيعات: IP.isLinkLocalUnicast() -> boolأمثلة: ip("169.254.0.1").isLinkLocalUnicast() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLoopback |
تتحقّق هذه الدالة مما إذا كان عنوان IP هو عنوان إعادة توجيه. التوقيعات: IP.isLoopback() -> boolأمثلة: ip("127.0.0.1").isLoopback() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isMask |
تتحقّق هذه الدالة مما إذا كان CIDR قناع شبكة فرعية صالحًا. التوقيعات: CIDR.isMask() -> boolأمثلة: cidr("255.255.255.0/24").isMask() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isUnspecified |
تتحقّق هذه السمة مما إذا كان عنوان IP هو عنوان غير محدّد (مثل 0.0.0.0).التوقيعات: IP.isUnspecified() -> boolأمثلة: ip("0.0.0.0").isUnspecified() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
masked |
تعرِض هذه الدالة كتلة CIDR المخفية. التوقيعات: CIDR.masked() -> CIDRأمثلة: cidr("192.168.0.1/24").masked() // 192.168.0.0/24 |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
prefixLength |
تعرض هذه السمة طول بادئة حظر CIDR. التنسيقات: CIDR.prefixLength() -> intأمثلة: cidr("192.168.0.0/24").prefixLength() // 24 |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
string |
تحويل عنوان IP أو CIDR إلى سلسلة التواقيع: string(IP) -> stringstring(CIDR) -> stringأمثلة: string(ip("192.168.0.1")) // "192.168.0.1" |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Network()إلىcel.NewEnv(). - C++: غير متوافق.
- Java: غير متاح.
- Python: غير متاح.
5- الميزات المتقدّمة
ملخّص الميزات المتقدّمة
| الميزة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
| التقييم الجزئي | التقييم باستخدام مدخلات غير متوفّرة، ويتم عرض قيم غير معروفة أو تعبير مبسط. | ✓³ | ✓⁴ | ✓⁴ | ✗ | ✗ |
| التقييم غير المتزامن | التنفيذ المتزامن غير الحظر لوظائف الإضافة | ✓⁵ | ✗ | ✓⁶ | ✗ | ✗ |
| أدوات التحقّق من صحة AST | تُجري عملية التحليل الثابت عمليات التحقّق من Checked AST بعد التحقّق من النوع. | ✓ | ✓ | ✓ | ✗ | ✗ |
| أدوات تحسين AST | إعادة كتابة شجرة بناء الجملة المجردة (مثل طيّ الثوابت، والتضمين، والتعبير الفرعي المشترك) لتحسين الأداء | ✓ | ✓ | ✓ | ✗ | ✗ |
| أداة تجميع سياسات CEL | تجميع بنى السياسات المستندة إلى YAML في أشجار بنية مجردة (AST) عادية للغة CEL | ✓ | ✓ | ✓ | ✗ | ✗ |
³ تتيح لغة Go إنشاء شجرة بناء مجردة متبقية (شجرة بناء مجردة تم تقليل حجمها). ⁴ تتيح لغتا C++ وJava
عرض UnknownSet / CelUnknownSet في وقت التشغيل، ولكنّهما لا توفّران واجهات برمجة تطبيقات عامة
لإنشاء شجرة بنية مجردة متبقية. ⁵ تستخدم Go AsyncBinding / AsyncOp في عرض قنوات البث. ⁶ تستخدم Java CelAsyncRuntime لعرض ListenableFuture.
التقييم الجزئي (القيم غير المعروفة)
تتيح التقييم الجزئي تقييم تعبير عندما تكون مجموعة فرعية فقط من متغيرات الإدخال (المَعلمات) معروفة. بدلاً من أن تفشل عملية التقييم، فإنّها تنتج نتيجة تشير إلى ما هو مفقود، أو تعبير مبسط.
- Go: متوافقة تمامًا. تسمح هذه السمة بتحديد
PartialActivationباستخدام أنماط السمات غير المعروفة. يُرجع التقييم قيمةtypes.Unknown. تتيح Go إنشاء شجرة بناء الجملة المجردة المتبقية (Env.ResidualAst) وهي شجرة بناء جملة مجردة مبسطة ومحذوف منها بعض العناصر، ولا تحتوي إلا على أجزاء التعبير التي لم يكن من الممكن تقييمها. - C++: تتيح استخدام قيم
Unknown. يتم ضبط أنماط السمات غير المعروفة من خلالActivation::set_unknown_attribute_patterns. تعرض عملية التقييمUnknownSet. لا تعرض واجهة برمجة التطبيقات العامة حاليًا إنشاء AST المتبقّي. - Java: تتيح التقييم الجزئي من خلال
PartialVarsالذي تم تمريره إلىProgram.eval(). تعرض عملية التقييمCelUnknownSet. لا تعرض واجهة برمجة التطبيقات العامة حاليًا ميزة إنشاء شجرة بنية تجريدية متبقية. - Python / C: لا تتوفّر إمكانية استخدامها بشكلٍ أصلي.
التقييم غير المتزامن
تسمح عملية التقييم غير المتزامن لتعبيرات CEL باستدعاء دوال يتم تنفيذها بشكل غير متزامن (مثل إجراء طلبات استدعاء الإجراء عن بُعد أو طلبات بحث في قاعدة البيانات) وحظر عملية التقييم إلى أن تتوفّر النتائج، وذلك بدون حظر سلسلة التنفيذ الرئيسية.
- Go: تتيح استخدام دوال غير متزامنة عبر
AsyncBindingوAsyncOp. تعرض الدوال غير المتزامنة قناة Go (<-chan ref.Val)، ويتولّى المفسّر إدارة التنفيذ المتزامن والمزامنة. - Java: تتيح التقييم غير المتزامن من خلال
CelAsyncRuntimeوAsyncProgram. تستخدِم هذه السمةListenableFutureلتمثيل القيم المعلّقة وتؤدي تلقائيًا إلى إكمال التقييم عند حلّ القيم المستقبلية. - C++ / Python / C: لا تتوفّر ميزة مدمجة.
أدوات التحقّق من صحة AST
تُجري أدوات التحقّق تحليلًا ثابتًا على شجرة بنية مجرّدة (AST) تم التحقّق منها بعد التحقّق من النوع لفرض قيود خاصة بالمجال قبل تنفيذ البرنامج.
- Go: يتوافق مع واجهة
ASTValidator. تشمل أدوات التحقّق من صحة البيانات الأساسية ما يلي:cel.validator.durationوcel.validator.timestampوcel.validator.matches(تعبير عادي) وcel.validator.homogeneous_literalsوcel.validator.comprehension_nesting_limit. - C++: تتوافق مع
cel::Validator. تشمل عمليات التحقّق من صحة الروابط الأساسية ما يلي:AstDepthValidatorوComprehensionNestingLimitValidatorوDurationLiteralValidatorوHomogeneousLiteralValidatorوMatchesValidatorوTimestampLiteralValidator. - Java: تتوافق مع
CelValidatorوCelAstValidator. تشمل أدوات التحقّق من صحة الروابط الأساسيةAstDepthLimitValidatorوComprehensionNestingLimitValidatorوDurationLiteralValidatorوHomogeneousLiteralValidatorوRegexLiteralValidatorوTimestampLiteralValidator. - Python / C: لا تتوفّر إمكانية الربط المباشر.
أدوات تحسين AST
تعيد أدوات التحسين كتابة شجرة بنية التجريد لتحسين أداء التنفيذ. تنقسم أدوات التحسين إلى فئتين: أدوات التحسين الثابتة وأدوات التحسين أثناء وقت التشغيل. تتيح لغات C++ وJava وGo تحسين الأداء في وقت التشغيل. تتوافق لغتا CEL Java وGo أيضًا مع أدوات التحسين الثابتة. تشمل التحسينات النموذجية طيّ الثوابت (التقييم المسبق للتعبيرات الفرعية باستخدام المدخلات الثابتة) وإزالة التعبيرات الفرعية المشتركة (CSE).
- Go: تتيح طي شجرة بنية التجريد أثناء التجميع/التخطيط.
- ++C: تتيح تقليل الثوابت من خلال الإضافة
cel::extensions::EnableConstantFoldingفي وقت التخطيط. - Java: تتوافق مع واجهة
CelOptimizer. تشمل أدوات التحسين الأساسيةConstantFoldingOptimizer(التي يمكنها طيّ الفروع ذات الدائرة القصيرة من خلال محاكاة التقييم الجزئي) وInliningOptimizerوSubexpressionOptimizer(إزالة التعبيرات الفرعية المشتركة). - Python / C: لا تتوفّر إمكانية الربط المباشر.
أداة تجميع سياسات CEL
سياسة CEL هي تنسيق مستند إلى YAML لإنشاء تعبيرات CEL متعددة معًا، بالإضافة إلى متغيرات وكتل مطابقة ومخرجات شرطية وقواعد متداخلة. وهي مصمَّمة لمحركات السياسات المعقّدة (مثل Kubernetes Admission Control) التي تصبح فيها تعبيرات CEL الفردية غير قابلة للقراءة.
يجمع "مجمّع السياسات" سياسات YAML هذه في شجرة بنية مجردة (AST) واحدة متوافقة مع CEL، ما يعني أنّها متوافقة تمامًا مع أوقات تشغيل CEL العادية وتتضمّن جميع ضمانات الأداء والسلامة.
- الخطوة: يتم توفير الدعم من خلال
third_party/cel/go/policy. - C++: يتم توفير الدعم من خلال
third_party/cel/cpp/policy. - Java: يتم توفير الدعم من خلال
third_party/java/cel/policy. - Python / C: غير متوافقَين مباشرةً.