1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// Copyright 2025 The Drasi Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Index Backend Plugin Trait
//!
//! This module defines the `IndexBackendPlugin` trait that external index backends
//! (like RocksDB, Garnet/Redis) must implement to integrate with Drasi.
//!
//! # Architecture
//!
//! The index plugin system follows pure dependency inversion:
//! - **Core** provides index traits (`ElementIndex`, `ResultIndex`, etc.) and a default
//! in-memory implementation
//! - **Lib** uses this plugin trait but has no knowledge of specific implementations
//! - **External plugins** (in `components/indexes/`) implement this trait
//! - **Applications** optionally inject plugins; if none provided, the in-memory default is used
use async_trait;
use fmt;
use Arc;
use ;
/// Set of indexes for a query.
///
/// Groups the index types and session control needed for query evaluation into
/// a single unit.
/// This enables backends to create all indexes from a shared underlying resource
/// (e.g., a single RocksDB instance or Redis connection).
/// Result of [`IndexBackendPlugin::create_indexes`].
///
/// Bundles the [`IndexSet`] together with an optional [`CheckpointStore`]
/// that shares the same underlying session state. Persistent backends return
/// `Some(store)`; volatile (in-memory) backends return `None`.
///
/// The store's `stage_checkpoint` calls land in the same database transaction
/// as index updates because both are derived from the same `SessionControl` /
/// session state instance — that is why the plugin returns them together
/// rather than via two separate calls.
/// Plugin trait for external index storage backends.
///
/// Each storage backend (RocksDB, Garnet, etc.) implements this trait to provide
/// all index types needed for query evaluation from a single shared backend instance.
///
/// # Thread Safety
///
/// Implementations must be `Send + Sync` to allow use across async tasks.
///
/// # Example
///
/// ```ignore
/// use drasi_core::interface::{CreatedIndexes, IndexBackendPlugin, IndexError};
///
/// pub struct MyIndexProvider {
/// // configuration fields
/// }
///
/// #[async_trait]
/// impl IndexBackendPlugin for MyIndexProvider {
/// async fn create_indexes(&self, query_id: &str) -> Result<CreatedIndexes, IndexError> {
/// // Create and return all indexes (and an optional checkpoint store)
/// // from a shared backend instance
/// }
/// fn is_volatile(&self) -> bool { false }
/// }
/// ```