diff --git a/src/rank/criterion/mod.rs b/src/rank/criterion/mod.rs index 2993f1ba8..7ba34ce2b 100644 --- a/src/rank/criterion/mod.rs +++ b/src/rank/criterion/mod.rs @@ -7,7 +7,6 @@ mod exact; use std::cmp::Ordering; use std::ops::Deref; -use std::vec; use rocksdb::DB; @@ -70,18 +69,55 @@ where D: Deref } } -// TODO there is too much Box here, can we use -// static references or static closures +pub struct CriteriaBuilder +where D: Deref +{ + inner: Vec>> +} + +impl CriteriaBuilder +where D: Deref +{ + pub fn new() -> CriteriaBuilder { + CriteriaBuilder { inner: Vec::new() } + } + + pub fn with_capacity(capacity: usize) -> CriteriaBuilder { + CriteriaBuilder { inner: Vec::with_capacity(capacity) } + } + + pub fn reserve(&mut self, additional: usize) { + self.inner.reserve(additional) + } + + pub fn add(mut self, criterion: C) -> CriteriaBuilder + where C: 'static + Criterion, + { + self.push(criterion); + self + } + + pub fn push(&mut self, criterion: C) + where C: 'static + Criterion, + { + self.inner.push(Box::new(criterion)); + } + + pub fn build(self) -> Vec>> { + self.inner + } +} + pub fn default() -> Vec>> where D: Deref { - vec![ - Box::new(SumOfTypos), - Box::new(NumberOfWords), - Box::new(WordsProximity), - Box::new(SumOfWordsAttribute), - Box::new(SumOfWordsPosition), - Box::new(Exact), - Box::new(DocumentId), - ] + CriteriaBuilder::with_capacity(7) + .add(SumOfTypos) + .add(NumberOfWords) + .add(WordsProximity) + .add(SumOfWordsAttribute) + .add(SumOfWordsPosition) + .add(Exact) + .add(DocumentId) + .build() }