Esempio n. 1
0
 def _get_folder_path(self, folder: FolderBase, client: Looker31SDK) -> str:
     assert folder.id is not None
     ancestors = [
         ancestor.name
         for ancestor in client.folder_ancestors(folder.id, fields="name")
     ]
     return "/".join(ancestors + [folder.name])
Esempio n. 2
0
 def _get_folder_path(self, folder: FolderBase, client: Looker31SDK) -> str:
     assert folder.id
     if not self.folder_path_cache.get(folder.id):
         ancestors = [
             ancestor.name
             for ancestor in client.folder_ancestors(folder.id, fields="name")
         ]
         self.folder_path_cache[folder.id] = "/".join(ancestors + [folder.name])
     return self.folder_path_cache[folder.id]
Esempio n. 3
0
 def _get_folder_path(self, folder: FolderBase, client: Looker31SDK) -> str:
     assert folder.id
     if not self.folder_path_cache.get(folder.id):
         ancestors = [
             ancestor.name for ancestor in client.folder_ancestors(
                 folder.id,
                 fields="name",
                 transport_options=self.source_config.transport_options.
                 get_transport_options() if self.source_config.
                 transport_options is not None else None,
             )
         ]
         self.folder_path_cache[folder.id] = "/".join(ancestors +
                                                      [folder.name])
     return self.folder_path_cache[folder.id]
Esempio n. 4
0
    def from_api(  # noqa: C901
        cls,
        model: str,
        explore_name: str,
        client: Looker31SDK,
        reporter: SourceReport,
        transport_options: Optional[TransportOptions],
    ) -> Optional["LookerExplore"]:  # noqa: C901
        try:
            explore = client.lookml_model_explore(
                model, explore_name, transport_options=transport_options)
            views = set()

            if explore.view_name is not None and explore.view_name != explore.name:
                # explore is not named after a view and is instead using a from field, which is modeled as view_name.
                aliased_explore = True
                views.add(explore.view_name)
            else:
                # otherwise, the explore name is a view, so add it to the set.
                aliased_explore = False
                if explore.name is not None:
                    views.add(explore.name)

            if explore.joins is not None and explore.joins != []:
                potential_views = [
                    e.name for e in explore.joins if e.name is not None
                ]
                for e_join in [
                        e for e in explore.joins
                        if e.dependent_fields is not None
                ]:
                    assert e_join.dependent_fields is not None
                    for field_name in e_join.dependent_fields:
                        try:
                            view_name = LookerUtil._extract_view_from_field(
                                field_name)
                            potential_views.append(view_name)
                        except AssertionError:
                            reporter.report_warning(
                                key=f"chart-field-{field_name}",
                                reason=
                                "The field was not prefixed by a view name. This can happen when the field references another dynamic field.",
                            )
                            continue

                for view_name in potential_views:
                    if (view_name == explore.name) and aliased_explore:
                        # if the explore is aliased, then the joins could be referring to views using the aliased name.
                        # this needs to be corrected by switching to the actual view name of the explore
                        assert explore.view_name is not None
                        view_name = explore.view_name
                    views.add(view_name)

            view_fields: List[ViewField] = []
            if explore.fields is not None:
                if explore.fields.dimensions is not None:
                    for dim_field in explore.fields.dimensions:
                        if dim_field.name is None:
                            continue
                        else:
                            view_fields.append(
                                ViewField(
                                    name=dim_field.name,
                                    description=dim_field.description
                                    if dim_field.description else "",
                                    type=dim_field.type
                                    if dim_field.type is not None else "",
                                    field_type=ViewFieldType.DIMENSION_GROUP
                                    if dim_field.dimension_group is not None
                                    else ViewFieldType.DIMENSION,
                                    is_primary_key=dim_field.primary_key
                                    if dim_field.primary_key else False,
                                ))
                if explore.fields.measures is not None:
                    for measure_field in explore.fields.measures:
                        if measure_field.name is None:
                            continue
                        else:
                            view_fields.append(
                                ViewField(
                                    name=measure_field.name,
                                    description=measure_field.description
                                    if measure_field.description else "",
                                    type=measure_field.type
                                    if measure_field.type is not None else "",
                                    field_type=ViewFieldType.MEASURE,
                                    is_primary_key=measure_field.primary_key
                                    if measure_field.primary_key else False,
                                ))

            return cls(
                name=explore_name,
                model_name=model,
                project_name=explore.project_name,
                label=explore.label,
                description=explore.description,
                fields=view_fields,
                upstream_views=list(views),
                source_file=explore.source_file,
            )
        except SDKError as e:
            logger.warn("Failed to extract explore {} from model {}.".format(
                explore_name, model))
            logger.debug(
                "Failed to extract explore {} from model {} with {}".format(
                    explore_name, model, e))
        except AssertionError:
            reporter.report_warning(
                key="chart-",
                reason="Was unable to find dependent views for this chart",
            )
        return None