use std::sync::Arc; use common::cpu::CpuBudget; use segment::types::{PayloadFieldSchema, PayloadSchemaType}; use tempfile::Builder; use tokio::runtime::Handle; use tokio::sync::RwLock; use crate::save_on_disk::SaveOnDisk; use crate::shards::local_shard::LocalShard; use crate::shards::shard_trait::ShardOperation; use crate::tests::fixtures::*; #[tokio::test(flavor = "multi_thread")] async fn test_delete_from_indexed_payload() { let collection_dir = Builder::new().prefix("test_collection").tempdir().unwrap(); let config = create_collection_config(); let collection_name = "test".to_string(); let current_runtime: Handle = Handle::current(); let payload_index_schema_dir = Builder::new().prefix("qdrant-test").tempdir().unwrap(); let payload_index_schema_file = payload_index_schema_dir.path().join("payload-schema.json"); let payload_index_schema = Arc::new(SaveOnDisk::load_or_init_default(payload_index_schema_file).unwrap()); let shard = LocalShard::build( 0, collection_name.clone(), collection_dir.path(), Arc::new(RwLock::new(config.clone())), Arc::new(Default::default()), payload_index_schema.clone(), current_runtime.clone(), current_runtime.clone(), CpuBudget::default(), config.optimizer_config.clone(), ) .await .unwrap(); let upsert_ops = upsert_operation(); shard.update(upsert_ops.into(), true).await.unwrap(); let index_op = create_payload_index_operation(); payload_index_schema .write(|schema| { schema.schema.insert( "location".parse().unwrap(), PayloadFieldSchema::FieldType(PayloadSchemaType::Geo), ); }) .unwrap(); shard.update(index_op.into(), true).await.unwrap(); let delete_point_op = delete_point_operation(4); shard.update(delete_point_op.into(), true).await.unwrap(); let info = shard.info().await.unwrap(); eprintln!("info = {:#?}", info.payload_schema); let number_of_indexed_points = info .payload_schema .get(&"location".parse().unwrap()) .unwrap() .points; drop(shard); let shard = LocalShard::load( 0, collection_name.clone(), collection_dir.path(), Arc::new(RwLock::new(config.clone())), config.optimizer_config.clone(), Arc::new(Default::default()), payload_index_schema.clone(), current_runtime.clone(), current_runtime.clone(), CpuBudget::default(), ) .await .unwrap(); tokio::time::sleep(std::time::Duration::from_secs(1)).await; eprintln!("dropping point 5"); let delete_point_op = delete_point_operation(5); shard.update(delete_point_op.into(), true).await.unwrap(); drop(shard); let shard = LocalShard::load( 0, collection_name, collection_dir.path(), Arc::new(RwLock::new(config.clone())), config.optimizer_config.clone(), Arc::new(Default::default()), payload_index_schema, current_runtime.clone(), current_runtime, CpuBudget::default(), ) .await .unwrap(); let info = shard.info().await.unwrap(); eprintln!("info = {:#?}", info.payload_schema); let number_of_indexed_points_after_load = info .payload_schema .get(&"location".parse().unwrap()) .unwrap() .points; assert_eq!(number_of_indexed_points, 4); assert_eq!(number_of_indexed_points_after_load, 3); }