Skip to content

Commit

Permalink
Some renaming, implement missing iteration apis.
Browse files Browse the repository at this point in the history
  • Loading branch information
faassen committed Jan 31, 2025
1 parent 2845465 commit 1752323
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 34 deletions.
2 changes: 1 addition & 1 deletion benches/locate.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use fm_index::{LocateSearchResult, SearchIndexBuilder, SearchIndexWithLocate};
use fm_index::{SearchResultWithLocate, SearchIndexBuilder, SearchIndexWithLocate};

use criterion::{criterion_group, criterion_main};
use criterion::{BatchSize, BenchmarkId, Criterion, Throughput};
Expand Down
4 changes: 2 additions & 2 deletions examples/example.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use fm_index::converter::RangeConverter;
use fm_index::SearchIndexBuilder;
use fm_index::{SearchIndexBuilder, SearchIndexWithLocate, SearchResult, SearchResultWithLocate};

fn main() {
// Prepare a text string to search for patterns.
Expand All @@ -26,7 +26,7 @@ fn main() {

// Search for a pattern string.
let pattern = "dolor";
let search = index.search(pattern);
let search = index.search(&pattern);

// Count the number of occurrences.
let n = search.count();
Expand Down
10 changes: 5 additions & 5 deletions src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use crate::converter;
use crate::{
converter::{Converter, IdConverter},
suffix_array::SuffixOrderSampledArray,
Character, FMIndex, RLFMIndex,
Character, FMIndex, RLFMIndex, SearchIndex, SearchIndexWithLocate,
};

/// Construct a search index
Expand Down Expand Up @@ -169,7 +169,7 @@ where
}

/// Build the index.
pub fn build(self, text: Vec<T>) -> FMIndex<T, C, SuffixOrderSampledArray> {
pub fn build(self, text: Vec<T>) -> impl SearchIndexWithLocate<T> {
FMIndex::new(text, self.converter, self.sampling_level.unwrap_or(0))
}
}
Expand Down Expand Up @@ -198,7 +198,7 @@ where
}

/// Build the index.
pub fn build(self, text: Vec<T>) -> FMIndex<T, C, ()> {
pub fn build(self, text: Vec<T>) -> impl SearchIndex<T> {
FMIndex::count_only(text, self.converter)
}
}
Expand Down Expand Up @@ -250,7 +250,7 @@ where
}

/// Build the index.
pub fn build(self, text: Vec<T>) -> RLFMIndex<T, C, SuffixOrderSampledArray> {
pub fn build(self, text: Vec<T>) -> impl SearchIndexWithLocate<T> {
RLFMIndex::new(text, self.converter, self.sampling_level.unwrap_or(0))
}
}
Expand All @@ -271,7 +271,7 @@ where
C: Converter<T>,
{
/// Build the index.
pub fn build(self, text: Vec<T>) -> RLFMIndex<T, C, ()> {
pub fn build(self, text: Vec<T>) -> impl SearchIndex<T> {
RLFMIndex::count_only(text, self.converter)
}
}
27 changes: 23 additions & 4 deletions src/fm_index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@ use crate::character::{prepare_text, Character};
#[cfg(doc)]
use crate::converter;
use crate::converter::{Converter, IndexWithConverter};
use crate::iter::{AsCharacters, FMIndexBackend, LocateSearchResult, SearchIndex, SearchResult};
use crate::iter::{
AsCharacters, FMIndexBackend, SearchIndex, SearchResult, SearchResultWithLocate,
};
use crate::search::Search;
use crate::suffix_array::{self, HasPosition, SuffixOrderSampledArray};
use crate::util;
use crate::{sais, seal, HeapSize, SearchIndexWithLocate};
use crate::{util, Search};

use serde::{Deserialize, Serialize};
use vers_vecs::WaveletMatrix;
Expand Down Expand Up @@ -82,7 +85,7 @@ where
///
/// Return a [`Search`] object with information about the search
/// result.
pub fn search<K>(&self, pattern: K) -> Search<T, Self>
pub(crate) fn search<K>(&self, pattern: K) -> Search<T, Self>
where
K: AsRef<[T]>,
{
Expand Down Expand Up @@ -253,6 +256,14 @@ impl<'a, T: Character, C: Converter<T>> SearchResult<'a, T>
fn count(&self) -> u64 {
self.0.count()
}

fn iter_backward(&self, i: u64) -> impl Iterator<Item = T> + 'a {
self.0.iter_backward(i)
}

fn iter_forward(&self, i: u64) -> impl Iterator<Item = T> + 'a {
self.0.iter_forward(i)
}
}

