play.html، المتاحة على المسار /play في أي منفذ HTTP لـ ClickHouse) فرز النتائج حسب أعمدتها، وتصفيتها حسب قيمها، والتنقل بين صفحاتها — وكل ذلك دون تحرير الاستعلام.
لا يحدث أي من ذلك في المتصفح. إذ يعيد كل تغيير تشغيل الاستعلام باستخدام إعداد إنشاء الاستعلام المقابل، ويُجسِّده الخادم بتغليف الاستعلام في جدول مشتق وإضافة ORDER BY وWHERE وLIMIT خارجية. لذلك، فالنتيجة المعروضة على الشاشة هي النتيجة المرتبة والمصفاة والمقسمة إلى صفحات للاستعلام بالكامل، وليست مجرد إعادة ترتيب للصفوف التي صادف أن احتوتها الصفحة.
الفرز
aria-sort).
على الأجهزة ذات المؤشر القابل للتحويم (الفأرة)، لا تظهر الأسهم إلا عند التحويم فوق الرأس أو عند تركيز أحد الأسهم، كي لا تعيق الاستخدام في غير ذلك؛ أما على أجهزة اللمس والأجهزة الأخرى ذات المؤشر الخشن التي لا تدعم التحويم، فتظهر دائمًا ليُتاح النقر عليها مباشرة. ويعرض العمود المشارك في الفرز سهميه كليهما دون تحويم — أحدهما ليكون الفرز واضحًا بنظرة سريعة، والآخر لأن عكس الاتجاه هو الإجراء التالي الأرجح.
تظهر كل أيقونة في رأس العمود بالطريقة نفسها، مهما كانت الميزة التي تتحكم بها: تكون خافتة عندما لا تكون تلك الميزة مفعّلة للعمود، وتُعرض باللون المخصص لعناصر التحكم المفعّلة — الأرجواني في النسق الفاتح، والأصفر في النسق الداكن — عند تفعيلها، وعندها أيضًا تظل ظاهرة دون تحويم. ويعني الخفوت فقدان اللون لا الشفافية مطلقًا، لذلك لا تبدو الأيقونة باهتة أبدًا فوق اسم العمود أو ترميز ألوان الخلايا.
الفرز حسب عدة أعمدة
ORDER BY — إذ يحسم المفتاح الأول الترتيب، ويكسر كل مفتاح لاحق التعادلات بين المفاتيح السابقة. عند وجود أكثر من مفتاح فرز، يعرض كل سهم مفعّل أيضًا موضع عموده في هذا الترتيب كرمز علوي (▼¹، ▲²، …).
استخدام Shift مع عمود يُعد بالفعل مفتاح فرز لا يغيّر سوى اتجاهه، مع الإبقاء على موضعه في الترتيب. ويؤدي تعطيل عمود إلى إزالة ذلك العمود فقط وترك المفاتيح المتبقية في مواضعها.
التصفية
من رأس العمود
> 10 لرقم، وLIKE '%test%' لسلسلة نصية. يُفتح حقل الإدخال داخل خلية الرأس، التي تمتد إلى سطر ثانٍ لإفساح المجال له — وهو السطر نفسه الذي يظهر فيه عامل التصفية بعد تعيينه، لذا يُحرَّر عامل التصفية في موضع قراءته. ما يُكتب هو الجزء الذي يلي اسم العمود، لذا يصبح > 10 هو WHERE column > 10، ويصلح أي تعبير يقبله الخادم في هذا الموضع — BETWEEN 1 AND 5، وIN (1, 2, 3)، وIS NOT NULL، و% 2 = 0.
يؤدي الضغط على زر تطبيق (أو Enter) إلى تطبيق عامل التصفية وإعادة تشغيل الاستعلام؛ بينما يؤدي الضغط على Esc، أو النقر أو الانتقال بالمفتاح Tab إلى أي موضع آخر، إلى إلغاء التحرير وإخفاء حقل الإدخال. يكون زر تطبيق غير نشط عندما لا يوجد شيء لتطبيقه — مربع فارغ في عمود لا يحمل عامل تصفية — لكنه يبقى نشطًا لمربع فارغ في عمود يحمل عامل تصفية، لأن إفراغ المربع ثم تطبيقه هو طريقة إزالة عامل التصفية من حقل الإدخال. تُدمج عوامل التصفية على عدة أعمدة باستخدام AND.
من خلية
يُطبَّق الخيار فور اختياره. يُقارَن التاريخ أو الوقت أو
Enum بالنص نفسه الذي عرضه الخادم، ثم يحلله ClickHouse مجددًا باعتباره نوع العمود نفسه (وبالنسبة إلى Enum، اسم القيمة). يتحول contains إلى نمط LIKE مع إفلات % و_ الخاصين بالقيمة، بحيث يطابق القيمة حرفيًا. لا تعرض الخلية التي لا تندرج قيمتها ضمن ما سبق — مصفوفة أو Tuple أو Map أو نصًا طويلًا — أي قائمة؛ لكن يظل بالإمكان تصفية عمودها من حقل الإدخال في الرأس.
عامل التصفية المُطبَّق
تقسيم الصفحات
page، ثم إعادة تشغيل الاستعلام؛ ويحوّل الخادم الصفحة إلى قيمة OFFSET المقابلة. ويظل مُرقِّم الصفحات ظاهرًا ما دامت النتيجة مقسّمة إلى صفحات، رغم أن كل صفحة ممتلئة تمامًا ولم تعد تبدو مقتطعة.
لا يظهر عدد الصفحات لأنه غير معروف — إذ إن عدّ صفوف النتيجة يتطلب تشغيل استعلام ثانٍ. يعرض مُرقِّم الصفحات الصفحات العشر التي تسبق الصفحة الحالية، ثم الصفحة الحالية والتي تليها، متبوعةً بـ …. يؤدي النقر على … إلى تحويلها إلى حقل لإدخال أي رقم صفحة، ويُعتمد الرقم عند فقدان حقل الإدخال للتركيز (ويحدث ذلك عند الضغط على Enter).
لا تُعرض الصفحة التالية إلا إذا كانت الصفحة الحالية ممتلئة. فالصفحة التي تعود بعدد صفوف أقل من سعتها تمثل نهاية النتيجة، لذا لا توجد صفحة بعدها. (أما إذا كان عدد صفوف النتيجة مضاعفًا صحيحًا لحجم الصفحة، فستظل تُعرض صفحة إضافية تعود فارغة: إذ إن التمييز بين هذه الحالة وغيرها يتطلب أيضًا عدّ الصفوف.)
يعرض Per page عدد الصفوف التي تتسع لها الصفحة، ويُعدَّل بالطريقة نفسها: انقر على القيمة واكتب قيمة أخرى. ولا يمكن أن يتجاوز العدد ما تستطيع النتيجة عرضه دفعة واحدة — إذ إن الصفحة الأكبر ستعيد صفوفًا سيقتطعها الجدول لاحقًا، وستبدأ الصفحة التالية بعدها، ما يؤدي عند متابعة التصفح إلى تخطي الصفوف التي لم تتسع بصمت؛ ويُعتمد أي رقم أكبر باعتباره هذا الحد الأقصى، وهو ما ستعرضه القيمة حينها. ويؤدي تغييره إلى البدء من الصفحة الأولى مجددًا، لأن الصفحات بالحجم الجديد تحتوي صفوفًا مختلفة.
يؤدي تغيير الفرز أو أي عامل تصفية إلى العودة إلى الصفحة الأولى: فكلاهما يغيّر الصفوف التي تتضمنها النتيجة أو ترتيبها، ولذلك لم تعد الصفحة التي كان المستخدم عليها تمثل الشريحة نفسها من النتيجة.
كيفية تطبيقها
order وfilter وlimit وpage. ولأن الخادم يطبّقها على الاستعلام المُحلَّل بدلًا من نصه، فإنها تعمل مع أيّ مكوّنات موجودة مسبقًا في الاستعلام: يظل UNION وعبارة FORMAT الختامية وعبارتا ORDER BY وLIMIT الخاصتان به تعمل جميعًا، ولا يُعاد أبدًا كتابة الاستعلام في المحرر.
تُمرَّر أسماء الأعمدة كمُعرّفات مقتبسة، لذا يمكن استخدام عمود نتائج يحمل اسم تعبير (count()) أو اسمًا يتضمن مسافة كمفتاح للفرز أو التصفية.
متى تتاح
SELECT وUNION (بما في ذلك الاستعلامات التي تبدأ بعبارة WITH أو FROM). ولا تتاح لعبارات SHOW أو DESCRIBE أو EXISTS أو EXPLAIN: فرغم أنها تُنتج جدولًا، لا تنطبق عليها هذه الإعدادات، لذا فإن توفير عنصر تحكم لها يوحي بنتيجة لا تتضمنها الصفوف.
ينطبق الشكل على نتيجة عبارة واحدة، لذلك لا يتاح عند استخدام «تشغيل الكل» لتشغيل عدة عبارات، إذ إن كل عبارة تمثل استعلامًا مستقلًا بأعمدة مستقلة.
ولا يتاح أيضًا لنتيجة لا تتجاوز صفًا واحدًا في صفحتها الأولى: فأي ترتيب لصف واحد هو الترتيب نفسه، ولا يمكن للتصفية إلا الإبقاء عليه أو استبعاده، لذا لن تتمكن عناصر التحكم إلا من إعادة تشغيل الاستعلام للحصول على الصفوف نفسها — أما النتيجة الفارغة فلا تحتوي حتى على صف يمكن استبعاده. ولهذا السبب نفسه تُخفى مفاتيح تبديل الترميز اللوني هناك: إذ لا يوجد ما يمكن مقارنته عند عدم وجود أكثر من صف واحد.
تحتفظ نتيجتان من صف واحد بعناصر التحكم الخاصة بهما، لأن عناصر التحكم هي الوسيلة الوحيدة للعودة في هاتين الحالتين:
- نتيجة مرتبة أو مفلترة بالفعل، إذ يجب أن يظل ترتيبها قابلًا للعكس وأن تظل تصفيتها قابلة للمسح — فالتصفية التي تطابق صفًا واحدًا هي بالضبط ما يحوّل نتيجة طويلة إلى قصيرة، وإزالة عناصر التحكم معها ستترك المستخدم عالقًا بها وهي مفعّلة؛
- نتيجة مقطوعة عند حد العرض، وهي الصفحة الأولى من نتيجة أطول: يُقيَّد حجم الصفحة بعدد الخلايا التي يمكن للجدول عرضها في وقت واحد، لذا يمكن اقتطاع نتيجة عريضة جدًا إلى صف واحد، والصفوف التي تليه هي تحديدًا ما تتيح الفرز والترقيم التنقلي الوصول إليه.
ORDER BY أو WHERE على عمود قد لا يكون موجودًا في العبارة الجديدة.
ويرتبط أيضًا بالسياق الذي شُغِّلت فيه تلك العبارة: قاعدة البيانات المحددة، والخادم والمستخدم اللذان أُرسلت إليهما، وقيم معاملات الاستعلام. فقد يشير النص نفسه إلى أعمدة مختلفة عند تغيير أيٍّ من هذه العناصر — مثل SELECT * FROM events بعد تبديل قاعدة البيانات، أو SELECT * FROM {tbl:Identifier} بعد تحرير المعامل — لذلك يُلغى الشكل في هذه الحالة أيضًا، ويُرجع التشغيل التالي النتيجة دون إعادة تشكيل.
التنزيل والنسخ
الاحتفاظ بالحالة
sort_columns وfilters وpage وpage_size)، وفي سجل المتصفح، وفي لقطة النتائج الخاصة بكل علامة تبويب. لذلك، يؤدي إعادة تحميل الصفحة أو مشاركة الرابط أو التنقل للخلف والأمام إلى الاحتفاظ به. ولأن الشكل يحدد الصفوف، وليس طريقة عرضها فقط، فإن الرابط المشترك الذي يشغّل استعلامه تلقائيًا (run=1) يعيد تشغيله بالشكل نفسه، وبالتالي يعيد إنتاج النتيجة ذاتها. لا يُخزَّن إلا الشكل النشط — فالنتيجة بلا شكل لا تضيف شيئًا إلى URL أو حالة السجل — لإبقائهما موجزين.
تحتفظ النتيجة المستعادة بشكلها مرتبطًا بالسياق الذي نتجت عنه، كما هو موضح أعلاه: تسجل اللقطة قاعدة البيانات والاتصال وقيم المعلمات التي أُنتجت بها صفوفها، لذا فإن إعادة تشغيل العبارة بعد تغيير أيٍّ منها تلغي الشكل بدلًا من تطبيقه على نتيجة مختلفة.
كما هو الحال مع أوضاع الترميز اللوني والأعمدة المثبتة، يُحتفَظ بالشكل لكل علامة تبويب استعلام، لذا فإن فرز نتيجة أو تصفيتها في علامة تبويب لا يعيد تشغيل نتيجة علامة تبويب أخرى.
القيود
- يفشل الاستعلام إذا تعذّر على الخادم تطبيق شكلٍ ما، ويُعرض الخطأ كما في أي استعلام فاشل آخر. ثم يُسقَط الشكل، لأن التشغيل الفاشل لا يعرض لا الرؤوس ولا مرقّم الصفحات التي تزيله.
- يحدّد الفرز والتصفية العمود باسمه في النتيجة. وقد يظهر الاسم نفسه مرتين في النتيجة (
SELECT 1 AS x, 2 AS x، أو عند ربط جداول تتشارك أسماء الأعمدة)، ولا يمكن التمييز بين هذه الأعمدة بالاسم، لذا لا تتوفر لها عناصر تحكم للفرز أو التصفية؛ بينما تحتفظ الأعمدة ذات الأسماء الفريدة في النتيجة نفسها بعناصر التحكم الخاصة بها. - يتطلب فرز أعمدة متعددة الضغط على مفتاح Shift، لذا لا يتوفر على الأجهزة اللمسية؛ أما فرز عمود واحد فمتاح.
- لا يحتوي التخطيط Vertical (المنقول) لنتيجة ذات صف واحد على رؤوس أعمدة، وبالتالي لا توجد عناصر تحكم؛ ولهذا السبب تحتفظ النتيجة التي شكّلها المستخدم مسبقًا بتخطيطها الأفقي.