From ad2b646700ee3735c936c368c57254e9cd9b5276 Mon Sep 17 00:00:00 2001 From: Thom Chiovoloni Date: Wed, 27 Jun 2018 18:54:28 -0700 Subject: [PATCH] Remove regex dependency from query_sql. Fixes #771. --- query-sql/Cargo.toml | 1 - query-sql/src/lib.rs | 28 ++++++++++++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/query-sql/Cargo.toml b/query-sql/Cargo.toml index 583612e2..72cfaee5 100644 --- a/query-sql/Cargo.toml +++ b/query-sql/Cargo.toml @@ -4,7 +4,6 @@ version = "0.0.1" workspace = ".." [dependencies] -regex = "0.2" [dependencies.mentat_core] path = "../core" diff --git a/query-sql/src/lib.rs b/query-sql/src/lib.rs index 47a1655c..32a9ae60 100644 --- a/query-sql/src/lib.rs +++ b/query-sql/src/lib.rs @@ -8,7 +8,6 @@ // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. -extern crate regex; #[macro_use] extern crate mentat_core; extern crate mentat_query; extern crate mentat_query_algebrizer; @@ -559,15 +558,21 @@ impl QueryFragment for FromClause { } } +/// `var` is something like `?foo99-people`. +/// Trim the `?` and escape the rest. Prepend `i` to distinguish from +/// the inline value space `v`. +fn format_select_var(var: &str) -> String { + use std::iter::once; + let without_question = var.split_at(1).1; + let replaced_iter = without_question.chars().map(|c| + if c.is_ascii_alphanumeric() { c } else { '_' }); + // Prefix with `i` (Avoiding this copy is probably not worth the trouble but whatever). + once('i').chain(replaced_iter).collect() +} + impl SelectQuery { fn push_variable_param(&self, var: &Variable, out: &mut QueryBuilder) -> BuildQueryResult { - // `var` is something like `?foo99-people`. - // Trim the `?` and escape the rest. Prepend `i` to distinguish from - // the inline value space `v`. - let re = regex::Regex::new("[^a-zA-Z_0-9]").unwrap(); - let without_question = var.as_str().split_at(1).1; - let replaced = re.replace_all(without_question, "_"); - let bind_param = format!("i{}", replaced); // We _could_ avoid this copying. + let bind_param = format_select_var(var.as_str()); out.push_bind_param(bind_param.as_str()) } } @@ -817,4 +822,11 @@ mod tests { assert!(args.is_empty()); } + + #[test] + fn test_format_select_var() { + assert_eq!(format_select_var("?foo99-people"), "ifoo99_people"); + assert_eq!(format_select_var("?FOO99-pëople.123"), "iFOO99_p_ople_123"); + assert_eq!(format_select_var("?foo①bar越"), "ifoo_bar_"); + } }