generator/explores/funnel_analysis_explore.py (49 lines of code) (raw):
"""Funnel Analysis explore type."""
from __future__ import annotations
from pathlib import Path
from typing import Any, Dict, Iterator, List, Optional
from ..views import View
from . import Explore
class FunnelAnalysisExplore(Explore):
"""A Funnel Analysis Explore, from Baseline Clients Last Seen."""
type: str = "funnel_analysis_explore"
n_funnel_steps: int = 4
@staticmethod
def from_views(views: List[View]) -> Iterator[FunnelAnalysisExplore]:
"""
If possible, generate a Funnel Analysis explore for this namespace.
Funnel analysis explores are only created for funnel_analysis views.
"""
for view in views:
if view.name == "funnel_analysis":
yield FunnelAnalysisExplore(
"funnel_analysis",
{"base_view": view.name},
)
@staticmethod
def from_dict(name: str, defn: dict, views_path: Path) -> FunnelAnalysisExplore:
"""Get an instance of this explore from a dictionary definition."""
return FunnelAnalysisExplore(name, defn["views"], views_path)
def _to_lookml(self, v1_name: Optional[str]) -> List[Dict[str, Any]]:
view_lookml = self.get_view_lookml("funnel_analysis")
views = view_lookml["views"]
n_events = len([d for d in views if d["name"].startswith("step_")])
explore_lookml = {
"name": "funnel_analysis",
"description": "Count funnel completion over time. Funnels are limited to a single day.",
"view_label": " User-Day Funnels",
"always_filter": {
"filters": [
{"submission_date": "14 days"},
]
},
"joins": [
{
"name": f"step_{n}",
"relationship": "many_to_one",
"type": "cross",
}
for n in range(1, n_events + 1)
],
"sql_always_where": "${funnel_analysis.submission_date} >= '2010-01-01'",
}
if datagroup := self.get_datagroup():
explore_lookml["persist_with"] = datagroup
defn: List[Dict[str, Any]] = [
explore_lookml,
{"name": "event_names", "hidden": "yes"},
]
return defn