カラム名の衝突や順番依存の設計リスクを解消する
L columnsにcolumのorderを値として持つようにする
#[derive(Debug)] struct ColumnSchema { order: usize, column_type: ColumnType, } #[derive(Debug)] struct Columns { schema: HashMap<String, ColumnSchema>, order: Vec<String>, }
利用側
fn main() { let mut schema = HashMap::new(); let mut order = vec![]; let columns = vec![ ("id", ColumnType::Integer), ("name", ColumnType::Text), ("age", ColumnType::Integer), ]; for (i, (name, col_type)) in columns.into_iter().enumerate() { schema.insert(name.to_string(), ColumnSchema { order: i, column_type: col_type, }); order.push(name.to_string()); } let columns = Columns { schema, order }; let mut table = Table { name: "users".to_string(), columns: columns, rows: vec![], }; let result = table.insert_row(vec![ Value::Integer(1), Value::Text("Alice".to_string()), Value::Integer(30), ]); let result = table.insert_row(vec![ Value::Integer(2), Value::Text("Bob".to_string()), Value::Integer(25), ]); println!("{:?}", table); let _ = table.update_value_by_column_condition( "id", &Value::Integer(2), "name", Value::Text("Carol".to_string()), ); // let matching_rows = table.find_rows_by_column_value("id", &Value::Integer(2)); // for row in matching_rows { // println!("Matched row: {:?}", row); // } // let matching_rows = table.find_rows_by_column_value("id", &Value::Integer(2)); // for row in matching_rows { // println!("Matched row: {:?}", row); // } let _ = table.delete_rows_by_column_value("id", &Value::Integer(2)); println!("{:?}", table); }
Table { name: “users”, columns: Columns { schema: {“age”: ColumnSchema { order: 2, column_type: Integer }, “name”: ColumnSchema { order: 1, column_type: Text }, “id”: ColumnSchema { order: 0, column_type: Integer }}, order: [“id”, “name”, “age”] }, rows: [[Integer(1), Text(“Alice”), Integer(30)], [Integer(2), Text(“Bob”), Integer(25)]] }
Table { name: “users”, columns: Columns { schema: {“age”: ColumnSchema { order: 2, column_type: Integer }, “name”: ColumnSchema { order: 1, column_type: Text }, “id”: ColumnSchema { order: 0, column_type: Integer }}, order: [“id”, “name”, “age”] }, rows: [[Integer(1), Text(“Alice”), Integer(30)]] }
なるほど、ある程度期待通りになっています。