Skip to content

Commit ae7bd0b

Browse files
Fix bug for lineage metadata
1 parent 2c4931a commit ae7bd0b

File tree

4 files changed

+33
-25
lines changed

4 files changed

+33
-25
lines changed

metadata-ingestion/setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@
395395
# databricks is alias for unity-catalog and needs to be kept in sync
396396
"databricks": databricks | sql_common | sqllineage_lib,
397397
"fivetran": snowflake_common | bigquery_common,
398-
"qlik-sense": {"requests", "websocket-client"},
398+
"qlik-sense": {"requests", "websocket-client"} | sqlglot_lib,
399399
}
400400

401401
# This is mainly used to exclude plugins from the Docker image.

metadata-ingestion/src/datahub/ingestion/source/qlik_sense/data_classes.py

+3-9
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ def update_values(cls, values: Dict) -> Dict:
191191

192192
class QlikTable(BaseModel):
193193
tableName: str
194-
databaseName: str
195194
type: BoxType = Field(alias="boxType")
196195
tableAlias: str
197196
dataconnectorid: str
@@ -200,22 +199,17 @@ class QlikTable(BaseModel):
200199
spaceId: str
201200
datasetSchema: List[SchemaField] = Field(alias="fields")
202201
tableQri: Optional[str] = None
202+
selectStatement: Optional[str] = None
203+
databaseName: Optional[str] = None
203204
schemaName: Optional[str] = None
204205

205206
@root_validator(pre=True)
206207
def update_values(cls, values: Dict) -> Dict:
207-
if values["boxType"] == BoxType.BLACKBOX.value:
208-
values[Constant.DATABASENAME] = values[Constant.CONNECTORPROPERTIES][
209-
Constant.TABLEQUALIFIERS
210-
][0]
211-
values[Constant.SCHEMANAME] = values[Constant.CONNECTORPROPERTIES][
212-
Constant.TABLEQUALIFIERS
213-
][1]
214208
values[Constant.DATACONNECTORID] = values[Constant.CONNECTIONINFO][Constant.ID]
215209
values[Constant.DATACONNECTORPLATFORM] = values[Constant.CONNECTIONINFO][
216210
Constant.SOURCECONNECTORID
217211
]
218-
values[Constant.SPACEID] = values[Constant.CONNECTIONINFO]["space"]
212+
values[Constant.SPACEID] = values[Constant.CONNECTIONINFO][Constant.SPACE]
219213
return values
220214

221215

metadata-ingestion/src/datahub/ingestion/source/qlik_sense/qlik_api.py

+22-12
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ def _get_sheet(
124124
)
125125
response = websocket_connection.websocket_send_request(method="GetLayout")
126126
sheet_dict = response[Constant.QLAYOUT]
127+
if Constant.OWNERID not in sheet_dict[Constant.QMETA]:
128+
# That means sheet is private sheet
129+
return None
127130
sheet = Sheet.parse_obj(sheet_dict[Constant.QMETA])
128131
for i, chart_dict in enumerate(
129132
sheet_dict[Constant.QCHILDLIST][Constant.QITEMS]
@@ -159,20 +162,27 @@ def _add_qri_of_tables(self, tables: List[QlikTable], app_id: str) -> None:
159162
f"{self.rest_api_url}/lineage-graphs/nodes/{app_qri}/actions/expand?node={table_node_qri}&level=FIELD"
160163
)
161164
response.raise_for_status()
162-
field_node_qri = list(
165+
field_nodes_qris = list(
163166
response.json()[Constant.GRAPH][Constant.NODES].keys()
164-
)[0]
165-
response = self.session.post(
166-
f"{self.rest_api_url}/lineage-graphs/nodes/{app_qri}/overview",
167-
json=[field_node_qri],
168167
)
169-
response.raise_for_status()
170-
for each_lineage in response.json()[Constant.RESOURCES][0][
171-
Constant.LINEAGE
172-
]:
173-
table_qri_dict[each_lineage[Constant.TABLELABEL]] = each_lineage[
174-
Constant.TABLEQRI
175-
]
168+
for field_node_qri in field_nodes_qris:
169+
response = self.session.post(
170+
f"{self.rest_api_url}/lineage-graphs/nodes/{app_qri}/overview",
171+
json=[field_node_qri],
172+
)
173+
response.raise_for_status()
174+
# Some fields might not have lineage overview, in that case status code is 207
175+
if response.status_code == 200:
176+
for each_lineage in response.json()[Constant.RESOURCES][0][
177+
Constant.LINEAGE
178+
]:
179+
table_name = (
180+
each_lineage[Constant.TABLELABEL]
181+
.replace('"', "")
182+
.split(".")[-1]
183+
)
184+
table_qri_dict[table_name] = each_lineage[Constant.TABLEQRI]
185+
break
176186
for table in tables:
177187
if table.tableName in table_qri_dict:
178188
table.tableQri = table_qri_dict[table.tableName]

metadata-ingestion/src/datahub/ingestion/source/qlik_sense/qlik_sense.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
OwnershipTypeClass,
8585
SchemaFieldDataTypeClass,
8686
)
87+
from datahub.sql_parsing.sqlglot_lineage import create_lineage_sql_parsed_result
8788

8889
# Logger instance
8990
logger = logging.getLogger(__name__)
@@ -331,14 +332,17 @@ def _gen_app_table_upstream_lineage(
331332
),
332333
)
333334
)
334-
upstream_dataset_urn = builder.make_dataset_urn_with_platform_instance(
335-
name=f"{table.databaseName}.{table.schemaName}.{table.tableName}".lower(),
335+
if not table.selectStatement:
336+
return None
337+
upstream_dataset_urn = create_lineage_sql_parsed_result(
338+
query=table.selectStatement.strip(),
339+
default_db=None,
336340
platform=KNOWN_DATA_PLATFORM_MAPPING.get(
337341
table.dataconnectorPlatform, table.dataconnectorPlatform
338342
),
339343
env=upstream_dataset_platform_detail.env,
340344
platform_instance=upstream_dataset_platform_detail.platform_instance,
341-
)
345+
).in_tables[0]
342346
elif table.type == BoxType.LOADFILE:
343347
upstream_dataset_urn = self._gen_qlik_dataset_urn(
344348
f"{table.spaceId}.{table.databaseName}".lower()

0 commit comments

Comments
 (0)