أهلا،
إذا أعطيت prefix_iterator
بادئة أطول مما أعلنته في الخيارات ( set_prefix_extractor
).
لا تحصل على خطأ ولا تتجاهل بقية البادئة ، فهي تتصرف كبادئة مع من.
مثله:
set_prefix_extractor(len)
myp = &[1u8; len+1];
prefix(myp[..len]) + From(myp)
ومثال عملي فعلي:
let prefix_extractor = rocksdb::SliceTransform::create_fixed_prefix(1);
let mut opts = Options::default();
opts.create_if_missing(true);
opts.set_prefix_extractor(prefix_extractor);
let db = DB::open(&opts, &tempdir).unwrap();
db.put(&[0,0,0,0], &[0,0,0,0]).unwrap();
db.put(&[0,0,0,1], &[0,0,0,1]).unwrap();
db.put(&[0,1,0,1], &[0,1,0,1]).unwrap();
db.put(&[0,1,1,1], &[0,1,1,1]).unwrap();
db.put(&[0,1,2,1], &[0,1,2,1]).unwrap();
db.put(&[2,0,0,0], &[2,0,0,0]).unwrap();
db.put(&[2,2,2,2], &[2,2,2,2]).unwrap();
let me = db.prefix_iterator(&[0,1,0]);
for (key, value) in me {
println!("Saw {:?} {:?}", key, value);
}
سيؤدي هذا إلى طباعة هذه النتائج:
Saw [0, 1, 0, 1] [0, 1, 0, 1]
Saw [0, 1, 1, 1] [0, 1, 1, 1]
Saw [0, 1, 2, 1] [0, 1, 2, 1]
لذا فإن البايت الأول يتصرف مثل البادئة الحقيقية (يعطي تطابقًا تامًا) ، لكن الباقي ليس بادئة ولا يتم تجاهله ، يتم استخدامه كـ "من" (يمكنك أن ترى أن هذا يتجاهل كل شيء يبدأ بـ [0،0 ] ولكنها تتضمن وحدات بايت أكبر مثل [0،2])
هل هذا هو السلوك المطلوب أم أن هذا خطأ؟
أظن أن السلوك الذي تراه يرجع إلى كيفية تنفيذ المكتبة الأساسية. لست متأكدًا مما إذا كان هذا عن طريق التصميم أم "سلوك غير محدد".
elichai حسنًا للإغلاق أم تعتقد أن هذه مشكلة تتعلق
حسنًا ، لم أتحقق مما إذا كان موجودًا في كود C ++ ، لذا أتساءل.
ربما سأتحقق قريبًا عندما يكون لدي الوقت (ليس مطور C ++)
iSynaptic لست متأكدًا مما إذا كان هذا يستحق مشكلة منفصلة ،
لا تحتوي وظائف write_batch put
على أي try!
ومع ذلك فإنها تُرجع نتيجة.
هل هذا مقصود؟ لماذا ا؟
https://github.com/rust-rocksdb/rust-rocksdb/blob/master/src/db.rs#L1147
elichai أعتقد أنه سلوك مقصود ، حيث لا توجد فرصة
elichai أوافق الآن على أن prefix_iterator
يتصرف بغرابة ، لكن حسب التصميم. في # 254 ، أضفت اختبارًا يتحقق من السلوك ويتضمن تعليقًا يشرح السلوك (مقتبس أدناه). بناءً على السلوك الذي أعتقد أنه تريده ، ربما يجب عليك استخدام مكرر منتظم وتقديم ReadOptions
. تم تمكين هذا في # 253.
التفسير : يحدد
db.prefix_iterator
الخيارات الأساسية للبحث عن المفتاح الأول الذي يطابقprefix
بالكامل . من هناك ، سيستمر المكرر في قراءة الأزواج طالما أن البادئة المستخرجة منkey
تطابق البادئة المستخرجة منprefix
.
vitvakatualeksuss أعتقد أننا بحاجة إلى إلقاء نظرة على جميع الوظائف التي المكررات بناء وتبسيطها قدر الإمكان - فهي مربكة قليلا. لدي بعض الأفكار ويمكنني وضع العلاقات العامة معًا.