Skip to content

Commit bc73ccd

Browse files
committed
add aliases hashmap creation and bump version
1 parent 7946bcb commit bc73ccd

4 files changed

Lines changed: 83 additions & 3 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ormar_rust_utils"
3-
version = "0.1.0"
3+
version = "0.1.1"
44
edition = "2021"
55
description = "Rust-accelerated utility functions for the ormar ORM"
66
license = "MIT"

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "maturin"
44

55
[project]
66
name = "ormar-utils"
7-
version = "0.1.0"
7+
version = "0.1.1"
88
description = "Rust-accelerated utility functions for the ormar ORM"
99
readme = "README.md"
1010
license = { text = "MIT" }
@@ -35,7 +35,7 @@ features = ["pyo3/extension-module"]
3535

3636
[tool.poetry]
3737
name = "ormar-utils"
38-
version = "0.1.0"
38+
version = "0.1.1"
3939
description = "Rust-accelerated utility functions for the ormar ORM"
4040
authors = ["Radosław Drążkiewicz <collerek@gmail.com>"]
4141
package-mode = false

src/alias_utils.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use pyo3::prelude::*;
2+
use pyo3::types::PyDict;
3+
use std::collections::HashMap;
4+
5+
/// Build a reverse mapping from alias -> field_name given a forward mapping
6+
/// of field_name -> alias. If a field has no alias (alias == field_name),
7+
/// it still gets an identity entry.
8+
///
9+
/// This is called once per model class and cached.
10+
#[pyfunction]
11+
pub fn build_reverse_alias_map<'py>(
12+
py: Python<'py>,
13+
field_alias_map: &Bound<'py, PyDict>,
14+
) -> PyResult<Bound<'py, PyDict>> {
15+
let result = PyDict::new(py);
16+
for (key, value) in field_alias_map.iter() {
17+
let field_name: String = key.extract()?;
18+
let alias: String = value.extract()?;
19+
// Map alias -> field_name
20+
result.set_item(&alias, &field_name)?;
21+
// Also keep field_name -> field_name for identity lookups
22+
if alias != field_name {
23+
result.set_item(&field_name, &field_name)?;
24+
}
25+
}
26+
Ok(result)
27+
}
28+
29+
/// Translate dict keys from field names to their database aliases.
30+
/// Takes the dict to translate and a field_name->alias mapping.
31+
/// Returns a new dict with aliased keys.
32+
#[pyfunction]
33+
pub fn translate_columns_to_aliases<'py>(
34+
py: Python<'py>,
35+
new_kwargs: &Bound<'py, PyDict>,
36+
field_to_alias: &Bound<'py, PyDict>,
37+
) -> PyResult<Bound<'py, PyDict>> {
38+
let result = PyDict::new(py);
39+
// Pre-extract the mapping into a Rust HashMap for fast lookup
40+
let mut alias_map: HashMap<String, String> = HashMap::new();
41+
for (k, v) in field_to_alias.iter() {
42+
let key: String = k.extract()?;
43+
let val: String = v.extract()?;
44+
alias_map.insert(key, val);
45+
}
46+
47+
for (key, value) in new_kwargs.iter() {
48+
let field_name: String = key.extract()?;
49+
if let Some(alias) = alias_map.get(&field_name) {
50+
result.set_item(alias, value)?;
51+
} else {
52+
result.set_item(key, value)?;
53+
}
54+
}
55+
Ok(result)
56+
}
57+
58+
/// Translate dict keys from database aliases to field names.
59+
/// Takes the dict to translate and an alias->field_name mapping.
60+
/// Returns a new dict with field name keys.
61+
#[pyfunction]
62+
pub fn translate_aliases_to_columns<'py>(
63+
py: Python<'py>,
64+
new_kwargs: &Bound<'py, PyDict>,
65+
alias_to_field: &Bound<'py, PyDict>,
66+
) -> PyResult<Bound<'py, PyDict>> {
67+
let result = PyDict::new(py);
68+
for (key, value) in new_kwargs.iter() {
69+
if let Some(field_name) = alias_to_field.get_item(&key)? {
70+
result.set_item(field_name, value)?;
71+
} else {
72+
result.set_item(key, value)?;
73+
}
74+
}
75+
Ok(result)
76+
}

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
mod alias_utils;
12
mod extract_columns;
23
mod group_related;
34
mod hash_item;
@@ -24,5 +25,8 @@ fn ormar_rust_utils(m: &Bound<'_, PyModule>) -> PyResult<()> {
2425
m.add_function(wrap_pyfunction!(prepare_save::prepare_model_to_save, m)?)?;
2526
m.add_function(wrap_pyfunction!(merge_instances::group_by_pk, m)?)?;
2627
m.add_function(wrap_pyfunction!(merge_items::plan_merge_items_lists, m)?)?;
28+
m.add_function(wrap_pyfunction!(alias_utils::build_reverse_alias_map, m)?)?;
29+
m.add_function(wrap_pyfunction!(alias_utils::translate_columns_to_aliases, m)?)?;
30+
m.add_function(wrap_pyfunction!(alias_utils::translate_aliases_to_columns, m)?)?;
2731
Ok(())
2832
}

0 commit comments

Comments
 (0)