sql_cli/data/adapters/
buffer_adapter.rs

1// Simplified BufferAdapter - just delegates to DataView
2// This is a temporary migration adapter until we remove DataProvider completely
3
4use crate::buffer::BufferAPI;
5use crate::data::data_provider::DataProvider;
6use std::fmt::Debug;
7
8/// Minimal adapter that just uses `DataView` for everything
9pub struct BufferAdapter<'a> {
10    buffer: &'a (dyn BufferAPI + Send + Sync),
11}
12
13impl<'a> BufferAdapter<'a> {
14    pub fn new(buffer: &'a (dyn BufferAPI + Send + Sync)) -> Self {
15        Self { buffer }
16    }
17}
18
19impl Debug for BufferAdapter<'_> {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        f.debug_struct("BufferAdapter").finish()
22    }
23}
24
25impl DataProvider for BufferAdapter<'_> {
26    fn get_row(&self, index: usize) -> Option<Vec<String>> {
27        // Use DataView if available
28        if let Some(dataview) = self.buffer.get_dataview() {
29            if let Some(row) = dataview.get_row(index) {
30                return Some(
31                    row.values
32                        .iter()
33                        .map(std::string::ToString::to_string)
34                        .collect(),
35                );
36            }
37        }
38
39        // Fallback to DataTable if no DataView
40        if let Some(datatable) = self.buffer.get_datatable() {
41            if let Some(row) = datatable.get_row_as_strings(index) {
42                return Some(row);
43            }
44        }
45
46        None
47    }
48
49    fn get_column_names(&self) -> Vec<String> {
50        // Use DataView if available (respects hidden columns)
51        if let Some(dataview) = self.buffer.get_dataview() {
52            return dataview.column_names();
53        }
54
55        // Fallback to DataTable
56        if let Some(datatable) = self.buffer.get_datatable() {
57            return datatable.column_names();
58        }
59
60        Vec::new()
61    }
62
63    fn get_row_count(&self) -> usize {
64        // Use DataView if available (respects filtering)
65        if let Some(dataview) = self.buffer.get_dataview() {
66            return dataview.row_count();
67        }
68
69        // Fallback to DataTable
70        if let Some(datatable) = self.buffer.get_datatable() {
71            return datatable.row_count();
72        }
73
74        0
75    }
76
77    fn get_column_count(&self) -> usize {
78        // Use DataView if available (respects hidden columns)
79        if let Some(dataview) = self.buffer.get_dataview() {
80            return dataview.column_count();
81        }
82
83        // Fallback to DataTable
84        if let Some(datatable) = self.buffer.get_datatable() {
85            return datatable.column_count();
86        }
87
88        0
89    }
90}