Upload vectors to LanceDB
(&self, points: &[CodePoint])
| 692 | |
| 693 | /// Upload vectors to LanceDB |
| 694 | async fn upload_points(&self, points: &[CodePoint]) -> Result<(), Box<dyn std::error::Error>> { |
| 695 | debug!("Uploading {} vectors to LanceDB", points.len()); |
| 696 | |
| 697 | if points.is_empty() { |
| 698 | return Ok(()); |
| 699 | } |
| 700 | |
| 701 | let vector_size = self.dimensions; |
| 702 | |
| 703 | let schema = Arc::new(Schema::new(vec![ |
| 704 | Field::new("id", DataType::Utf8, false), |
| 705 | Field::new("vector", DataType::FixedSizeList( |
| 706 | Arc::new(Field::new("item", DataType::Float32, true)), |
| 707 | vector_size |
| 708 | ), false), |
| 709 | Field::new("file_path", DataType::Utf8, false), |
| 710 | Field::new("symbol_name", DataType::Utf8, false), |
| 711 | Field::new("symbol_type", DataType::Utf8, false), |
| 712 | Field::new("language", DataType::Utf8, false), |
| 713 | Field::new("line_start", DataType::Int64, false), |
| 714 | Field::new("line_end", DataType::Int64, false), |
| 715 | Field::new("code_block", DataType::Utf8, false), |
| 716 | ])); |
| 717 | |
| 718 | // Build arrays |
| 719 | let mut id_builder = StringBuilder::new(); |
| 720 | let mut vector_builder = FixedSizeListBuilder::new(Float32Builder::new(), vector_size); |
| 721 | let mut file_path_builder = StringBuilder::new(); |
| 722 | let mut symbol_name_builder = StringBuilder::new(); |
| 723 | let mut symbol_type_builder = StringBuilder::new(); |
| 724 | let mut language_builder = StringBuilder::new(); |
| 725 | let mut line_start_builder = Int64Builder::new(); |
| 726 | let mut line_end_builder = Int64Builder::new(); |
| 727 | let mut code_block_builder = StringBuilder::new(); |
| 728 | |
| 729 | for p in points { |
| 730 | id_builder.append_value(&p.id); |
| 731 | |
| 732 | // Ensure vector size matches |
| 733 | if p.vector.len() != vector_size as usize { |
| 734 | error!("Vector size mismatch: expected {}, got {}", vector_size, p.vector.len()); |
| 735 | continue; |
| 736 | } |
| 737 | |
| 738 | vector_builder.values().append_slice(&p.vector); |
| 739 | vector_builder.append(true); |
| 740 | |
| 741 | file_path_builder.append_value(&p.file_path); |
| 742 | symbol_name_builder.append_value(&p.symbol_name); |
| 743 | symbol_type_builder.append_value(&p.symbol_type); |
| 744 | language_builder.append_value(&p.language); |
| 745 | line_start_builder.append_value(p.line_start); |
| 746 | line_end_builder.append_value(p.line_end); |
| 747 | code_block_builder.append_value(&p.code_block); |
| 748 | } |
| 749 | |
| 750 | let batch = RecordBatch::try_new(schema.clone(), vec![ |
| 751 | Arc::new(id_builder.finish()), |