From 6a5efe5e7bacc5ed25824653ddd740e42900f04e Mon Sep 17 00:00:00 2001
From: Tim Macdonald <tim@metabase.com>
Date: Mon, 29 Apr 2024 15:40:57 +0100
Subject: [PATCH] Native Query Analyzer cleanup (#41950)

* Missing sentence for NQA documentation

* Add a test for optional field filter parsing
---
 src/metabase/native_query_analyzer.clj                       | 3 ++-
 .../native_query_analyzer/parameter_substitution_test.clj    | 5 +++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/metabase/native_query_analyzer.clj b/src/metabase/native_query_analyzer.clj
index dd0c93d3de6..b455a34bb09 100644
--- a/src/metabase/native_query_analyzer.clj
+++ b/src/metabase/native_query_analyzer.clj
@@ -6,7 +6,8 @@
   2. Contain Metabase-specific business logic.
 
   The primary way of interacting with parsed queries is through their associated QueryFields (see model
-  file). QueryFields are maintained through the `update-query-fields-for-card!` function.
+  file). QueryFields are maintained through the `update-query-fields-for-card!` function. This is invoked as part of
+  the lifecycle of a card (see Card model).
 
   Query rewriting happens with the `replace-names` function."
   (:require
diff --git a/test/metabase/native_query_analyzer/parameter_substitution_test.clj b/test/metabase/native_query_analyzer/parameter_substitution_test.clj
index 3bc1d365fe8..b584f977ca9 100644
--- a/test/metabase/native_query_analyzer/parameter_substitution_test.clj
+++ b/test/metabase/native_query_analyzer/parameter_substitution_test.clj
@@ -166,6 +166,11 @@
          (->sql (mt/native-query {:template-tags (tags "num_between")
                                   :query         "SELECT * FROM orders WHERE {{num_between}}"})))))
 
+(deftest optional-field-filter-test
+    (is (= "SELECT * FROM orders WHERE \"PUBLIC\".\"ORDERS\".\"TOTAL\" BETWEEN 1 AND 2 AND (\"PUBLIC\".\"ORDERS\".\"TOTAL\" = 1)"
+         (->sql (mt/native-query {:template-tags (tags "num_between" "num_eq")
+                                  :query         "SELECT * FROM orders WHERE {{num_between}} [[AND {{num_eq}}]]"})))))
+
 (deftest field-filter-string-test
   (is (= "SELECT * FROM people WHERE ((\"PUBLIC\".\"PEOPLE\".\"NAME\" <> ?) OR (\"PUBLIC\".\"PEOPLE\".\"NAME\" IS NULL))"
          (->sql (mt/native-query {:template-tags (tags "str_not_eq")
-- 
GitLab