def from_api( # noqa: C901 cls, model: str, explore_name: str, client: Looker31SDK, reporter: SourceReport, ) -> Optional["LookerExplore"]: # noqa: C901 try: explore = client.lookml_model_explore(model, explore_name) views = set() if explore.joins is not None and explore.joins != []: if explore.view_name is not None and explore.view_name != explore.name: # explore is renaming the view name, we will need to swap references to explore.name with explore.view_name aliased_explore = True views.add(explore.view_name) else: aliased_explore = False 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) if (view_name == explore.name) and aliased_explore: assert explore.view_name is not None view_name = explore.view_name views.add(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 else: assert explore.view_name is not None views.add(explore.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: logger.warn("Failed to extract explore {} from model {}.".format( explore_name, model)) except AssertionError: reporter.report_warning( key="chart-", reason="Was unable to find dependent views for this chart", ) return None
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