MCPcopy Create free account
hub / github.com/bytebase/bytebase / createViewsInOrder

Function createViewsInOrder

backend/plugin/schema/mssql/generate_migration.go:1345–1457  ·  view source on GitHub ↗

createViewsInOrder creates views in topological order (dependencies first)

(diff *schema.MetadataDiff, buf *strings.Builder)

Source from the content-addressed store, hash-verified

1343
1344// createViewsInOrder creates views in topological order (dependencies first)
1345func createViewsInOrder(diff *schema.MetadataDiff, buf *strings.Builder) {
1346 // Build dependency graph for views being created or altered
1347 graph := base.NewGraph()
1348 viewMap := make(map[string]*schema.ViewDiff)
1349
1350 // First pass: Add all views to be created or altered to the graph and viewMap
1351 // Sort for deterministic processing order
1352 var viewsToProcess []*schema.ViewDiff
1353 for _, viewDiff := range diff.ViewChanges {
1354 if viewDiff.Action == schema.MetadataDiffActionCreate || viewDiff.Action == schema.MetadataDiffActionAlter {
1355 viewsToProcess = append(viewsToProcess, viewDiff)
1356 }
1357 }
1358 slices.SortFunc(viewsToProcess, func(i, j *schema.ViewDiff) int {
1359 iFullName := getObjectID(i.SchemaName, i.ViewName)
1360 jFullName := getObjectID(j.SchemaName, j.ViewName)
1361 if iFullName < jFullName {
1362 return -1
1363 }
1364 if iFullName > jFullName {
1365 return 1
1366 }
1367 return 0
1368 })
1369
1370 for _, viewDiff := range viewsToProcess {
1371 viewID := getObjectID(viewDiff.SchemaName, viewDiff.ViewName)
1372 graph.AddNode(viewID)
1373 viewMap[viewID] = viewDiff
1374 }
1375
1376 // Second pass: Add dependency edges now that all views are in viewMap
1377 for _, viewDiff := range viewsToProcess {
1378 viewID := getObjectID(viewDiff.SchemaName, viewDiff.ViewName)
1379
1380 // Get dependencies from the new view definition
1381 if viewDiff.NewView != nil && viewDiff.NewView.Definition != "" {
1382 deps, err := getViewDependencies(viewDiff.NewView.Definition, viewDiff.SchemaName)
1383 if err != nil {
1384 // If we can't parse dependencies, we'll just create in original order
1385 continue
1386 }
1387
1388 // Add edges from dependencies to this view
1389 for _, dep := range deps {
1390 // Only add edge if the dependency is also being created/altered
1391 if _, exists := viewMap[dep]; exists {
1392 graph.AddEdge(dep, viewID)
1393 }
1394 }
1395 }
1396 }
1397
1398 // Get topological order
1399 orderedList, err := graph.TopologicalSort()
1400 if err != nil {
1401 // If there's a cycle or error, fall back to original order
1402 var fallbackViews []*schema.ViewDiff

Callers 1

generateMigrationFunction · 0.85

Calls 7

AddNodeMethod · 0.95
AddEdgeMethod · 0.95
TopologicalSortMethod · 0.95
NewGraphFunction · 0.92
generateViewCommentSQLFunction · 0.85
getObjectIDFunction · 0.70
getViewDependenciesFunction · 0.70

Tested by

no test coverage detected