fix(viz): calendar heatmap granularity (#13233)

* fix: add time granularity to heatmap query

* fix: add time granularity to heatmap query

* Add aggregation for druid

* Fix lint

* Fix lint

Co-authored-by: Victor Malai <victormalai@Victors-MacBook-Pro.local>
diff --git a/superset/viz.py b/superset/viz.py
index 49775b3..face56f 100644
--- a/superset/viz.py
+++ b/superset/viz.py
@@ -998,7 +998,6 @@
             return None
 
         form_data = self.form_data
-
         data = {}
         records = df.to_dict("records")
         for metric in self.metric_labels:
@@ -1029,7 +1028,7 @@
         diff_secs = (end - start).total_seconds()
 
         if domain == "year":
-            range_ = diff_delta.years + 1
+            range_ = end.year - start.year + 1
         elif domain == "month":
             range_ = diff_delta.years * 12 + diff_delta.months + 1
         elif domain == "week":
@@ -1051,6 +1050,19 @@
         d = super().query_obj()
         fd = self.form_data
         d["metrics"] = fd.get("metrics")
+        mapping = {
+            "min": "PT1M",
+            "hour": "PT1H",
+            "day": "P1D",
+            "week": "P1W",
+            "month": "P1M",
+            "year": "P1Y",
+        }
+        time_grain = mapping[fd.get("subdomain_granularity", "min")]
+        if self.datasource.type == "druid":
+            d["granularity"] = time_grain
+        else:
+            d["extras"]["time_grain_sqla"] = time_grain
         return d