in zetasql-toolkit-core/src/main/java/com/google/zetasql/toolkit/tools/lineage/ColumnLineageExtractor.java [169:201]
public static Set<ColumnLineage> extractColumnLevelLineage(ResolvedInsertStmt insertStmt) {
if (Objects.isNull(insertStmt.getQuery())) {
// The statement is inserting rows manually using "INSERT INTO ... VALUES ..."
// Since it does not query any tables, it does not produce lineage
return ImmutableSet.of();
}
Table targetTable = insertStmt.getTableScan().getTable();
ResolvedScan query = insertStmt.getQuery();
List<ResolvedColumn> insertedColumns =
insertStmt.getInsertColumnList().stream()
.map(ColumnLineageExtractor::expandColumn)
.flatMap(List::stream)
.collect(Collectors.toList());
List<ResolvedColumn> matchingColumnsInQuery =
query.getColumnList().stream()
.map(ColumnLineageExtractor::expandColumn)
.flatMap(List::stream)
.collect(Collectors.toList());
return IntStream.range(0, insertedColumns.size())
.mapToObj(
index ->
new SimpleEntry<>(
insertedColumns.get(index),
ParentColumnFinder.findParentsForColumn(
insertStmt, matchingColumnsInQuery.get(index))))
.map(
entry ->
buildColumnLineage(
targetTable.getFullName(), entry.getKey().getName(), entry.getValue()))
.collect(Collectors.toSet());
}