Skip to content

Commit 00a34ba

Browse files
committed
Added support for defaults for true/false version of variable substitution in benchmark files - ${VARIABLE:-default|true value|false value}
1 parent dca99d7 commit 00a34ba

2 files changed

Lines changed: 46 additions & 15 deletions

File tree

benchmarks/sql_benchmarks/README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ Variables are supported in two forms:
5555

5656
* string substitution based on environment variables (with default values if unset): \${ENV_VAR} and
5757
\${ENV_VAR:-default}.
58-
* if / else based on whether an environment variable is true or not (\${ENV_VAR|true value|false value}). In this
59-
form only the value `true` (case-insensitive) selects the true branch; any other set value selects the false branch.
60-
If ENV_VAR is unset the benchmark will return an error.
58+
* if / else based on whether an environment variable is true or not
59+
(\${ENV_VAR:-default|true value|false value}). In this form only the value `true` (case-insensitive) selects the
60+
true branch; any other set value selects the false branch. If ENV_VAR is unset, `default` is used to select the
61+
branch.
6162

6263
Comments in files are supported with lines starting with # or --.
6364

benchmarks/src/sql_benchmark.rs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,15 +1310,16 @@ fn replace_all<E>(
13101310
}
13111311

13121312
static TRUE_FALSE_REPLACEMENT_RE: LazyLock<Regex> = LazyLock::new(|| {
1313-
Regex::new(r"\$\{(\w+)\|([^|]+)\|([^}]+)}").expect("Regex failed to compile")
1313+
Regex::new(r"\$\{(\w+)(?::-([^|}]+))?\|([^|]+)\|([^}]+)}")
1314+
.expect("Regex failed to compile")
13141315
});
13151316

13161317
static VARIABLE_REPLACEMENT_RE: LazyLock<Regex> = LazyLock::new(|| {
13171318
Regex::new(r"\$\{(\w+)(?::-([^}]+))?}").expect("Regex failed to compile")
13181319
});
13191320

13201321
/// Replace all `${KEY}` or `${KEY:-default}` placeholders in a string according to the mapping.
1321-
/// Also handles `${KEY|True value|false value}` syntax.
1322+
/// Also handles `${KEY:-default|True value|false value}` syntax.
13221323
fn process_replacements(
13231324
input: &str,
13241325
replacement_map: &HashMap<String, String>,
@@ -1333,13 +1334,14 @@ fn process_replacements_with_env(
13331334
) -> Result<String> {
13341335
debug!("processing replacements for line '{input}'");
13351336

1336-
// handle ${VAR|true value|false value} syntax
1337+
// handle ${VAR:-default|true value|false value} syntax
13371338
let replacement = |caps: &regex::Captures| -> Result<String> {
13381339
let key = &caps[1];
1339-
let true_val = &caps[2];
1340-
let false_val = &caps[3];
1340+
let default = caps.get(2).map(|m| m.as_str().to_string());
1341+
let true_val = &caps[3];
1342+
let false_val = &caps[4];
13411343

1342-
let value = lookup_replacement_value(key, replacement_map, &get_env);
1344+
let value = lookup_replacement_value(key, replacement_map, &get_env).or(default);
13431345

13441346
match value {
13451347
Some(v) if v.eq_ignore_ascii_case("true") => Ok(true_val.to_string()),
@@ -1690,7 +1692,7 @@ mod tests {
16901692
let env = replacement_map(&[("USE_PARQUET", "TrUe")]);
16911693

16921694
let actual = process_replacements_with_env(
1693-
"load_${USE_PARQUET|parquet|csv}.sql",
1695+
"load_${USE_PARQUET:-false|parquet|csv}.sql",
16941696
&replacements,
16951697
|key| env.get(key).cloned(),
16961698
)
@@ -1705,7 +1707,7 @@ mod tests {
17051707
let env = replacement_map(&[("USE_PARQUET", "false")]);
17061708

17071709
let actual = process_replacements_with_env(
1708-
"load_${USE_PARQUET|parquet|csv}.sql",
1710+
"load_${USE_PARQUET:-true|parquet|csv}.sql",
17091711
&replacements,
17101712
|key| env.get(key).cloned(),
17111713
)
@@ -1719,7 +1721,7 @@ mod tests {
17191721
let replacements = replacement_map(&[("USE_PARQUET", "true")]);
17201722

17211723
let actual = process_replacements_with_env(
1722-
"load_${USE_PARQUET|parquet|csv}.sql",
1724+
"load_${USE_PARQUET:-false|parquet|csv}.sql",
17231725
&replacements,
17241726
|_| None,
17251727
)
@@ -1734,7 +1736,7 @@ mod tests {
17341736
let env = replacement_map(&[("USE_PARQUET", "true")]);
17351737

17361738
let actual = process_replacements_with_env(
1737-
"load_${USE_PARQUET|parquet|csv}.sql",
1739+
"load_${USE_PARQUET:-true|parquet|csv}.sql",
17381740
&replacements,
17391741
|key| env.get(key).cloned(),
17401742
)
@@ -1744,7 +1746,35 @@ mod tests {
17441746
}
17451747

17461748
#[test]
1747-
fn process_replacements_reports_missing_true_false_env_variable() {
1749+
fn process_replacements_uses_true_false_default_for_missing_true_value() {
1750+
let replacements = HashMap::new();
1751+
1752+
let actual = process_replacements_with_env(
1753+
"load_${USE_PARQUET:-true|parquet|csv}.sql",
1754+
&replacements,
1755+
|_| None,
1756+
)
1757+
.expect("replacement should succeed");
1758+
1759+
assert_eq!(actual, "load_parquet.sql");
1760+
}
1761+
1762+
#[test]
1763+
fn process_replacements_uses_true_false_default_for_missing_false_value() {
1764+
let replacements = HashMap::new();
1765+
1766+
let actual = process_replacements_with_env(
1767+
"load_${USE_PARQUET:-false|parquet|csv}.sql",
1768+
&replacements,
1769+
|_| None,
1770+
)
1771+
.expect("replacement should succeed");
1772+
1773+
assert_eq!(actual, "load_csv.sql");
1774+
}
1775+
1776+
#[test]
1777+
fn process_replacements_reports_missing_true_false_variable_without_default() {
17481778
let replacements = HashMap::new();
17491779

17501780
let error = process_replacements_with_env(
@@ -1768,7 +1798,7 @@ mod tests {
17681798
let env = replacement_map(&[("USE_TYPED_PATH", "true")]);
17691799

17701800
let actual = process_replacements_with_env(
1771-
"${USE_TYPED_PATH|data.${FILE_TYPE}|data.csv}",
1801+
"${USE_TYPED_PATH:-false|data.${FILE_TYPE}|data.csv}",
17721802
&replacements,
17731803
|key| env.get(key).cloned(),
17741804
)

0 commit comments

Comments
 (0)