pub struct FMIndexLocateSearchResult<'a, T: Character, C: Converter<T>>(
Expand All @@ -269,9 +280,17 @@ impl<'a, T: Character, C: Converter<T>> SearchResult<'a, T>
fn count(&self) -> u64 {
self.0.count()
}

fn iter_backward(&self, i: u64) -> impl Iterator<Item = T> + 'a {
self.0.iter_backward(i)
}

fn iter_forward(&self, i: u64) -> impl Iterator<Item = T> + 'a {
self.0.iter_forward(i)
}
}

impl<'a, T: Character, C: Converter<T>> LocateSearchResult<'a, T>
impl<'a, T: Character, C: Converter<T>> SearchResultWithLocate<'a, T>
for FMIndexLocateSearchResult<'a, T, C>
{
fn locate(&self) -> Vec<u64> {
Expand Down
26 changes: 13 additions & 13 deletions src/iter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,15 @@ impl<T: Character, A: AsRef<[T]>> AsCharacters<T> for A {
}

pub trait SearchResult<'a, T: Character> {
fn search<K: AsRef<[T]>>(&'a self, pattern: K) -> Self;
fn search<K: AsRef<[T]>>(&self, pattern: K) -> Self;

fn count(&self) -> u64;

fn iter_backward(&self, i: u64) -> impl Iterator<Item = T> + 'a;
fn iter_forward(&self, i: u64) -> impl Iterator<Item = T> + 'a;
}

pub trait LocateSearchResult<'a, T: Character>: SearchResult<'a, T> {
pub trait SearchResultWithLocate<'a, T: Character>: SearchResult<'a, T> {
fn locate(&self) -> Vec<u64>;
}

Expand Down Expand Up @@ -54,7 +57,7 @@ pub trait SearchIndex<T: Character> {
///
/// This also supports the locate operation for search.
pub trait SearchIndexWithLocate<T: Character> {
type SearchResult<'a>: LocateSearchResult<'a, T>
type SearchResult<'a>: SearchResultWithLocate<'a, T>
where
Self: 'a;

Expand All @@ -76,22 +79,19 @@ pub trait SearchIndexWithLocate<T: Character> {
/// You can use this to implement against a FM-Index generically.
///
/// You cannot implement this trait yourself.
pub trait FMIndexBackend<T: Character> {
// We hide all the methods involved in implementation.

#[doc(hidden)]
pub(crate) trait FMIndexBackend<T: Character> {
fn get_l(&self, i: u64) -> T;
#[doc(hidden)]

fn lf_map(&self, i: u64) -> u64;
#[doc(hidden)]

fn lf_map2(&self, c: T, i: u64) -> u64;
#[doc(hidden)]

fn get_f(&self, i: u64) -> T;
#[doc(hidden)]

fn fl_map(&self, i: u64) -> u64;
#[doc(hidden)]

fn fl_map2(&self, c: T, i: u64) -> u64;
#[doc(hidden)]

fn len(&self) -> u64;
}

Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
//! ```
//! use fm_index::converter::RangeConverter;
//! use fm_index::SearchIndexBuilder;
//! use fm_index::{SearchIndexWithLocate, SearchResult, SearchResultWithLocate};
//!
//! // Prepare a text string to search for patterns.
//! let text = concat!(
Expand All @@ -50,7 +51,7 @@
//!
//! // Search for a pattern string.
//! let pattern = "dolor";
//! let search = index.search(pattern);
//! let search = index.search(&pattern);
//!
//! // Count the number of occurrences.
//! let n = search.count();
Expand Down Expand Up @@ -153,7 +154,6 @@ pub use crate::rlfmi::RLFMIndex;
pub use builder::SearchIndexBuilder;
pub use character::Character;
pub use iter::{
BackwardIterator, FMIndexBackend, ForwardIterator, HeapSize, LocateSearchResult, SearchIndex,
SearchIndexWithLocate, SearchResult,
BackwardIterator, ForwardIterator, HeapSize, SearchIndex, SearchIndexWithLocate, SearchResult,
SearchResultWithLocate,
};
pub use search::Search;
27 changes: 23 additions & 4 deletions src/rlfmi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ use crate::character::{prepare_text, Character};
#[cfg(doc)]
use crate::converter;
use crate::converter::{Converter, IndexWithConverter};
use crate::iter::{AsCharacters, FMIndexBackend, LocateSearchResult, SearchIndex, SearchResult};
use crate::iter::{
AsCharacters, FMIndexBackend, SearchIndex, SearchResult, SearchResultWithLocate,
};
use crate::search::Search;
use crate::suffix_array::{self, HasPosition, SuffixOrderSampledArray};
use crate::{sais, HeapSize, Search, SearchIndexWithLocate};
use crate::{sais, HeapSize, SearchIndexWithLocate};
use crate::{seal, util};

use serde::{Deserialize, Serialize};
Expand Down Expand Up @@ -116,7 +119,7 @@ where
///
/// Return a [`Search`] object with information about the search
/// result.
pub fn search<K>(&self, pattern: K) -> Search<T, Self>
pub(crate) fn search<K>(&self, pattern: K) -> Search<T, Self>
where
K: AsRef<[T]>,
{
Expand Down Expand Up @@ -315,6 +318,14 @@ impl<'a, T: Character, C: Converter<T>> SearchResult<'a, T>
fn count(&self) -> u64 {
self.0.count()
}

fn iter_backward(&self, i: u64) -> impl Iterator<Item = T> + 'a {
self.0.iter_backward(i)
}

fn iter_forward(&self, i: u64) -> impl Iterator<Item = T> + 'a {
self.0.iter_forward(i)
}
}

pub struct RLFMIndexLocateSearchResult<'a, T: Character, C: Converter<T>>(
Expand All @@ -331,9 +342,17 @@ impl<'a, T: Character, C: Converter<T>> SearchResult<'a, T>
fn count(&self) -> u64 {
self.0.count()
}

fn iter_backward(&self, i: u64) -> impl Iterator<Item = T> + 'a {
self.0.iter_backward(i)
}

fn iter_forward(&self, i: u64) -> impl Iterator<Item = T> + 'a {
self.0.iter_forward(i)
}
}

impl<'a, T: Character, C: Converter<T>> LocateSearchResult<'a, T>
impl<'a, T: Character, C: Converter<T>> SearchResultWithLocate<'a, T>
for RLFMIndexLocateSearchResult<'a, T, C>
{
fn locate(&self) -> Vec<u64> {
Expand Down
2 changes: 1 addition & 1 deletion src/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use crate::{seal, BackwardIterator, Character, ForwardIterator};
///
/// This is expanded with a `locate` method if the index is
/// supplied with a sampled suffix array.
pub struct Search<'a, T: Character, I: FMIndexBackend<T>> {
pub(crate) struct Search<'a, T: Character, I: FMIndexBackend<T>> {
index: &'a I,
s: u64,
e: u64,
Expand Down

0 comments on commit 1752323

Please sign in to comment.