createViewsInOrder creates views in topological order (dependencies first)
(diff *schema.MetadataDiff, buf *strings.Builder)
| 1343 | |
| 1344 | // createViewsInOrder creates views in topological order (dependencies first) |
| 1345 | func 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 |
no test coverage detected