جدول المحتويات

إدارة المراجعات revisions والإصدارات versions

ملاحظة عن API

نحن افترضنا أن عمليات تحرير العقد لن تكون عشوائية غير مترابطة بل قمنا بتركيز التحسين optimization عملية الإضافة في آخر الشجرة أو عبر الذهاب لعقدة ما بعملية seek ثم اسقاط شجرة عند عقدة بكل سلالتها ثم وضع النسخة المعدلة مكانها وهذا الأسلوب لا يمكن فيه أن تكون عمليات التحرير خارجة عن العقدة التي ذهبنا إليها بعملية seek أي أن الإضافة تكون للداخل في العمق ولا يجوز أن تكون بعمق أقل من الذي في أول عملية seek.

بكلمات أخرى قد تولد عملية الفرق مقاطع chunks لايمكن إضافتها بحركة seek واحدة لأن عملية إيجاد كل الأجداد لعقدة عملية مكلفة في نموذج البيانات الحالي فهي إما تأتي عبر عملية traverserWithStack او عبر عدد غير محدد من الاستعلامات على SQL في كل مرة نأخذ عقدة الأب حتى نصل إلى الجذر.

مسودات وأفكار

طرق تنفيذها

الفروقات يجب أن تحفظ بطريقة يمكن تحويلها إلى عمليات SQL مباشرة تمكن من لديه أحد النسختين والفروقات الحصول على النسخة الأخرى. بكلمات أخرى يجب أن لا تحفظ الفروقات بهيئة عالية المستوى من العمليات على العقد.

وتوليد الفروقات يكون بطريقتين

توليد الفروقات أثناء التعديل

أن تستلم دوال التعديل على العقد (مثل KitabCursor.appendNode أو dropDescendants أو Node.tagWith أو applyTags أو clearTags) معاملا جديدا اسمه revisions فإن لم يكن None فإنها تولد الفروقات عبره مما تملكه من معلومات.

طريقة عامة عمياء

يمكن اعتبار كل جدول في قاعدة البيانات على أنه سلسلة Sequence من الصفوف وتطبيق SequenceMatcher عليه بطريقة عمياء دون النظر إلى نموذج البيانات أو ال API وهذه تصلح في حال كان عندنا ملفين كل واحد نسخة من الكتاب ونريد الفرق بينهما.

دراسة أنواع عمليات الفروقات

الكائن Revisions يفترض أن يكون له طرق/دوال باسم كل عملية يتم استدعاء سلسلة منها لتسجيل تأريخ معين

rev.start(comment="fix broken url")
rev.op1()
rev.op2()
rev.end()

أنواع عمليات الفروقات