diff --git a/fastfield_codecs/benches/bench.rs b/fastfield_codecs/benches/bench.rs index 683c84485..3a5ae5876 100644 --- a/fastfield_codecs/benches/bench.rs +++ b/fastfield_codecs/benches/bench.rs @@ -27,7 +27,7 @@ mod tests { } fn bench_get< S: FastFieldCodecSerializer, - R: FastFieldCodecDeserializer + FastFieldCodecReader, + R: FastFieldCodecDeserializer + FastFieldDataAccess, >( b: &mut Bencher, data: &[u64], diff --git a/fastfield_codecs/src/bitpacked.rs b/fastfield_codecs/src/bitpacked.rs index 932511b44..43e0ea838 100644 --- a/fastfield_codecs/src/bitpacked.rs +++ b/fastfield_codecs/src/bitpacked.rs @@ -5,8 +5,7 @@ use ownedbytes::OwnedBytes; use tantivy_bitpacker::{compute_num_bits, BitPacker, BitUnpacker}; use crate::{ - FastFieldCodecDeserializer, FastFieldCodecReader, FastFieldCodecSerializer, FastFieldCodecType, - FastFieldDataAccess, + FastFieldCodecDeserializer, FastFieldCodecSerializer, FastFieldCodecType, FastFieldDataAccess, }; /// Depending on the field type, a different @@ -40,7 +39,7 @@ impl FastFieldCodecDeserializer for BitpackedReader { }) } } -impl FastFieldCodecReader for BitpackedReader { +impl FastFieldDataAccess for BitpackedReader { #[inline] fn get_val(&self, doc: u64) -> u64 { self.min_value_u64 + self.bit_unpacker.get(doc, &self.data) diff --git a/fastfield_codecs/src/blockwise_linear.rs b/fastfield_codecs/src/blockwise_linear.rs index cf40b27e8..7db3abc29 100644 --- a/fastfield_codecs/src/blockwise_linear.rs +++ b/fastfield_codecs/src/blockwise_linear.rs @@ -19,8 +19,7 @@ use tantivy_bitpacker::{compute_num_bits, BitPacker, BitUnpacker}; use crate::linear::{get_calculated_value, get_slope}; use crate::{ - FastFieldCodecDeserializer, FastFieldCodecReader, FastFieldCodecSerializer, FastFieldCodecType, - FastFieldDataAccess, + FastFieldCodecDeserializer, FastFieldCodecSerializer, FastFieldCodecType, FastFieldDataAccess, }; const CHUNK_SIZE: u64 = 512; @@ -160,7 +159,7 @@ impl FastFieldCodecDeserializer for BlockwiseLinearReader { } } -impl FastFieldCodecReader for BlockwiseLinearReader { +impl FastFieldDataAccess for BlockwiseLinearReader { #[inline] fn get_val(&self, idx: u64) -> u64 { let interpolation = get_interpolation_function(idx, &self.footer.interpolations); diff --git a/fastfield_codecs/src/lib.rs b/fastfield_codecs/src/lib.rs index 805a9b89e..626a0686c 100644 --- a/fastfield_codecs/src/lib.rs +++ b/fastfield_codecs/src/lib.rs @@ -15,11 +15,10 @@ pub mod linear; pub trait FastFieldCodecDeserializer: Sized { /// Reads the metadata and returns the CodecReader fn open_from_bytes(bytes: OwnedBytes) -> std::io::Result - where - Self: FastFieldCodecReader; + where Self: FastFieldDataAccess; } -pub trait FastFieldCodecReader: Sized { +pub trait FastFieldDataAccess { fn get_val(&self, doc: u64) -> u64; fn min_value(&self) -> u64; fn max_value(&self) -> u64; @@ -95,31 +94,6 @@ pub trait FastFieldCodecSerializer { ) -> io::Result<()>; } -/// FastFieldDataAccess is the trait to access fast field data during serialization and estimation. -pub trait FastFieldDataAccess { - /// Return the value associated to the given position. - /// - /// Whenever possible use the Iterator passed to the fastfield creation instead, for performance - /// reasons. - /// - /// # Panics - /// - /// May panic if `position` is greater than the index. - fn get_val(&self, position: u64) -> u64; - - /// Returns a iterator over the data - fn iter(&self) -> Box + '_>; - - /// min value of the data - fn min_value(&self) -> u64; - - /// max value of the data - fn max_value(&self) -> u64; - - /// num vals - fn num_vals(&self) -> u64; -} - #[derive(Debug, Clone)] /// Statistics are used in codec detection and stored in the fast field footer. pub struct FastFieldStats { @@ -181,7 +155,7 @@ mod tests { pub fn create_and_validate< S: FastFieldCodecSerializer, - R: FastFieldCodecDeserializer + FastFieldCodecReader, + R: FastFieldCodecDeserializer + FastFieldDataAccess, >( data: &[u64], name: &str, @@ -244,7 +218,7 @@ mod tests { fn test_codec< S: FastFieldCodecSerializer, - R: FastFieldCodecReader + FastFieldCodecDeserializer, + R: FastFieldDataAccess + FastFieldCodecDeserializer, >() { let codec_name = format!("{:?}", S::CODEC_TYPE); for (data, dataset_name) in get_codec_test_data_sets() { diff --git a/fastfield_codecs/src/linear.rs b/fastfield_codecs/src/linear.rs index 93ab0557a..bf50f7f1b 100644 --- a/fastfield_codecs/src/linear.rs +++ b/fastfield_codecs/src/linear.rs @@ -6,8 +6,7 @@ use ownedbytes::OwnedBytes; use tantivy_bitpacker::{compute_num_bits, BitPacker, BitUnpacker}; use crate::{ - FastFieldCodecDeserializer, FastFieldCodecReader, FastFieldCodecSerializer, FastFieldCodecType, - FastFieldDataAccess, + FastFieldCodecDeserializer, FastFieldCodecSerializer, FastFieldCodecType, FastFieldDataAccess, }; /// Depending on the field type, a different @@ -78,7 +77,7 @@ impl FastFieldCodecDeserializer for LinearReader { } } -impl FastFieldCodecReader for LinearReader { +impl FastFieldDataAccess for LinearReader { #[inline] fn get_val(&self, doc: u64) -> u64 { let calculated_value = get_calculated_value(self.footer.first_val, doc, self.slope); diff --git a/src/fastfield/gcd.rs b/src/fastfield/gcd.rs index 492a3c4d9..8e706d12f 100644 --- a/src/fastfield/gcd.rs +++ b/src/fastfield/gcd.rs @@ -3,7 +3,7 @@ use std::num::NonZeroU64; use common::BinarySerializable; use fastdivide::DividerU64; -use fastfield_codecs::{FastFieldCodecDeserializer, FastFieldCodecReader}; +use fastfield_codecs::{FastFieldCodecDeserializer, FastFieldDataAccess}; use ownedbytes::OwnedBytes; pub const GCD_DEFAULT: u64 = 1; @@ -19,7 +19,7 @@ pub struct GCDFastFieldCodec { reader: CodecReader, } -impl FastFieldCodecDeserializer +impl FastFieldCodecDeserializer for GCDFastFieldCodec { fn open_from_bytes(bytes: OwnedBytes) -> std::io::Result { @@ -38,7 +38,7 @@ impl FastFieldCode } } -impl FastFieldCodecReader for GCDFastFieldCodec { +impl FastFieldDataAccess for GCDFastFieldCodec { #[inline] fn get_val(&self, doc: u64) -> u64 { let mut data = self.reader.get_val(doc); diff --git a/src/fastfield/reader.rs b/src/fastfield/reader.rs index ec9720cc3..7afedf6f5 100644 --- a/src/fastfield/reader.rs +++ b/src/fastfield/reader.rs @@ -6,7 +6,7 @@ use common::BinarySerializable; use fastfield_codecs::bitpacked::BitpackedReader; use fastfield_codecs::blockwise_linear::BlockwiseLinearReader; use fastfield_codecs::linear::LinearReader; -use fastfield_codecs::{FastFieldCodecDeserializer, FastFieldCodecReader, FastFieldCodecType}; +use fastfield_codecs::{FastFieldCodecDeserializer, FastFieldCodecType, FastFieldDataAccess}; use super::{FastValue, GCDFastFieldCodec}; use crate::directory::{CompositeFile, Directory, FileSlice, OwnedBytes, RamDirectory, WritePtr}; @@ -199,7 +199,7 @@ pub struct FastFieldReaderCodecWrapper { _phantom: PhantomData, } -impl +impl FastFieldReaderCodecWrapper { /// Opens a fast field given a file. @@ -251,7 +251,7 @@ impl } } -impl +impl FastFieldReader for FastFieldReaderCodecWrapper { /// Return the value associated to the given document. diff --git a/src/fastfield/writer.rs b/src/fastfield/writer.rs index 0cef6a905..6d0000e5c 100644 --- a/src/fastfield/writer.rs +++ b/src/fastfield/writer.rs @@ -2,12 +2,13 @@ use std::collections::HashMap; use std::io; use common; +use fastfield_codecs::FastFieldDataAccess; use fnv::FnvHashMap; use tantivy_bitpacker::BlockedBitpacker; use super::multivalued::MultiValuedFastFieldWriter; use super::serializer::FastFieldStats; -use super::{FastFieldDataAccess, FastFieldType, FastValue}; +use super::{FastFieldType, FastValue}; use crate::fastfield::{BytesFastFieldWriter, CompositeFastFieldSerializer}; use crate::indexer::doc_id_mapping::DocIdMapping; use crate::postings::UnorderedTermId;