diff --git a/src/postings/postings_writer.rs b/src/postings/postings_writer.rs index d3f7f7583..a28c7302b 100644 --- a/src/postings/postings_writer.rs +++ b/src/postings/postings_writer.rs @@ -78,15 +78,6 @@ impl<'a> MultiFieldPostingsWriter<'a> { pub fn suscribe(&mut self, doc: DocId, term: &Term) { let postings_writer = self.per_field_postings_writers[term.field().0 as usize].deref_mut(); postings_writer.suscribe(&mut self.term_index, doc, 0u32, term, self.heap) - // let recorder: &mut Rec = self.term_index.get_or_create(term); - // let current_doc = recorder.current_doc(); - // if current_doc != doc { - // if current_doc != u32::max_value() { - // recorder.close_doc(heap); - // } - // recorder.new_doc(doc, heap); - // } - // recorder.record_position(position, heap); } pub fn serialize(&self, serializer: &mut PostingsSerializer) -> Result<()> { @@ -111,8 +102,8 @@ impl<'a> MultiFieldPostingsWriter<'a> { } } offsets.push((Field(0), term_offsets.len())); - for i in 0..offsets.len() - 1 { - let (field, start) = offsets[i]; + for i in 0..(offsets.len() - 1) { + let (field, start) = offsets[i]; let (_, stop) = offsets[i+1]; let postings_writer = &self.per_field_postings_writers[field.0 as usize]; postings_writer.serialize( @@ -214,13 +205,6 @@ impl<'a, Rec: Recorder + 'static> SpecializedPostingsWriter<'a, Rec> { impl<'a, Rec: Recorder + 'static> PostingsWriter for SpecializedPostingsWriter<'a, Rec> { - // TODO close documents before serialization. - // fn close(&mut self, heap: &Heap) { - // for recorder in self.term_index.values_mut() { - // recorder.close_doc(heap); - // } - // } - fn suscribe(&mut self, term_index: &mut HashMap, doc: DocId, position: u32, term: &Term, heap: &Heap) { let recorder: &mut Rec = term_index.get_or_create(term); let current_doc = recorder.current_doc(); @@ -240,7 +224,6 @@ impl<'a, Rec: Recorder + 'static> PostingsWriter for SpecializedPostingsWriter<' let mut term = Term::allocate(Field(0), 100); for &(term_bytes, addr) in term_addrs { let recorder: &mut Rec = self.heap.get_mut_ref(addr); - recorder.close_doc(heap); term.set_content(term_bytes); try!(serializer.new_term(&term)); try!(recorder.serialize(addr, serializer, heap)); diff --git a/src/postings/recorder.rs b/src/postings/recorder.rs index 05586858a..e4b11dbea 100644 --- a/src/postings/recorder.rs +++ b/src/postings/recorder.rs @@ -114,6 +114,7 @@ impl Recorder for TermFrequencyRecorder { self.current_tf = 0; } + fn serialize(&self, self_addr: u32, serializer: &mut PostingsSerializer, @@ -123,9 +124,15 @@ impl Recorder for TermFrequencyRecorder { loop { if let Some(doc) = doc_iter.next() { if let Some(term_freq) = doc_iter.next() { - try!(serializer.write_doc(doc, term_freq, &EMPTY_ARRAY)); + serializer.write_doc(doc, term_freq, &EMPTY_ARRAY)?; continue; } + else { + // the last document has not been closed... + // its term freq is self.current_tf. + serializer.write_doc(doc, self.current_tf, &EMPTY_ARRAY)?; + break; + } } break; } @@ -188,7 +195,8 @@ impl Recorder for TFAndPositionRecorder { } } None => { - panic!("This should never happen. Pleasee report the bug."); + // the last document has not been closed... + break; } } } diff --git a/src/schema/term.rs b/src/schema/term.rs index 387a32168..0c8a52af6 100644 --- a/src/schema/term.rs +++ b/src/schema/term.rs @@ -1,9 +1,8 @@ use std::fmt; use common; -use common::BinarySerializable; use common::allocate_vec; -use byteorder::{BigEndian, ByteOrder}; +use byteorder::{BigEndian, WriteBytesExt, ByteOrder}; use super::Field; use std::str; @@ -24,7 +23,7 @@ impl Term { /// Pre-allocate a term buffer. pub fn allocate(field: Field, num_bytes: usize) -> Term { let mut term = Term(Vec::with_capacity(num_bytes)); - field.serialize(&mut term.0).expect("Serializing term in a Vec should never fail"); + term.0.write_u32::(field.0).expect("serializing u32 to Vec"); term }