Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #116

Merged
merged 3 commits into from
Sep 1, 2024
Merged

Fixes #116

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/app/handlers/flightsql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ pub fn editable_handler(app: &mut App, key: KeyEvent) {
match (key.code, key.modifiers) {
(KeyCode::Left, KeyModifiers::ALT) => app.state.flightsql_tab.previous_word(),
(KeyCode::Right, KeyModifiers::ALT) => app.state.flightsql_tab.next_word(),
(KeyCode::Backspace, KeyModifiers::ALT) => app.state.flightsql_tab.delete_word(),
(KeyCode::Esc, _) => app.state.flightsql_tab.exit_edit(),
_ => app.state.flightsql_tab.update_editor_content(key),
}
Expand Down
1 change: 1 addition & 0 deletions src/app/handlers/sql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ pub fn editable_handler(app: &mut App, key: KeyEvent) {
match (key.code, key.modifiers) {
(KeyCode::Left, KeyModifiers::ALT) => app.state.sql_tab.previous_word(),
(KeyCode::Right, KeyModifiers::ALT) => app.state.sql_tab.next_word(),
(KeyCode::Backspace, KeyModifiers::ALT) => app.state.sql_tab.delete_word(),
(KeyCode::Esc, _) => app.state.sql_tab.exit_edit(),
(KeyCode::Enter, KeyModifiers::CONTROL) => {
let query = app.state.sql_tab.editor().lines().join("");
Expand Down
7 changes: 5 additions & 2 deletions src/app/state/tabs/flightsql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,7 @@ impl<'app> FlightSQLTabState<'app> {
pub fn new() -> Self {
let empty_text = vec!["Enter a query here.".to_string()];
// TODO: Enable vim mode from config?
let mut textarea = TextArea::new(empty_text);
textarea.set_line_number_style(Style::default().bg(tailwind::GRAY.c400));
let textarea = TextArea::new(empty_text);
Self {
editor: textarea,
editor_editable: false,
Expand Down Expand Up @@ -172,4 +171,8 @@ impl<'app> FlightSQLTabState<'app> {
pub fn previous_word(&mut self) {
self.editor.move_cursor(tui_textarea::CursorMove::WordBack)
}

pub fn delete_word(&mut self) {
self.editor.delete_word();
}
}
8 changes: 5 additions & 3 deletions src/app/state/tabs/sql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ use std::time::Duration;

use datafusion::arrow::array::RecordBatch;
use ratatui::crossterm::event::KeyEvent;
use ratatui::style::{palette::tailwind, Style};
use ratatui::widgets::TableState;
use tui_textarea::TextArea;

Expand Down Expand Up @@ -99,8 +98,7 @@ impl<'app> SQLTabState<'app> {
pub fn new() -> Self {
let empty_text = vec!["Enter a query here.".to_string()];
// TODO: Enable vim mode from config?
let mut textarea = TextArea::new(empty_text);
textarea.set_line_number_style(Style::default().bg(tailwind::GRAY.c400));
let textarea = TextArea::new(empty_text);
Self {
editor: textarea,
editor_editable: false,
Expand Down Expand Up @@ -172,4 +170,8 @@ impl<'app> SQLTabState<'app> {
pub fn previous_word(&mut self) {
self.editor.move_cursor(tui_textarea::CursorMove::WordBack)
}

pub fn delete_word(&mut self) {
self.editor.delete_word();
}
}
176 changes: 142 additions & 34 deletions src/ui/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ macro_rules! convert_array_values_to_cells {
($rows:expr, $arr:expr, $typ:ty) => {
if let Some(a) = $arr.as_any().downcast_ref::<$typ>() {
for i in 0..$rows.len() {
$rows[i].push(a.value(i).to_string().into());
let cell = Cell::from(a.value(i).to_string())
.bg(tailwind::BLACK)
.fg(tailwind::WHITE);
$rows[i].push(cell);
}
}
};
Expand All @@ -54,7 +57,11 @@ pub fn record_batch_to_table_header_cells(record_batch: &RecordBatch) -> Vec<Cel

pub fn create_row_number_cells(record_batch: &RecordBatch) -> Vec<Cell> {
let cells: Vec<Cell> = (0..record_batch.num_rows())
.map(|i| Cell::new(i.to_string()))
.map(|i| {
Cell::new(i.to_string())
.bg(tailwind::BLACK)
.fg(tailwind::WHITE)
})
.collect();
cells
}
Expand Down Expand Up @@ -170,8 +177,16 @@ mod tests {
header_cells,
vec![
Cell::new("#").bg(tailwind::ORANGE.c300).fg(tailwind::BLACK),
Cell::new("a").bg(tailwind::ORANGE.c300).fg(tailwind::BLACK),
Cell::new("b").bg(tailwind::ORANGE.c300).fg(tailwind::BLACK)
Cell::new("a")
.bg(tailwind::BLACK)
.fg(tailwind::WHITE)
.bg(tailwind::ORANGE.c300)
.fg(tailwind::BLACK),
Cell::new("b")
.bg(tailwind::BLACK)
.fg(tailwind::WHITE)
.bg(tailwind::ORANGE.c300)
.fg(tailwind::BLACK)
]
);
}
Expand All @@ -183,89 +198,170 @@ mod tests {
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("a")],
vec![Cell::new("1"), Cell::new("b")],
vec![Cell::new("2"), Cell::new("c")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("a").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("b").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("c").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(table_cells, expected);

let a: ArrayRef = Arc::new(Int8Array::from(vec![1, 2, 3]));
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1")],
vec![Cell::new("1"), Cell::new("2")],
vec![Cell::new("2"), Cell::new("3")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);

let a: ArrayRef = Arc::new(Int16Array::from(vec![1, 2, 3]));
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1")],
vec![Cell::new("1"), Cell::new("2")],
vec![Cell::new("2"), Cell::new("3")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);

let a: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3]));
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1")],
vec![Cell::new("1"), Cell::new("2")],
vec![Cell::new("2"), Cell::new("3")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);

let a: ArrayRef = Arc::new(Int64Array::from(vec![1, 2, 3]));
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1")],
vec![Cell::new("1"), Cell::new("2")],
vec![Cell::new("2"), Cell::new("3")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);

let a: ArrayRef = Arc::new(UInt8Array::from(vec![1, 2, 3]));
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1")],
vec![Cell::new("1"), Cell::new("2")],
vec![Cell::new("2"), Cell::new("3")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);

let a: ArrayRef = Arc::new(UInt16Array::from(vec![1, 2, 3]));
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1")],
vec![Cell::new("1"), Cell::new("2")],
vec![Cell::new("2"), Cell::new("3")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);

let a: ArrayRef = Arc::new(UInt32Array::from(vec![1, 2, 3]));
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1")],
vec![Cell::new("1"), Cell::new("2")],
vec![Cell::new("2"), Cell::new("3")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);

let a: ArrayRef = Arc::new(UInt64Array::from(vec![1, 2, 3]));
let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1")],
vec![Cell::new("1"), Cell::new("2")],
vec![Cell::new("2"), Cell::new("3")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);
}
Expand All @@ -277,9 +373,21 @@ mod tests {
let batch = RecordBatch::try_from_iter(vec![("a", a), ("b", b)]).unwrap();
let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap();
let expected = vec![
vec![Cell::new("0"), Cell::new("1"), Cell::new("a")],
vec![Cell::new("1"), Cell::new("2"), Cell::new("b")],
vec![Cell::new("2"), Cell::new("3"), Cell::new("c")],
vec![
Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("a").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("b").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
vec![
Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE),
Cell::new("c").bg(tailwind::BLACK).fg(tailwind::WHITE),
],
];
assert_eq!(a_table_cells, expected);
}
Expand Down
19 changes: 10 additions & 9 deletions src/ui/tabs/flightsql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,13 @@ use crate::{app::App, ui::convert::record_batches_to_table};

pub fn render_sql_editor(area: Rect, buf: &mut Buffer, app: &App) {
let border_color = if app.state.flightsql_tab.editor_editable() {
tailwind::ORANGE.c300
tailwind::ORANGE.c500
} else {
tailwind::WHITE
};
let title = Span::from(" Editor ").fg(tailwind::WHITE);
let block = Block::default()
.title(" Editor ")
.title(title)
.borders(Borders::ALL)
.fg(border_color)
.title_bottom(" Cmd+Enter to run query ");
Expand All @@ -45,13 +46,13 @@ pub fn render_sql_results(area: Rect, buf: &mut Buffer, app: &App) {
if let Some(q) = app.state.flightsql_tab.query() {
if let Some(r) = q.results() {
if let Some(s) = app.state.flightsql_tab.query_results_state() {
let block = block
.title_bottom(format!(
" {} rows in {}ms",
q.num_rows().unwrap_or(0),
q.execution_time().as_millis()
))
.fg(tailwind::ORANGE.c500);
let stats = Span::from(format!(
" {} rows in {}ms ",
q.num_rows().unwrap_or(0),
q.execution_time().as_millis()
))
.fg(tailwind::WHITE);
let block = block.title_bottom(stats).fg(tailwind::ORANGE.c500);
let maybe_table = record_batches_to_table(r);
match maybe_table {
Ok(table) => {
Expand Down
Loading
Loading