مكتبة لإجراء تسلسل وإلغاء تسلسل بناء جملة مرشح PocketBase.
يمكنك بسهولة تثبيت PBF باستخدام npm أو الغزل:
npm install pbf
أو
yarn add pbf
يجعل PBF من السهل العمل مع بناء جملة مرشح PocketBase. فيما يلي مثال سريع لكيفية البدء:
import * as pbf from "@nedpals/pbf" ;
import PocketBase from "pocketbase" ;
const pb = new PocketBase ( "<pocketbase url>" ) ;
const result = await pb . collection ( 'example' ) . getList ( 1 , 20 , {
filter : pbf . stringify ( pbf . and (
pbf . eq ( 'status' , true ) ,
pbf . gt ( 'created' , new Date ( "2022-08-01" ) )
) ) // status = true && created > "2022-08-01 10:00:00.000Z"
} ) ;
لإلغاء عامل التصفية (على سبيل المثال، يساوي غير متساوٍ، أو إلى)، يمكنك استخدام الدالة not
. هذا لا ينفي القيمة ولكن المشغل المستخدم فقط.
import * as pbf from "@nedpals/pbf" ;
pbf . stringify ( pbf . not ( pbf . eq ( "is_repost" , false ) ) ) // is_repost = false
في بعض الحالات، قد ترغب في إنشاء مرشح بحث مع تمكين بعض المرشحات بشكل مشروط من خلال دائرة كهربائية قصيرة. يمكنك القيام بذلك عن طريق إضافة مُعدِّل .maybe
قبل الاتصال بالمشغلين. سيؤدي هذا إلى تصفية أي قيم زائفة وإخراج عوامل التصفية المناسبة.
import * as pbf from "@nedpals/pbf" ;
pbf . stringify ( pbf . and . maybe (
false && pbf . eq ( 'f' , 4 ) ,
null ,
pbf . eq ( 'd' , 1 ) ,
0 ,
pbf . not ( pbf . eq ( 'e' , 1 ) ) ,
) ) ; // d = 1 && e != 1
بدلاً من تكرار كتابة مرشحات مقارنة متعددة لنفس الحقل، يوفر PBF اختصارًا سهلاً من خلال either
المعدلين.
import * as pbf from "@nedpals/pbf" ;
// shortcut for pbf.or(pbf.eq("size", "L"), pbf.eq("size", "XL"), pbf.eq("size", "XXL"))
pbf . stringify ( pbf . eq . either ( "size" , [ "L" , "XL" , "XXL" ] ) ) ; // (size = "L" || size = "XL") || size = "XXL"
يدعم PBF أيضًا تحليل سلاسل التصفية الأولية إلى تنسيق PBF مناسب. يعد هذا أمرًا رائعًا عندما تريد التحليل من استعلام بحث URL أو ترغب فقط في إنشاء تجربة بحث تشبه PocketBase:
import * as pbf from "@nedpals/pbf" ;
const result = pbf . parse ( "title = 'example'" ) ; // equivalent to eq("title", "example");
// You can also inject/bind values to placeholders
const resultB = pbf . parse ( "title = {:title}" , { title : "Foo bar" } ) // equivalent of eq("title", "Foo bar")
لجعل إجراء التسلسل/إلغاء التسلسل ممكنًا، يقوم PBF بتخزينه ككائن يتبع تنسيق شجرة بناء الجملة للتمييز بين المرشحات المنطقية والمقارنة والمحتوية على حاويات/الأقواس.
// Taken and modified from the source code for brevity
type FilterValue = number | boolean | string | Date | null ;
type Filter = ComparisonFilter | LogicalFilter | ContainerFilter ;
type Metadata = Record < string , any >
// eg. a = 1
interface ComparisonFilter {
field : string
op : Operator
value : FilterValue
meta ?: Metadata
}
// eg. a > 1 && b = 2
interface LogicalFilter {
lhs : Filter
op : Operator
rhs : Filter
meta ?: Metadata
}
// eg. (c = 3)
interface ContainerFilter {
op : Operator
filter : Filter
meta ?: Metadata
}
وهذا أيضًا يجعل من السهل إنشاء المرشحات يدويًا خاصة عند إنشاء مرشحات ديناميكية تشبه الجوانب:
const filter : Filter = {
op : "and" ,
lhs : {
op : "gte" ,
field : "shoe_size" ,
value : 20
} ,
rhs : {
op : "eq" ,
field : "color" ,
value : "burgundy"
}
}
pbf . stringify ( filter ) // shoe_size >= 20 && color = "burgundy"
بدءًا من PocketBase JS SDK 0.19.0، تمت إضافة ميزة جديدة تسمح ببناء المرشحات بشكل مشابه لـ PBF. ومع ذلك، هناك بعض الاختلافات الرئيسية بين النهجين.
يضمن PocketBase فقط هروب القيم بشكل صحيح وربطها بعامل التصفية. لا يزال المستخدم مسؤولاً عن إنشاء صيغة عامل التصفية، والتي يمكن أن تكون عرضة للأخطاء. من ناحية أخرى، يوفر PBF حلاً أكثر شمولاً من خلال توفير طريقة سهلة وشاملة أيضًا لإنشاء مرشحات بحث معقدة دون القلق بشأن بناء الجملة.
تم أيضًا إنشاء PBF كوظيفة أداة مساعدة لمرة واحدة قبل إضافة هذه الميزة إلى PocketBase.
pbf مرخص بموجب ترخيص MIT.
المساهمات هي موضع ترحيب! لا تتردد في فتح القضايا أو سحب الطلبات.