use std::collections::HashMap;
use crate::common::counter::hardware_counter::HardwareCounterCell;
use crate::common::types::{ScoredPointOffset, TelemetryDetail};
use crate::sparse::common::types::DimId;
use super::PlainVectorIndex;
use crate::segment::common::operation_error::OperationResult;
use crate::segment::common::operation_time_statistics::OperationDurationStatistics;
use crate::segment::data_types::query_context::VectorQueryContext;
use crate::segment::data_types::vectors::QueryVector;
use crate::segment::index::VectorIndexRead;
use crate::segment::telemetry::VectorIndexSearchesTelemetry;
use crate::segment::types::{Filter, SearchParams};
use crate::segment::vector_storage::VectorStorageRead;
impl PlainVectorIndex {
pub fn is_small_enough_for_unindexed_search(
&self,
search_optimized_threshold_kb: usize,
filter: Option<&Filter>,
hw_counter: &HardwareCounterCell,
) -> OperationResult<bool> {
self.with_view(|view| {
view.is_small_enough_for_unindexed_search(
search_optimized_threshold_kb,
filter,
hw_counter,
)
})
}
}
impl VectorIndexRead for PlainVectorIndex {
fn search(
&self,
query_vectors: &[&QueryVector],
filter: Option<&Filter>,
top: usize,
params: Option<&SearchParams>,
query_context: &VectorQueryContext,
) -> OperationResult<Vec<Vec<ScoredPointOffset>>> {
self.with_view(|view| view.search(query_vectors, filter, top, params, query_context))
}
fn get_telemetry_data(&self, detail: TelemetryDetail) -> VectorIndexSearchesTelemetry {
VectorIndexSearchesTelemetry {
index_name: None,
unfiltered_plain: self
.unfiltered_searches_telemetry
.lock()
.get_statistics(detail),
filtered_plain: self
.filtered_searches_telemetry
.lock()
.get_statistics(detail),
unfiltered_hnsw: OperationDurationStatistics::default(),
filtered_small_cardinality: OperationDurationStatistics::default(),
filtered_large_cardinality: OperationDurationStatistics::default(),
filtered_exact: OperationDurationStatistics::default(),
filtered_sparse: Default::default(),
unfiltered_exact: OperationDurationStatistics::default(),
unfiltered_sparse: OperationDurationStatistics::default(),
}
}
fn indexed_vector_count(&self) -> usize {
0
}
fn size_of_searchable_vectors_in_bytes(&self) -> usize {
self.vector_storage
.borrow()
.size_of_available_vectors_in_bytes()
}
fn fill_idf_statistics(
&self,
_idf: &mut HashMap<DimId, usize>,
corpus: Option<&Filter>,
_is_stopped: &std::sync::atomic::AtomicBool,
_hw_counter: &HardwareCounterCell,
) -> OperationResult<usize> {
Ok(match corpus {
None => self.indexed_vector_count(),
Some(_) => 0,
})
}
fn is_index(&self) -> bool {
false
}
}