ragfs_store/
schema.rs

1//! Arrow schema definitions for `LanceDB` tables.
2
3use arrow_schema::{DataType, Field, Schema, TimeUnit};
4use std::sync::Arc;
5
6/// Schema for the chunks table.
7#[must_use]
8pub fn chunks_schema(embedding_dim: usize) -> Schema {
9    Schema::new(vec![
10        // Identity
11        Field::new("chunk_id", DataType::Utf8, false),
12        Field::new("file_id", DataType::Utf8, false),
13        Field::new("file_path", DataType::Utf8, false),
14        // Content
15        Field::new("content", DataType::Utf8, false),
16        Field::new("content_type", DataType::Utf8, false),
17        // Position
18        Field::new("chunk_index", DataType::UInt32, false),
19        Field::new("start_byte", DataType::UInt64, false),
20        Field::new("end_byte", DataType::UInt64, false),
21        Field::new("start_line", DataType::UInt32, true),
22        Field::new("end_line", DataType::UInt32, true),
23        // Hierarchy
24        Field::new("parent_chunk_id", DataType::Utf8, true),
25        Field::new("depth", DataType::UInt8, false),
26        // Embedding
27        Field::new(
28            "embedding",
29            DataType::FixedSizeList(
30                Arc::new(Field::new("item", DataType::Float32, true)),
31                embedding_dim as i32,
32            ),
33            false,
34        ),
35        // Metadata
36        Field::new("embedding_model", DataType::Utf8, true),
37        Field::new(
38            "indexed_at",
39            DataType::Timestamp(TimeUnit::Millisecond, None),
40            false,
41        ),
42        // File metadata (denormalized)
43        Field::new("file_mime_type", DataType::Utf8, true),
44        Field::new("file_size_bytes", DataType::UInt64, true),
45        // Code-specific
46        Field::new("language", DataType::Utf8, true),
47        Field::new("symbol_type", DataType::Utf8, true),
48        Field::new("symbol_name", DataType::Utf8, true),
49    ])
50}
51
52/// Schema for the files metadata table.
53#[must_use]
54pub fn files_schema() -> Schema {
55    Schema::new(vec![
56        Field::new("file_id", DataType::Utf8, false),
57        Field::new("path", DataType::Utf8, false),
58        Field::new("size_bytes", DataType::UInt64, false),
59        Field::new("mime_type", DataType::Utf8, false),
60        Field::new("content_hash", DataType::Utf8, false),
61        Field::new(
62            "modified_at",
63            DataType::Timestamp(TimeUnit::Millisecond, None),
64            false,
65        ),
66        Field::new(
67            "indexed_at",
68            DataType::Timestamp(TimeUnit::Millisecond, None),
69            true,
70        ),
71        Field::new("chunk_count", DataType::UInt32, false),
72        Field::new("status", DataType::Utf8, false),
73        Field::new("error_message", DataType::Utf8, true),
74    ])
75}