From 22ebd6cd5cb8e6c3fe43047a35c640a2ee723e70 Mon Sep 17 00:00:00 2001 From: Paul Masurel Date: Wed, 20 Jan 2016 00:21:52 +0900 Subject: [PATCH] blip --- src/core/directory.rs | 10 +++++- src/core/reader.rs | 84 +++++++++++++++++++++++-------------------- src/core/schema.rs | 6 ++++ 3 files changed, 61 insertions(+), 39 deletions(-) diff --git a/src/core/directory.rs b/src/core/directory.rs index 09fad819f..3642ab83d 100644 --- a/src/core/directory.rs +++ b/src/core/directory.rs @@ -18,7 +18,6 @@ use std::cell::RefCell; use core::error::*; use rand::{thread_rng, Rng}; - #[derive(Clone, Debug)] pub struct SegmentId(pub String); @@ -156,3 +155,12 @@ impl SharedMmapMemory { SharedMmapMemory(Arc::new(mmap_memory)) } } + +impl Borrow<[u8]> for SharedMmapMemory { + + fn borrow(&self) -> &[u8] { + let SharedMmapMemory(ref arc) = *self; + let mmap: &Mmap = arc.borrow(); + unsafe { mmap.as_slice() } + } +} diff --git a/src/core/reader.rs b/src/core/reader.rs index a2280a739..c1f6e9dee 100644 --- a/src/core/reader.rs +++ b/src/core/reader.rs @@ -1,47 +1,55 @@ use core::directory::Directory; use core::directory::Segment; use core::schema::Term; -// use fst::stream::Streamer; +use core::directory::SharedMmapMemory; +use fst::Streamer; use fst; +use std::borrow::Borrow; pub struct SegmentIndexReader { segment: Segment, term_offsets: fst::Map, + postings_data: SharedMmapMemory, +} + + +impl SegmentIndexReader { + + fn term_cursor<'a>(&'a self) -> SegmentTermCur<'a> { + SegmentTermCur { + segment: &self.segment, + fst_streamer: self.term_offsets.stream(), + postings_data: self.postings_data.borrow(), + } + } + +} + + +pub struct SegmentDocCursor<'a> { + postings_data: &'a [u8], + offset: usize, +} + +struct SegmentTermCur<'a> { + segment: &'a Segment, + fst_streamer: fst::map::Stream<'a>, + postings_data: &'a [u8], +} + +impl<'a> SegmentTermCur<'a> { + + fn next(&mut self,) -> Option<(Term, SegmentDocCursor<'a>)> { + match self.fst_streamer.next() { + Some((k, offset)) => { + let term = Term::from(k); + let doc_cursor = SegmentDocCursor { + postings_data: self.postings_data, + offset: offset as usize, + }; + Some((term, doc_cursor)) + }, + None => None + } + } } -// -// pub struct SegmentDocCursor<'a> { -// data: &'a [u8], -// } -// -// struct SegmentTermCur<'a> { -// segment: &'a Segment, -// fst_streamer: fst::map::Stream<'a>, -// term: Term<'a>, -// -// } -// -// impl<'a> SegmentTermCur<'a> { -// -// fn next(&mut self,) -> Option<(Term<'a>, SegmentDocCursor<'a>)> { -// match self.fst_streamer.next() { -// Some(_) => None, -// None => None -// } -// } -// } -// -// -// impl SegmentIndexReader { -// -// fn term_cursor<'a>(&'a self) -> SegmentTermCur<'a> { -// let term: Term<'a> { -// self. -// }; -// SegmentTermCur { -// segment: &self.segment, -// fst_streamer: self.term_offsets.stream(), -// term: -// } -// } -// -// } diff --git a/src/core/schema.rs b/src/core/schema.rs index dfb8673a5..044db69e7 100644 --- a/src/core/schema.rs +++ b/src/core/schema.rs @@ -31,6 +31,12 @@ impl Term { } } + pub fn from(data: &[u8]) -> Term { + Term { + data: Vec::from(data), + } + } + pub fn write_into(&self, buf: &mut Vec) { buf.clear(); buf.extend(&self.data);