use std::collections::HashSet;
use std::sync::Arc;
use indexmap::IndexMap;
use crate::data::DataRecord;
use crate::splits::SplitLabel;
use crate::types::{RecordId, SourceId};
#[cfg(feature = "bm25-mining")]
pub(super) mod bm25_backend;
mod default_backend;
#[cfg(feature = "bm25-mining")]
pub(super) use self::bm25_backend::Bm25Backend;
#[cfg(not(feature = "bm25-mining"))]
pub(super) use self::default_backend::DefaultBackend;
pub(super) trait NegativeBackend: Send + Sync {
fn choose_negative(
&self,
anchor: &DataRecord,
anchor_split: SplitLabel,
pool: Vec<Arc<DataRecord>>,
fallback_used: bool,
anchor_query_text: Option<&str>,
rng: &mut dyn rand::RngCore,
) -> Option<(Arc<DataRecord>, bool)>;
fn on_sync_start(&mut self);
fn on_records_refreshed(
&mut self,
records: &IndexMap<RecordId, Arc<DataRecord>>,
max_window_tokens: usize,
split_fn: &dyn Fn(&RecordId) -> Option<SplitLabel>,
refreshed_source_ids: &[SourceId],
);
fn prune_cursors(&mut self, valid_ids: &HashSet<RecordId>);
fn cursors_empty(&self) -> bool;
#[cfg(all(feature = "bm25-mining", feature = "extended-metrics"))]
fn bm25_fallback_stats(&self) -> (u64, u64);
#[cfg(test)]
fn as_any_mut(&mut self) -> &mut dyn std::any::Any;
}