convertStatementToJSON converts an AST statement to JSON representation
(stmt ast.Statement)
| 486 | |
| 487 | // convertStatementToJSON converts an AST statement to JSON representation |
| 488 | func convertStatementToJSON(stmt ast.Statement) JSONStatement { |
| 489 | result := JSONStatement{ |
| 490 | Type: fmt.Sprintf("%T", stmt), |
| 491 | Details: make(map[string]interface{}), |
| 492 | } |
| 493 | |
| 494 | // Simplify type name |
| 495 | if len(result.Type) > 0 && result.Type[0] == '*' { |
| 496 | result.Type = result.Type[1:] |
| 497 | } |
| 498 | for i := len(result.Type) - 1; i >= 0; i-- { |
| 499 | if result.Type[i] == '.' { |
| 500 | result.Type = result.Type[i+1:] |
| 501 | break |
| 502 | } |
| 503 | } |
| 504 | |
| 505 | // Add statement-specific details |
| 506 | switch s := stmt.(type) { |
| 507 | case *ast.SelectStatement: |
| 508 | result.Details["columns"] = len(s.Columns) |
| 509 | result.Details["has_from"] = len(s.From) > 0 |
| 510 | result.Details["has_where"] = s.Where != nil |
| 511 | result.Details["has_group_by"] = len(s.GroupBy) > 0 |
| 512 | result.Details["has_order_by"] = len(s.OrderBy) > 0 |
| 513 | result.Details["has_limit"] = s.Limit != nil |
| 514 | result.Details["has_distinct"] = s.Distinct |
| 515 | if s.With != nil { |
| 516 | result.Details["has_with"] = true |
| 517 | result.Details["cte_count"] = len(s.With.CTEs) |
| 518 | } |
| 519 | case *ast.InsertStatement: |
| 520 | result.Details["has_table"] = s.TableName != "" |
| 521 | result.Details["has_values"] = s.Values != nil |
| 522 | result.Details["has_columns"] = len(s.Columns) > 0 |
| 523 | case *ast.UpdateStatement: |
| 524 | result.Details["has_table"] = s.TableName != "" |
| 525 | result.Details["has_where"] = s.Where != nil |
| 526 | result.Details["set_count"] = len(s.Assignments) |
| 527 | case *ast.DeleteStatement: |
| 528 | result.Details["has_table"] = s.TableName != "" |
| 529 | result.Details["has_where"] = s.Where != nil |
| 530 | case *ast.CreateTableStatement: |
| 531 | result.Details["object_type"] = "table" |
| 532 | result.Details["has_if_not_exists"] = s.IfNotExists |
| 533 | case *ast.CreateIndexStatement: |
| 534 | result.Details["object_type"] = "index" |
| 535 | result.Details["has_unique"] = s.Unique |
| 536 | } |
| 537 | |
| 538 | return result |
| 539 | } |
no outgoing calls