المحاور والإثراء
A pivot هو إثراء قابل للتشغيل: "أرني ما يحتويه المصدر أيضًا حول هذا الموضوع". أنت قم بإعلانها، وتقوم المكتبة بتشغيلها، وتجهيز النتائج للفرز، وإلزامها في عملية الفرز رسم بياني يوضح مصدر كل عنصر بمجرد أن يقول المحلل ذلك.
المشكلة التي يحلها هي أن العقدة المثيرة للاهتمام عادةً ما تحتوي على عدد كبير جدًا من الاتصالات. أ يمكن أن يرتبط مؤشر واحد بآلاف من المؤشرات الأخرى. لذا فإن المحور هو مكالمتين وليس الأول: مكالمة رخيصة توضح ما هو موجود، ومكالمة باهظة الثمن لا يتم تشغيلها إلا باستمرار وهو رقم وافق عليه المحلل.
المفردات المستخدمة باستمرار في كل مكان أدناه
- محور: الإثراء القابل للتشغيل
- provider: الوظيفتان اللتان توفرهما
- candidates: النتائج التي تم جلبها، ليست في الرسم البياني بعد
- ingest: إلزام المرشحين المختارين بالرسم البياني
- رفض: فصل صريح، يُذكر للجلسة
- المصدر: علامة المصدر مكتوبة على كل شيء يهبط عليه المحور
- حفظ: كتابة النتيجة المستوعبة مرة أخرى out، في النظام الذي جاءت منه
- غير محفوظ: على القماش، لم تتم كتابته بعد - عدد دقيق، وليس تقديرًا
summarize → fetch → triage → ingest → save
"2,143" the 210 the 12 on canvas in the source systemمطلوب fetch فقط. كل شيء آخر على هذا الخط هو خطوة تختارها.
شاهده يعمل: المحور والإثراء لـ تضييق التدفق، و رفض وإعادة المحاولة للفرز ودول الفشل.
استخدام واحد هو ما يفعله المحلل بالترتيب وما تكلفه كل خطوة الخلفية. كل شيء بدءًا من تسجيل واحد فصاعدًا هو المرجع لـ من يقوم بتوصيل واحدة، و ما يقدمه مصدرك هو نفس العقد المقروء من جانب الخدمة.
باستخدام واحد
1 · أدخل الوضع المحوري. اضغط على P، أو انقر فوق الفتحة Pivot الموجودة على السكة اليسرى. الفتحة موجودة فقط عندما يتم تسجيل محور واحد على الأقل. ولم يطلب أي شيء من أي الواجهة الخلفية حتى الآن، واختيار العقد أثناء إغلاق الوضع لا يطلب شيئًا أيضًا. اختيار المربع خمسون عقدة لسحبها يجب ألا تطلق خمسين استعلامًا.
2 · اختر أصلًا. الأصل هو مجموعة العقدة التي يدور حولها السؤال. اختر الأصل هو أداة الاستراحة، لذا فإن النقر العادي يضبطها. أصل لاسو يدور حول عدة. أيا كان تم تحديده بالفعل عندما دخلت الوضع يصبح الأصل، ويقوم Clear بإفراغه. الأصل الفارغ لا يزال له استخدامات: المحاور المعلنة origin: 'none' هي التي تنطبق عندما لا يتم اختيار أي شيء.
3 · اقرأ ما ينطبق. الدخول إلى الوضع هو القصد الذي يعمل summarize، مرة واحدة لكل المحور القابل للتطبيق، مجمعًا في مكالمة واحدة لأصل متعدد العقد. كل إدخال يظهر ما مطالبات مزودها موجودة هناك، مكتوبة كـ ~2,143. تشير التلدة إلى رقم الموفر أكد بدلاً من واحد أحصته المكتبة. يظهر المحور بدون summarize عاريًا تشغيل بدلاً من ذلك. إذا لم ينطبق أي شيء، فإن اللوحة تقول ذلك بدلاً من إظهار قائمة فارغة.
4 · ضيق حتى تفتح البوابة. محور يعلن maxCandidates يحتفظ جلب بعيدة المنال بينما العدد يتجاوزها، ويذكر العدد والحد والطريقة إلى الأمام. يؤدي تحديد عنصر تحكم التضييق إلى إعادة السؤال summarize مع هذا الاختيار، وبالتالي يصبح 2,143 210 و Fetch يتم تشغيله من تلقاء نفسه. التضييق الواضح يبدأ من جديد. بجانبه، جلب & استيعاب يعرض كل نتيجة على الرسم البياني دون مراجعة. يتم تقديمه فقط حيث المحور غادر autoIngest غير محدد.
**5 · فرز ما عاد. ** النتائج لا تلمس الرسم البياني. يقومون بفتح علامة التبويب مراجعة في الرصيف السفلي، جزء واحد لكل مزود قمت بتشغيله، مدرج أسفل جانبه. انقر في أي مكان في صف لوضع علامة عليه، انقر مع الضغط على Shift لحمل العلامة عبر نطاق ما، وحدد كل المطابقة n يحترم المرشح الحالي؛ صفوف البحث... المرشحات (التعبير العادي اختياري) وفرز الأعمدة. رفض المحدد و رفض كل ما تبقى تخلص من الصفوف بشكل صريح ويتم تذكرها للجلسة، بينما تقوم العلامة × بإغلاق الجزء فقط ولا ترفض أي شيء. إعادة التشغيل يسأل مرة أخرى بنفس التضييق. عند سفح الشريط، فشل الإغلاق يسقط كل عملية جلب لم يقم بإرجاع أي شيء و إغلاق الكل يفرغ قائمة الانتظار؛ ولا يرفض أي شيء أيضًا. المرشحون ليسوا الرسم البياني به الباقي.
6 · الاستيعاب والتراجع إذا كان خطأ. الاستيعاب المحدد (12) يرتكب بالضبط تلك اثني عشر، تم وضعها حول العقدة التي قمت بالتمحور منها وتم وضع علامة عليها بالمحور كمصدر لها. Ingest all 213 بجانبه يتخطى الوسم ويرتكب كل ما لا يزال المزود العرض، مهما تم تصفية الجدول ل. يقرأ النخب Ingested 12 nodes, 14 edges. استعادتها هي أداة التحكم في التراجع في الشريط العلوي، والتي تكون موجودة بشكل دائم وليس لـ طالما استمر النخب، ويعكس المسار بأكمله - حوافه وأي أطفال تم دمجه في المدرجة.
7 · احفظه مرة أخرى، إذا كان المحور قادرًا على ذلك. ** Ingest يضع الاثني عشر على القماش؛ لا اكتبهم في أي مكان. يوضح الجزء السفلي من اللوحة المحورية عدد العناصر التي تتضمنها هذه الجلسة تم سحبها وعدم كتابتها مرة أخرى، وحفظ** يكتبها. محور يعلن عدم وجود save لا تساهم أبدًا في هذا الرقم - راجع حفظ النتائج المحورية.
يؤدي الاستيعاب الذي لا يترك شيئًا للحكم عليه إلى إغلاق الجزء، وينتقل الشريط إلى الجزء التالي انتظار المزود. بقايا الطعام تبقيه مفتوحًا، وكذلك إعادة التشغيل التي تنتظره. مرة واحدة الأخيرة بعد انتقال الجزء، يتم طي رصيف المراجعة المفتوح مرة أخرى إلى حيث كان، وبالتالي يترك المحور التخطيط وجدت.
المحور بنقرة واحدة
الخطوات من 2 إلى 4 مخصصة لسؤال يستحق القراءة عنه أولاً. معظمهم ليسوا كذلك. انقر بزر الماوس الأيمن فوق عقدة، و Pivot ▸ يسرد كل محور ينطبق عليه مع ما يعلنه كل واحد. يؤدي اختيار صف إلى تشغيله هناك وبعد ذلك: لا توجد لوحة، ولا يوجد شيء لملءه. الأصل هو التحديد عندما تنتمي العقدة التي تم النقر عليها إليها وتلك العقدة وحدها بخلاف ذلك، لذلك يتم إجراء محور مجمع يمكن الوصول إليه دون مغادرة القائمة.
فتح القائمة الفرعية هو أيضًا ما يسأل. كل محور مع summarize يتم وضع سؤال خاص باللوحة، هذا الأصل مع لم يضيق شيء، وصفه يحمل نائبًا حتى يصل العد: ~2,143، الاستشارة مثل كل رقم يعلن عنه مقدم الخدمة. المحور الذي يعلن عن لا شيء لا يظهر أي شيء و يعمل بنفس الطريقة. يتم طرح الأسئلة فقط بمجرد الضغط على القائمة الفرعية للحظة عبور المؤشر المحور ▸ في طريقه إلى مكان آخر لا يسأل شيئًا، ويتم إلغاؤه إذا يغلق أولا. يتم تخزين الإجابات مؤقتًا في كلا الاتجاهين: يتم رسم النظرة الثانية مرة واحدة، واللوحة يعيد استخدام ما تعلمته القائمة. يمكن للسجل الأطول من القائمة الاحتفاظ باللفائف وقطع الصف الأوسط لذلك يقرأ على أنه مستمر.
يعتمد مكان ظهور النتائج على عدد النتائج الجديدة في اللوحة القماشية:
- ما يصل إلى
pivotQuickIngestLimitمرشحين جدد (50 افتراضيًا) الأرض مباشرة، مع وضع علامة عليها و غير قابل للإلغاء مثل أي استيعاب آخر. - أكثر من ذلك افتح علامة التبويب مراجعة بدلاً من ذلك، تمامًا كما تفعل لوحة التشغيل.
- رفض الحد الأقصى يحدث قبل جلب أي شيء، لذلك ليس هناك ما يمكن مراجعته. ال تفتح اللوحة المحورية على ذلك المحور بالرقم والتضييق الذي يرفعه.
صف يجري ولا شيء يضيق. عندما يكون المحور الواحد عبارة عن عدة جولات، يختار المحلل بين، مثل إثراء كائن من خلال إحدى سماته، أعلن menuChoices: يفتح الصف بعد ذلك قائمة فرعية تحتوي على صف واحد لكل اختيار، كل منها يقوم بتشغيل المحور الخاص به تضييق، والصف الأخير فتح اللوحة على هذا المحور. إنه متزامن ويعمل لكل منهما وقت فتح القائمة، مثل appliesTo. يؤدي رفض الحد الأقصى من الاختيار إلى فتح اللوحة الموجودة على تضييق الاختيار. العودة [] لصف عادي.
menuChoices: ([object]) => attributesOf(object).map((a) => ({
label: `${a.type}: ${a.value}`,
narrowing: { attribute: [a.id] },
})),المرشحون الموجودون بالفعل على اللوحة ليسوا جددًا ولا يملأون الحد أبدًا، لذا أعد تشغيل المحور تظل الأرض التي قمت بتغطيتها بمثابة لفتة بنقرة واحدة. حافة بين عقدتين موجودتين بالفعل على الشاشة لا يحسب، لأنه صف كنت ستُسأل عنه لولا ذلك. محور ذلك أعلن autoIngest سبق أن أجاب على السؤال وإجابته تحمل: true يهبط دائمًا، false يراجع دائمًا. يتم تحديد الحد فقط للمحاور التي تركته غير منضبط، وفقط لهذه البادرة؛ لوحة الجلب مراحل دائمًا.
حتى يتم معرفة الإجابة، لم يقدم السباق أي شيء، لذلك لا يتطلب الأمر أي شيء على الشاشة ليقوله إنه يعمل. تنضم علامة التبويب Review إلى قراءة شريط الإرساء Review… أثناء عملية الجلب للخارج، دون فتح الرصيف أو تقديم لوح للأمام؛ انقر فوقه لمشاهدة التشغيل أو إلغائها. فقط النتيجة التي تحتاج إلى اتخاذ قرار بشأنها هي التي تتقدم، والجري الذي يهبط يأخذه علامة التبويب بعيدا معها. الإجابتان اللتان ليس لهما ما يمكن تحديدهما هما جواب المُخطر: أ فشل الجلب يقول ذلك مع إعادة المحاولة، ونتيجة على المطلق candidateCeiling يقول العدد والحد.
ثلاث طرق للدخول، إذن: وضع السكة، قائمة سياق العقدة Pivot ▸ القائمة الفرعية (غائبة، أبدًا معطل، عندما لا ينطبق أي شيء)، ومع pivotRimBadgeVisible: 'always'، شارة حافة، والتي تفتح الوضع المحدد لمحورها الخاص، أو حيث تحمل الحافة شارة واحدة لجميعهم، إلى العقدة. شارة للعقدة باستخدام محور واحد فقط لا يوجد لديه ما يضيقه، يتم تشغيله مباشرة، مثل صف القائمة.
تسجيل واحد
ثلاثة أبواب، وسجل واحد، بالترتيب الذي ستصل إليه:
// 1. Options, at construction. Lands before the UI is built, so the rail button is
// already right on the first paint.
const graph = new Pivotick(el, data, { pivots: [correlations] })
// 2. Imperatively, at any point. Returns a disposer.
const remove = graph.pivots.register(correlations)
// 3. From a plugin's install, beside addPanel / addDockTab / addRailMode.
ctx.addPivot(correlations)graph.pivots هو التسجيل ووقت التشغيل. for()، run()، undo()، invalidate() والنموذج المرشح كل ذلك يتدلى منه.
مزود كامل
كل ما يحتاجه المحور العامل، دون ترك أي شيء. بقية هذه الصفحة هي مرجع لكل قطعة؛ هذا هو الشيء الذي يجب نسخه أولاً وتقطيعه.
post أدناه هو مساعدك JSON — فهو يرمي على غير 2xx ويمرر signal من خلاله، لذا يُقرأ المحور على أنه العقد وليس على أنه HTTP.
const correlations = {
id: 'correlations', // the provenance tag written on everything it lands
label: 'Correlations', // shown verbatim, so translate it yourself
maxCandidates: 2000, // refuse to fetch while the count is above this
// Which nodes this offers itself for — return the ones you accept, and a mixed
// selection runs it against just those. Omit it and it applies to everything.
appliesTo: nodes => nodes.filter(node => node.getData()?.type !== 'case'),
// The cheap call: what is out there, and what you could narrow by.
summarize: async (nodes, narrowing, { signal }) => {
const { total, byType } = await post('/api/correlations/count', {
ids: nodes.map(node => node.id),
types: narrowing.type ?? [], // pass the narrowing on so the count tracks it
}, signal)
return {
total, // judged against maxCandidates
facets: [{
key: 'type', // the key you read back out of `narrowing`
label: 'Type',
type: 'multiselect',
options: byType.map(row => ({ label: row.label, value: row.value, count: row.count })),
}],
}
},
// The expensive call: a flat fragment, run only on a number the analyst agreed to.
fetch: async (nodes, narrowing, { signal }) => {
const { items } = await post('/api/correlations', {
ids: nodes.map(node => node.id),
types: narrowing.type ?? [],
}, signal)
return {
nodes: items.map(item => ({
id: item.uuid, // an id already on canvas is skipped, never overwritten
data: { label: item.value, type: item.type, seen: item.first_seen },
})),
edges: items.map(item => ({
from: item.origin_uuid, // both endpoints must land for the edge to land
to: item.uuid,
data: { type: 'correlation' },
})),
}
},
// The write half, and the only optional one here. Omit it and this pivot's results
// are *not savable* — never counted unsaved, and no Save offered. See below.
async save({ origin, nodes, edges }, ctx) {
const written = await post('/api/correlations/save', {
event: origin[0]?.id,
nodes: nodes.map((node) => node.getData()),
}, ctx.signal)
return {
savedNodeIds: written.ok,
savedEdgeIds: edges.map((edge) => edge.id),
message: written.refused ? `${written.refused} refused by the server` : undefined,
}
},
}
new Pivotick(document.querySelector('#graph'), data, { pivots: [correlations] })أربعة أشياء يسهل ارتكاب الأخطاء فيها، جميعها مرئية أعلاه:
narrowingهو شرف لك. يصل كـ{ [facetKey]: value }باستخدام المفاتيح أعلنت الجوانب الخاصة بك. تجاهله أمر قانوني، ولكن بعد ذلك لا يتحرك العد أبدًا ويتحول إلى محور فوق الغطاء لا يمكن أبدًا فتحه.signalليس أدبًا اختياريًا. يُلغى ترك الوضع المحوري أو تغيير الأصل أسئلة في الرحلة. قم بتمريرها إلى كل طلب، أو ستدفع مقابل الإجابات التي لا ينتظرها أحد ل.ctx.isStale()هو نفس الفحص لوسائل النقل التي لا تأخذ أي إشارة.- رمية للفشل، إرجاع فارغة لفارغة. يظهر خطأ تم رميه على المحور الدخول باستخدام إعادة المحاولة.
{ total: 0 }هو صادق "لا شيء هناك"، ويقرأ الاثنان بشكل مختلف تمامًا عن المحلل. - قل عندما لا تعلم. المصدر الذي سُئل على الهواء مباشرة قد لا يكون له إحصاء قبل أن يجيب. العودة
{ total: null, facets }: لم يتم سحب العد،maxCandidatesلا يرفضه، وcandidateCeilingلا يزال يحد ما يعودfetch.0سيدعي أنه لا يوجد شيء. - المعرفات هي مفتاح الحذف. قم بإرجاع المعرف الثابت للنظام المصدر، وليس معرفًا لكل استجابة، أو تؤدي كل عملية إعادة تشغيل إلى نفس العقد مرة أخرى كمرشحين جدد.
عقد المزود
interface PivotDefinition {
id: string // provenance tag, menu key, triage key
label: string // used verbatim, so it can be translated
icon?: string // trusted SVG, injected as-is
origin?: 'selection' | 'none'
appliesTo?: (nodes: Node[]) => boolean | Node[]
summarize?: (nodes: Node[], narrowing: PivotNarrowing, ctx: PivotContext) => PivotSummary | Promise<…>
fetch: (nodes: Node[], narrowing: PivotNarrowing, ctx: PivotContext) => PivotResult | Promise<…>
autoIngest?: boolean
maxCandidates?: number
save?: (payload: PivotSavePayload, ctx: PivotSaveContext) => PivotSaveOutcome | Promise<…>
autoSave?: boolean
}تأخذ كلتا الاستدعاءات صفيف من العقد، لذا فإن المحور على خمسين منها هو طلب خلفي واحد بدلا من الخمسين. كلاهما يأخذ التيار التضييق. كلاهما يحصل على PivotContext يحمل signal وisStale()، نفس نمط الإلغاء الذي يستخدمه كل خطاف غير متزامن في المكتبة.
appliesTo: الأصل كله، أو بعضه
قم بإرجاع منطقية لقاعدة حول الأصل ككل، والعقد التي تقبلها لـ قاعدة تقرأ عقدة واحدة في كل مرة. المصفوفة الفارغة تعني نفس الشيء مثل false.
appliesTo: nodes => nodes.length >= 2 // whole origin
appliesTo: nodes => nodes.filter(n => n.getData()?.type === 'domain') // per nodeيكون نموذج كل عقدة مهمًا بمجرد خلط التحديد: يتم اختيار المجال وعنوان IP معًا يحتفظ كل منهم بمقدمي الخدمات الخاصين به بدلاً من ترك فقط أولئك الذين يقبلون كليهما، و تقول اللوحة ذلك في الإدخال - ينطبق على 3 من أصل 5 مختارة.
ومهما احتفظ فهو الأصل الذي يسمى به المقدم: summarize و fetch لا ترى أبدًا عقدة تم رفضها، ويتم مفتاح الملخص المخزن مؤقتًا بواسطة هذا الأصل الضيق. يتم إعادة قراءته عند كل تغيير للأصل، لذا اجعله متزامنًا ورخيصًا.
graph.pivots.for(nodes) // everything that applies, partially included
graph.pivots.originFor('whois', nodes) // the share this one would run onاستدعاء run بأصل يرفضه المحور بالكامل يحل 'failed' بدلاً من الجلب على أصل فارغ - الجري الذي بدا جيدًا ولم يجيب على شيء سيكون أسوأ.
summarize : الرخيص
تظهر بالكامل تحت مزود كامل. total هو الرقم يتم الحكم على الغطاء، ويصبح facets ضوابط التضييق: أنت تعلن الشكل، المكتبة ترسم الحاجيات. قم بتمرير التضييق إلى الواجهة الخلفية لديك حتى يتتبع العد ماذا اختار المحلل، وإلا فلن يتم رفع البوابة أبدًا.
يمكن أن يعلن الوجه عن default: قيم الخيار multiselect تبدأ بعلامة، أو القيمة أ select أو boolean تبدأ من. ترسمه اللوحة و التضييق الواضح يعود إلى عليه، ولكن يبقى المفتاح خارج نطاق التضييق أثناء الاحتفاظ به، لذا يجب على مزود الخدمة الخاص بك قراءة ملف المفتاح المفقود كافتراضي. يتم إرسال multiselect فارغًا بالقيمة الافتراضية كـ []، والذي يعني لا شيء.
{ key: 'element', label: 'Element', type: 'multiselect', default: ['attribute', 'object'],
options: [/* attribute, object, tag, … */] }احذف summarize بالكامل ولا يقدم المحور أي عد أو تضييق، فقط Run زر. هذا قانوني، ومن ثم يجب أن يكون fetch آمنًا للاتصال بالمكفوفين، لأنه لا يوجد شيء يمكنه البوابة ذلك.
التهم استشارية. دائماً.
summarize يرجع دعوى وليس عقدا، ويختلف شرعا عما استوعب الأراضي: الحذف أولاً، ثم الأذونات، والجفاء، والمقدمون الذين يتعمدون التقريب. تحدد واجهة المستخدم الفرق بعلامة التلدة — ~2,143 correlations هو رقم الموفر، بينما 210 fetched و 12 selected خاصتان بالمكتبة. الانكماش ليس خطأً أبدًا، و العد لا يكون أبدًا حاملاً للتخطيط.
fetch: الحقيقي
إرجاع جزء مسطح: { nodes: RawNode[], edges: RawEdge[] }. لم يتم إرجاع أسماء العقدة الأصل الموجود على القماش. يسافر التعشيش في RawNode.children، لذا تصل الحاوية كـ عقدة جديدة تحمل الشجرة الفرعية الخاصة بها. نتيجة الحواف فقط قانونية: الحواف التي تنتهي نقاطها كلها موجودة بالفعل على القماش لتصبح صفوف فرز خاصة بها.
أنواع الواجهة
يستخدم التضييق كل نوع من أنواع الجوانب التي يعرفها محرك الاستعلام باستثناء regex، وهو ما لا تستطيع الواجهة الخلفية القيام به يُطلب منه التقييم: text، select، multiselect، numberRange، boolean. يعيش ريكس في مرشحات جانب العميل الخاصة بجزء الفرز، حيث تكون الصفوف في متناول اليد بالفعل.
كيف ترسمهم اللوحة، ومن أين يأتي خط التقسيم
يتم رسم multiselect كقائمة من مربعات الاختيار مع كل خيار وcount على الشاشة، وبالتالي فإن الأرقام التي تقوم بتضييقها تظل مرئية أثناء تضييقها. خيار واحد select تظل قائمة منسدلة وتحمل أعدادها في تسميات الخيارات.
تحت المجموع اللوحة تطبع ما هي مصنوعة مأخوذة من الأول multiselect الوجه: تلك الخيارات تقسم النتيجة. بمجرد اختيار هذا الجانب أو إرساله أو بشكل افتراضي، يتم سرد الخيارات المختارة فقط. تُعد أعداد الجوانب ذات الاختيار الواحد بدائل بدلاً من الأجزاء، لذلك لا يتم جمعها هناك.
النابضة: الغطاء، والسقف
maxCandidates: 2000 // per pivot: refuse to fetch while the count exceeds it
new Pivotick(el, data, { pivotCandidateCeiling: 10_000 }) // absolute, all pivotsكلاهما يرفض، ولا يقتطع أو عينات. الرفض يحمل دائمًا ثلاثة أشياء النظام: العدد، الحد، والطريق إلى الأمام. "نتائج كثيرة جدًا" بدون رقم ليست كذلك شيء يمكن للمحلل التصرف عليه.
يتم الحكم على الحد الأقصى بناءً على أحدث إحصاء للتضييق الحالي، وهو ما يسمح به رفع. تضييق من 2,143 إلى 210 ويتم تشغيل Fetch من تلقاء نفسه. السقف يدور حول الذاكرة للكائنات المرشحة وليس حول الجدول، الذي افتراضيا.
المرشحين ليسوا الرسم البياني
لا يوجد شيء يُرجعه المحور في الرسم البياني أو في جدول البيانات أو في أي عدد من الأوجه حتى يتم ذلك يتم تناوله. النتائج التي تم تنظيمها للفرز افتح علامة التبويب مراجعة — جزء واحد لكل محور، مدرج كعمودي علامات التبويب على جانبها، ولكل منها عددها الخاص ومخرجها الخاص - مع الموفر الخاص بها الأعمدة، ومرشحات جدول البيانات، والفرز، والترحيل، وإجراءات الاستيعاب.
- الرفض صريح ومتذكر للجلسة، مفتاح لكل محور. المدى القادم لا يقدم هذا المرشح مرة أخرى، ويوضح السطر الرئيسي عدد الأشخاص الذين تم قمعهم. أ يتم ضرب الصف المرفوض في مكانه بدلاً من نقله، ويظل قابلاً للعكس.
- ** ما يعيق المحور يتم إدراجه في إدخاله** في لوحة المحور، المسماة باسم أطلق عليه الجدول اسم، مع استعادة في كل صف واستعادة الكل تحتها. يبقى هناك بمجرد إغلاق الجزء، يمكن إعادة النظر في الرفض دون تشغيل المحور مرة أخرى للعثور عليه.
- العقد والحواف عبارة عن كتل منفصلة، يتم تسمية كل منها واحتسابها عندما يعيد التشغيل كليهما. وتكون نتيجة الحواف فقط عبارة عن جدول خاص بها، وليس جزءًا فارغًا.
- يتم فتح صف حاوية. تحمل أطفال عدد ما تحمله مباشرة، و تسرد علامة الإقحام المحتويات، مع السمات المشتركة لكل طفل وملاحظة مكان وجود الطفل نفسها حاوية. إن فتح صف لا يعني وضع علامة عليه، ولا يمكن التقاط أي شيء بداخله خاص - استيعاب الصف يأخذ الحاوية بأكملها.
- **إغلاق المزود لا يرفض أي شيء. ** بقايا الطعام غير المرتبة تعود في الجولة التالية. رفض كل ما تبقى هي الإيماءة الوحيدة التي تتخلص منهم.
- ** تؤدي إعادة التشغيل إلى استبدال جزء الموفر.** إذا كان لديك صفوف تم وضع علامة عليها، فهذا يعني ذلك والعروض عرض الجديد / استمر في الفرز، بدلاً من رمي الفرز دون أن يُطلب منك ذلك.
- انضم إلى مجموعة يتم وضع الصفوف المحددة مطوية، مجموعة واحدة لكل نوع، خارج الأصل. انظر الهبوط المحوري. يتم تقديمه ما لم يكن
UI.simplifyمغلق. معpivotIngestGrouped: true، يتم تجميع كل هبوط والزر يقرأ Ingest فضفاضة بدلاً من ذلك.
كل ما يفعله الجزء يمكن الوصول إليه برمجيًا أيضًا:
graph.pivots.candidates('correlations') // the staged set
graph.pivots.mark('correlations', id) // …markAll / reject / rejectRemaining
await graph.pivots.ingest('correlations') // commit the marked ones
await graph.pivots.ingest('correlations', 'triage', { group: true }) // …folded, one group per type
graph.pivots.discard('correlations') // close it; rejects nothing
graph.pivots.rejectedRows('correlations') // what the session is holding back
graph.pivots.unreject('correlations', id) // …unrejectAll for every one of themautoIngest
للحصول على نتيجة صغيرة وموثوقة لا يرغب أحد في الوصول إليها، مثل توسيع الحاوية في أطفاله العشرات، أعلن autoIngest: true. النتائج تهبط مباشرة، والشريط العلوي التراجع عن إعادتهم مثل أي استيعاب آخر. الموفر هو من يقرر ذلك، لأنه هو الوحيد الذي يعرف ذلك ما إذا كانت نتائجها صغيرة وموثوقة بما يكفي لتخطي الفرز.
إن تركها بدون ضبط ليس مثل false. تقول أن المحور ليس لديه رؤية، مما يترك أ محور بنقرة واحدة حر في تحديد الحجم وحده؛ false يقول النتائج تحتاج دائمًا إلى النظر إليهم، ويتم تكريمه كيفما بدأ السباق.
autoIngest: true // always lands
autoIngest: false // always reviewed
// unset: a one-click run decides on size
new Pivotick(el, data, { pivotQuickIngestLimit: 50 }) // that size, all pivotsمهما كانت الأراضي، من هنا أو من المراجعة، يمكن أن تصل مطوية مجموعات الهبوط بدلًا من السائبة:
new Pivotick(el, data, { pivotIngestGrouped: true }) // every landing, one group per typeالاستيعاب، وما يجوز القيام به
لفتة واحدة، دفعة واحدة، واحدة dataBatchChanged، بهذا الترتيب:
- Dedup — يتم تخطي المعرف الموجود بالفعل على القماش، ولا تتم الكتابة فوقه أبدًا، سواء كان موجودًا عندما تم تنظيم المرشحين أو هبطت جولة أخرى أثناء انتظارهم.
- اتحاد الاطفال بالهوية
- الموضع بالقرب من العقدة الأصلية، متوتر. يفوز الموفر
x/y، و قم بتشغيل البذور بدون أصل في مركز منفذ العرض. - المصدر، ثم تهبط الدفعة.
الاستيعاب هو مضافة بحتة. الأشياء الوحيدة التي يمكن إزالتها هي removeBySource والتشغيل تراجع.
بوابة واحدة، تسمى مرة واحدة مع المجموعة بأكملها:
callbacks: {
onBeforeIngest: async ({ pivotId, origin, candidates, trigger, confirm }) => {
if (candidates.nodes.length < 50) return true
return await confirm({ title: `Add ${candidates.nodes.length} nodes?` })
},
}العودة false إلى حق النقض، أو { accept: true, nodes, edges } للهبوط بمجموعة فرعية. مفتاح مهمل تعني "حسب الطلب"، تمامًا كما يقرأ onBeforeDelete.
المصدر
تحمل كل عقدة وحافة مجموعة من المصادر التي تؤكد ذلك. مجموعة بدلا من العددية، لأن تداخل محورين على عقدة واحدة هو الحالة العادية. مع العددية، و ثاني وصول يمحو مطالبة الأول، وإزالة أي منهما يأخذ العقدة ذلك.
node.getSources() // ['seed', 'correlations'], where 'seed' is the loaded data
node.hasSource('correlations')
edge.getSources() // edges carry it too, which is the load-bearing half
graph.removeBySource('correlations') // drop the tag; delete only when the set emptiesأخذ الجري إلى الوراء
الاستيعاب هو إدخال واحد في graph.history، إلى جانب الأشياء الأخرى التي تغير ما يحمل القماش: المحذوفات، والجلود المتينة، والعناصر المرسومة باليد.
graph.history.entries() // newest first; a pivot entry's `id` is its runId
graph.history.undo() // the newest entry
graph.history.undo(runId) // that ingest, and contiguously anything done since
graph.history.redo() // re-lands the recorded delta; no refetch, no re-gatingالتراجع هو مجاور: يؤدي استهداف الإدخال الأقدم إلى عكس كل إدخال فوقه أيضًا، كما دفعة واحدة. عكس مسار واحد قديم من تلقاء نفسه هو graph.removeBySource(pivotId)، والذي يسقط يضمن ذلك المصدر ويحذف فقط ما لا يضمنه أي شيء آخر - عملية للأمام، مسجلة كواحدة.
الاستيعاب الجزئي لمجموعة مرحلية واحدة يحصل على runId خاص به، لذلك تكون كل دفعة منفصلة دخول. والتراجع عن الإدخال الذي لا يزال هو الإدخال الأحدث ** يعيد مرشحيه مرة أخرى جزء المراجعة** بدلاً من مطالبة الموفر بذلك مرة أخرى. انظر التراجع والتاريخ لكامل الأمر.
حفظ النتائج
Ingest يضع المرشحين على اللوحة القماشية؛ لا يكتب لهم في أي مكان. محور يعلن save يمكنه دفع نتائجه مرة أخرى إلى النظام الذي أتت منه، وتحتفظ المكتبة بالنتائج دفتر الأستاذ: ما هي العناصر التي تم إنشاؤها أثناء التشغيل، وما إذا كانت مكتوبة، وما هي العناصر التي فشلت، و ما يجب أن تحمله إعادة المحاولة.
حذف save ونتائج المحور غير قابلة للحفظ. لا تدخل إلى دفتر الأستاذ أبدًا، فهي لم يتم احتسابها مطلقًا على أنها غير محفوظة، ولا يظهر أي حفظ لها. هذا هو الإعلان الصحيح للمحور عبر البيانات المشتقة - مخرجات محرك الارتباط ليست ملكك لتكتبها مرة أخرى - بل هي ما يوقف "210 غير محفوظ" بشكل دائم بدون علاج.
كل ذلك، بما في ذلك عمليات الكتابة الجزئية، وإعادة المحاولة، والمعرفات التي يعدها النظام المصدر وما إلى ذلك التراجع سوف ولن يصل إلى: حفظ النتائج المحورية.
وضع السكك الحديدية المحورية
استخدام واحد يمشي على السطح. ما يهم عندما تقوم بالتكوين بدلاً من قيادته: الدخول إلى الوضع هو القصد الذي يستدعي المزود - كما هو الحال مع الانتظار محور ▸ مفتوح في قائمة السياق - يؤدي تركه إلى إيقاف كل سؤال أثناء الرحلة، و الاختيار وحده لا يكلف شيئا. التحديد هو أيضًا إيماءة السحب والتصميم والتجميع تحرير، لذلك لا تستدعي المكتبة أبدًا المزود بشكل تخميني.
الوضع مغلق على التسجيل:
UI: { pivotMode: 'auto' } // default: the button exists only while a pivot is registered
UI: { pivotMode: true } // force it, for pivots that arrive asynchronously
UI: { pivotMode: false } // neverوبالتالي فإن المستهلك الذي لا يسجل أي محاور لا يرى أي أثر لهذه الميزة. لم يكن أبدا مثبتة في الوضع viewer أو static.
محاور بلا أصل
لا تحتوي بعض عمليات الإثراء على عقدة للتشغيل عليها، مثل البحث أو الاستيراد أو لصق قائمة المؤشرات. أعلن origin: 'none' ويستقبل المحور []، وينطبق عندما يكون الأصل فارغة، وتطوى في مجموعة بدون أصل بمجرد اختيار واحدة. طريق النتائج من خلال نفس جزء الفرز، نفس البوابة ونفس نموذج المصدر، ويهبطون في مركز منفذ العرض.
appliesTo لا معنى له بالنسبة لواحد من هؤلاء ولا يستشير فيه.
الإمكانات المعلنة
تلميح على حافة العقدة، يقول "هناك 2100 ارتباط هنا"، وضعه هناك من قبل أي شخص تحميل البيانات.
node.setPotential('correlations', 2100) // 0 clears it
node.getPotential('correlations')
node.setPotential(2199) // the total across every pivot
node.getPotential()لقد تم إعلان، لم يتم الاستعلام عنه أبدًا. لن تقوم المكتبة باستدعاء مقدم الخدمة لرسم شارة، لأن العد الذي يتحقق على عقدة واحدة في اللحظة التي تم السؤال عنها سيترك قماش يحكي قصتين مختلفتين. يؤدي النقر فوق الشارة إلى فتح الوضع المحوري المخصص لذلك المحور.
مثل أي جهاز ضبط آخر على Node، فإنه يشير إلى العقدة القذرة: اتصل بـ graph.renderer.update() إذا لم يكن هناك شيء آخر على وشك تقديمه.
ما ترسمه الحافة
افتراضيًا، تظهر شارات الحافة فقط عندما يكون الوضع المحوري مفتوحًا، حيث تساعد في اختيار أصل؛ يؤدي النقر فوق أحدها إلى توسيع نطاق اللوحة إلى تلك العقدة والمحور. pivotRimBadgeVisible التغييرات عندما تظهر:
new Pivotick(el, data, { pivots, pivotRimBadgeVisible: 'always' })
graph.pivots.rimBadgeVisible = 'pivot-mode' // or later; it dirties every node'pivot-mode' (افتراضي) | فقط عندما يكون وضع السكة المحورية مفتوحًا. |
'always' | مهما كان الوضع، فإن الشارة هي أيضًا وسيلة للدخول إلى الوضع المحوري. |
'never' | لا على الاطلاق. |
بمجرد إظهارها، يكون شكلها هو الخيار التالي.
تحتوي العقدة على أربع زوايا حافة، واثنتين فقط عندما يكون لديها أطفال - القدرة على التوسيع يحتفظ بالجانب الشرقي. لذا فإن شارة واحدة لكل مزود يمكن قراءتها في حفنة قليلة ومن المستحيل عندها مائة. pivotRimBadge يختار الشكل:
new Pivotick(el, data, { pivots, pivotRimBadge: 'summary' })
graph.pivots.rimBadge = 'per-pivot' // or later; it dirties every node'per-pivot' (افتراضي) | شارة واحدة لكل محور تعلن عن إمكانية، كل منها يفتح هذا المحور. ينهار العديد منهم في +n مبكرًا في عقدة مع الأطفال. |
'summary' | شارة One مهما كان عدد المزود. إنه يُظهر الإجمالي المعلن بدون معرف محوري، أو - بدون أي شيء معلن - عدد المحاور المطبقة. |
'off' | لا شيء. NodeStyle.badges لا يزال يرسم. |
ما الذي تفعله شارة summary عند النقر عليها ومن أين يأتي عددها؟
في summary الشارة عبارة عن إيماءة واحدة: فهي تفتح اللوحة المحورية على تلك العقدة، لأنه في أي وقت الموفر الحقيقي يحسب اللوحة حيث يتم إجراء التهم والاختيار. الاستثناء هو عقدة حيث ينطبق محور واحد بالضبط و يعلن لا summarize — لا يوجد شيء للقراءة أولاً و لا شيء لتضييقه - حيث يتم تشغيله بواسطة النقر. حيث تصل النتيجة إلى مكالمة الموفر الخاصة: autoIngest يقرر بين اللوحة القماشية وجزء الفرز، كما هو الحال في أي مكان آخر.
يتم اشتقاق عدد مرات تطبيق المحاور، وليس الإعلان عنها، لذلك لا يتطلب الأمر الاتصال بمزود الخدمة. يتم عقده بين تغييرات الرسم البياني والتحديث عند تحرك السجل أو عقد الرسم البياني؛ appliesTo قراءة شيء آخر يمكن أن يتأخر على الحافة، واللوحة هي دائمًا الإجابة الدقيقة.
التخزين المؤقت
تقوم المكتبة بتخزين شيء واحد مؤقتًا: summarize النتائج، بمفتاح بواسطة (المحور، الأصل، التضييق)، لأن الملخص متعدد التحديد هو مجموع لا يمكن أن يتحلل أي شيء. كل شيء آخر هو لك:
graph.pivots.invalidate() // all of it
graph.pivots.invalidate('correlations') // one pivot's
graph.pivots.invalidate('correlations', nodes) // only what was asked about theseتنتمي المصادقة وإعادة المحاولة وتحديد المعدل وأي ذاكرة تخزين مؤقت خاصة بك إلى وظائف المزود الخاص بك، وهي وظائف واضحة كتبتها.
ما يقدمه مصدرك
الصفحات أعلاه مخصصة لمن يكتب الموفر. وهذا هو نفس العقد قراءة من الجانب الآخر لمن يملك الخدمة التي يدعوها.
- مكالمة جلب، إرجاع الأشياء وعلاقاتها. المطلوب الوحيد . اثنان الأشياء المتعلقة بهذا الأمر مهمة: يستغرق الأمر ** العديد من المعرفات في طلب واحد**، لذا يتم المحور على خمسين عقدة تكلف مكالمة واحدة، والمعرفات التي تُرجعها تكون مستقرة عبر عمليات التشغيل، لأن هذا هو ما مفاتيح إلغاء الحذف قيد التشغيل. يؤدي معرف كل استجابة إلى ظهور نتائج الأمس مرة أخرى كمرشحين جدد.
- ** مكالمة عد**، أخذ نفس المعرفات ونفس المرشحات، وإرجاع الإجمالي و يتم حساب القيمة لكل شيء يمكن تضييقه. وهو ما يجعل البوابة و تضييق العمل، ويعاد طلبه على كل تغيير يطرأ عليهم، لذلك يجب أن يكون رخيصاً. التقريبي جيد: التهم استشارية. بدون واحد أ لا يزال المحور يعمل، بدون Run ولا يوجد شيء لبوابته.
- ** نفس المرشحات التي تم تكريمها من قبل كليهما.** العدد الذي يتجاهلها لا يتحرك أبدًا، لذا فإن المحور فوق غطائه لا يمكن أبدًا فتحه.
- طريقة للإلغاء. يتم التخلي عن الأسئلة عندما يتحرك المحلل، و
signalلا يستحق تسليم المزود إلا إذا كان النقل يعمل عليه. - اكتب مكالمة، إذا كانت النتائج لك، فاكتب مرة أخرى. يجب أن تعيد المعرفات إليه تم تعيينه، لذلك يمكن أن يتوقف
canonicalIdsتشغيل الغد يكرر ما تم حفظه، ويكون قادرًا على الإبلاغ عن نجاح جزئي.
يجب أن تخبر كلا مكالمات القراءة إجابة فارغة بصرف النظر عن الفشل: لا توجد نتائج حقيقة البيانات، الخطأ هو حقيقة حول الخدمة، ويتم قراءتها بشكل مختلف تمامًا عن الخطأ محلل.
لا شيء هنا يحتاج إلى ترقيم الصفحات أو المؤشر أو النقل المتدفق. التضييق هو ما يحل محل لهم.
ما هذا ليس
- لا يوجد تدفق ولا يوجد مؤشر للخادم. التضييق يحل محلهما: بدلاً من جلب اثنين ألف صف، اسأل عما هو موجود واترك للمحلل الاختيار. العقد لا يتطلب أبدا أ الواجهة الخلفية للبث، لأن العديد من المصادر لا تملك واحدة.
- لا توجد إعادة تربية. العقدة المرتجعة لا تذكر أحد الوالدين الموجودين أبدًا. اتحاد الأطفال عن طريق الهوية هي الطريقة الوحيدة لاستيعاب أبناء العقدة الموجودة.
- لا يوجد خاصية - تعديل التراجع.
graph.historyيغطي ما تحمله اللوحة القماشية ويظهرها - ما دخل، ما خرج، ما خفي. بيانات العقدة هي حالة الواجهة الخلفية التي لم تكن المكتبة كذلك المؤلف، لذا فإن إرجاع الحقل محليًا هو عملonBeforeNodeEditCommit، وليس عملنا. - لا توجد سياسة نقل.
saveيعيد الكتابة، ولكن بيانات الاعتماد، وإعادة المحاولة، وتحديد المعدل و اكتشاف الصراع هو كل ما يخص المستهلك. إعادة المحاولة الوحيدة للمكتبة هي ضغط المحلل إعادة المحاولة. - لا توجد ذاكرة رفض عبر عملية إعادة التحميل. الرفض هو حكم في سياق جلسة واحدة، وقد يستحق نفس المرشح إجابة مختلفة في رسم بياني آخر. الرفض هو عقدت للدورة وليس أبعد من ذلك.
- لا يوجد تحديث لما هو موجود هنا بالفعل. يترك المرشح المطابق للمعرف العقدة الحالية لم يمسها؛ إن التوفيق بين عقدة ونسخة أحدث يحتاج إلى سياسة تعارض في المكتبة ليس لديه.