github.com/vescale/zgraph@v0.0.0-20230410094002-959c02d50f95/parser/ast/dml.go (about) 1 // Copyright 2022 zGraph Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package ast 16 17 import ( 18 "fmt" 19 20 "github.com/pingcap/errors" 21 "github.com/vescale/zgraph/parser/format" 22 "github.com/vescale/zgraph/parser/model" 23 ) 24 25 var ( 26 _ Node = &InsertStmt{} 27 _ Node = &DeleteStmt{} 28 _ Node = &UpdateStmt{} 29 _ Node = &SelectStmt{} 30 _ Node = &PathPattern{} 31 _ Node = &VariableSpec{} 32 _ Node = &VertexPattern{} 33 _ Node = &ReachabilityPathExpr{} 34 _ Node = &PatternQuantifier{} 35 _ Node = &PathPatternMacro{} 36 37 _ Node = &GraphElementInsertion{} 38 _ Node = &LabelsAndProperties{} 39 _ Node = &PropertyAssignment{} 40 _ Node = &GraphElementUpdate{} 41 _ Node = &SelectElement{} 42 _ Node = &ExpAsVar{} 43 _ Node = &ByItem{} 44 _ Node = &SelectClause{} 45 _ Node = &GroupByClause{} 46 _ Node = &HavingClause{} 47 _ Node = &OrderByClause{} 48 _ Node = &LimitClause{} 49 50 _ VertexPairConnection = &EdgePattern{} 51 _ VertexPairConnection = &ReachabilityPathExpr{} 52 _ VertexPairConnection = &QuantifiedPathExpr{} 53 ) 54 55 type InsertionType byte 56 57 const ( 58 InsertionTypeVertex InsertionType = 1 59 InsertionTypeEdge InsertionType = 2 60 ) 61 62 // String implements the fmt.Stringer interface 63 func (it InsertionType) String() string { 64 switch it { 65 case InsertionTypeVertex: 66 return "VERTEX" 67 case InsertionTypeEdge: 68 return "EDGE" 69 default: 70 return fmt.Sprintf("UNKNOWN(%d)", it) 71 } 72 } 73 74 type GraphElementInsertion struct { 75 node 76 77 InsertionType InsertionType 78 VariableName model.CIStr 79 From model.CIStr 80 To model.CIStr 81 LabelsAndProperties *LabelsAndProperties 82 } 83 84 func (g *GraphElementInsertion) Restore(ctx *format.RestoreCtx) error { 85 switch g.InsertionType { 86 case InsertionTypeVertex: 87 ctx.WriteKeyWord("VERTEX") 88 if g.VariableName.O != "" { 89 ctx.WritePlain(" ") 90 ctx.WriteName(g.VariableName.O) 91 } 92 case InsertionTypeEdge: 93 ctx.WriteKeyWord("EDGE") 94 if g.VariableName.O != "" { 95 ctx.WritePlain(" ") 96 ctx.WriteName(g.VariableName.O) 97 } 98 ctx.WritePlain(" BETWEEN ") 99 ctx.WriteName(g.From.O) 100 ctx.WriteKeyWord(" AND ") 101 ctx.WriteName(g.To.O) 102 } 103 if g.LabelsAndProperties != nil { 104 if err := g.LabelsAndProperties.Restore(ctx); err != nil { 105 return errors.Annotate(err, "An error occurred while restore GraphElementInsertion.LabelsAndProperties") 106 } 107 } 108 return nil 109 } 110 111 func (g *GraphElementInsertion) Accept(v Visitor) (node Node, ok bool) { 112 newNode, skipChildren := v.Enter(g) 113 if skipChildren { 114 return v.Leave(newNode) 115 } 116 g = newNode.(*GraphElementInsertion) 117 if g.LabelsAndProperties != nil { 118 node, ok = g.LabelsAndProperties.Accept(v) 119 if !ok { 120 return node, ok 121 } 122 g.LabelsAndProperties = node.(*LabelsAndProperties) 123 } 124 return v.Leave(g) 125 } 126 127 type LabelsAndProperties struct { 128 node 129 130 Labels []model.CIStr 131 Assignments []*PropertyAssignment 132 } 133 134 func (l *LabelsAndProperties) Restore(ctx *format.RestoreCtx) error { 135 if len(l.Labels) > 0 { 136 ctx.WriteKeyWord(" LABELS ") 137 ctx.WritePlain("(") 138 for i, label := range l.Labels { 139 if i > 0 { 140 ctx.WritePlain(", ") 141 } 142 ctx.WriteName(label.O) 143 } 144 ctx.WritePlain(")") 145 } 146 if len(l.Assignments) > 0 { 147 ctx.WritePlain(" PROPERTIES ") 148 ctx.WritePlain("(") 149 for i, assignment := range l.Assignments { 150 if i > 0 { 151 ctx.WritePlain(", ") 152 } 153 if err := assignment.Restore(ctx); err != nil { 154 return errors.Annotate(err, "An error occurred while restore LabelsAndProperties.Assignments") 155 } 156 } 157 ctx.WritePlain(")") 158 } 159 return nil 160 } 161 162 func (l *LabelsAndProperties) Accept(v Visitor) (node Node, ok bool) { 163 newNode, skipChildren := v.Enter(l) 164 if skipChildren { 165 return v.Leave(newNode) 166 } 167 l = newNode.(*LabelsAndProperties) 168 for i, assignment := range l.Assignments { 169 node, ok = assignment.Accept(v) 170 if !ok { 171 return node, ok 172 } 173 l.Assignments[i] = node.(*PropertyAssignment) 174 } 175 return v.Leave(l) 176 } 177 178 type PropertyAssignment struct { 179 node 180 181 PropertyAccess *PropertyAccess 182 ValueExpression ExprNode 183 } 184 185 func (p *PropertyAssignment) Restore(ctx *format.RestoreCtx) error { 186 if err := p.PropertyAccess.Restore(ctx); err != nil { 187 return errors.Annotate(err, "An error occurred while restore PropertyAssignment.PropertyAccess") 188 } 189 ctx.WritePlain(" = ") 190 if err := p.ValueExpression.Restore(ctx); err != nil { 191 return errors.Annotate(err, "An error occurred while restore PropertyAssignment.ValueExpression") 192 } 193 return nil 194 } 195 196 func (p *PropertyAssignment) Accept(v Visitor) (node Node, ok bool) { 197 newNode, skipChildren := v.Enter(p) 198 if skipChildren { 199 return v.Leave(newNode) 200 } 201 p = newNode.(*PropertyAssignment) 202 node, ok = p.PropertyAccess.Accept(v) 203 if !ok { 204 return node, ok 205 } 206 p.PropertyAccess = node.(*PropertyAccess) 207 node, ok = p.ValueExpression.Accept(v) 208 if !ok { 209 return node, ok 210 } 211 p.ValueExpression = node.(ExprNode) 212 return v.Leave(p) 213 } 214 215 type GraphElementUpdate struct { 216 dmlNode 217 218 VariableName model.CIStr 219 Assignments []*PropertyAssignment 220 } 221 222 func (g *GraphElementUpdate) Restore(ctx *format.RestoreCtx) error { 223 ctx.WriteName(g.VariableName.O) 224 ctx.WriteKeyWord(" SET ") 225 ctx.WritePlain("(") 226 for i, assignment := range g.Assignments { 227 if i > 0 { 228 ctx.WritePlain(", ") 229 } 230 if err := assignment.Restore(ctx); err != nil { 231 return errors.Annotate(err, "An error occurred while restore GraphElementUpdate.Assignments") 232 } 233 } 234 ctx.WritePlain(")") 235 return nil 236 } 237 238 func (g *GraphElementUpdate) Accept(v Visitor) (node Node, ok bool) { 239 newNode, skipChildren := v.Enter(g) 240 if skipChildren { 241 return v.Leave(newNode) 242 } 243 g = newNode.(*GraphElementUpdate) 244 for i, assignment := range g.Assignments { 245 node, ok = assignment.Accept(v) 246 if !ok { 247 return node, ok 248 } 249 g.Assignments[i] = node.(*PropertyAssignment) 250 } 251 return v.Leave(g) 252 } 253 254 type ExpAsVar struct { 255 node 256 257 Expr ExprNode 258 AsName model.CIStr 259 } 260 261 func (e *ExpAsVar) Restore(ctx *format.RestoreCtx) error { 262 if err := e.Expr.Restore(ctx); err != nil { 263 return errors.Annotate(err, "An error occurred while restore ByItem.Expr") 264 } 265 if e.AsName.O != "" { 266 ctx.WriteKeyWord(" AS ") 267 ctx.WriteName(e.AsName.String()) 268 } 269 return nil 270 } 271 272 func (e *ExpAsVar) Accept(v Visitor) (node Node, ok bool) { 273 newNode, skipChildren := v.Enter(e) 274 if skipChildren { 275 return v.Leave(newNode) 276 } 277 n := newNode.(*ExpAsVar) 278 nn, ok := n.Expr.Accept(v) 279 if !ok { 280 return n, false 281 } 282 n.Expr = nn.(ExprNode) 283 return v.Leave(n) 284 } 285 286 // ByItem represents an item in order by or group by. 287 type ByItem struct { 288 node 289 290 Expr *ExpAsVar 291 Desc bool 292 NullOrder bool 293 } 294 295 // Restore implements Node interface. 296 func (n *ByItem) Restore(ctx *format.RestoreCtx) error { 297 if err := n.Expr.Restore(ctx); err != nil { 298 return errors.Annotate(err, "An error occurred while restore ByItem.Expr") 299 } 300 if n.Desc { 301 ctx.WriteKeyWord(" DESC") 302 } else if !n.NullOrder { 303 ctx.WriteKeyWord(" ASC") 304 } 305 return nil 306 } 307 308 // Accept implements Node Accept interface. 309 func (n *ByItem) Accept(v Visitor) (Node, bool) { 310 newNode, skipChildren := v.Enter(n) 311 if skipChildren { 312 return v.Leave(newNode) 313 } 314 n = newNode.(*ByItem) 315 node, ok := n.Expr.Accept(v) 316 if !ok { 317 return n, false 318 } 319 n.Expr = node.(*ExpAsVar) 320 return v.Leave(n) 321 } 322 323 type GroupByClause struct { 324 node 325 Items []*ByItem 326 } 327 328 // Restore implements Node interface. 329 func (n *GroupByClause) Restore(ctx *format.RestoreCtx) error { 330 ctx.WriteKeyWord("GROUP BY ") 331 for i, v := range n.Items { 332 if i != 0 { 333 ctx.WritePlain(",") 334 } 335 if err := v.Restore(ctx); err != nil { 336 return errors.Annotatef(err, "An error occurred while restore GroupByClause.Items[%d]", i) 337 } 338 } 339 return nil 340 } 341 342 // Accept implements Node Accept interface. 343 func (n *GroupByClause) Accept(v Visitor) (Node, bool) { 344 newNode, skipChildren := v.Enter(n) 345 if skipChildren { 346 return v.Leave(newNode) 347 } 348 n = newNode.(*GroupByClause) 349 for i, val := range n.Items { 350 node, ok := val.Accept(v) 351 if !ok { 352 return n, false 353 } 354 n.Items[i] = node.(*ByItem) 355 } 356 return v.Leave(n) 357 } 358 359 // HavingClause represents having clause. 360 type HavingClause struct { 361 node 362 Expr ExprNode 363 } 364 365 // Restore implements Node interface. 366 func (n *HavingClause) Restore(ctx *format.RestoreCtx) error { 367 ctx.WriteKeyWord("HAVING ") 368 if err := n.Expr.Restore(ctx); err != nil { 369 return errors.Annotate(err, "An error occurred while restore HavingClause.Expr") 370 } 371 return nil 372 } 373 374 // Accept implements Node Accept interface. 375 func (n *HavingClause) Accept(v Visitor) (Node, bool) { 376 newNode, skipChildren := v.Enter(n) 377 if skipChildren { 378 return v.Leave(newNode) 379 } 380 n = newNode.(*HavingClause) 381 node, ok := n.Expr.Accept(v) 382 if !ok { 383 return n, false 384 } 385 n.Expr = node.(ExprNode) 386 return v.Leave(n) 387 } 388 389 // OrderByClause represents order by clause. 390 type OrderByClause struct { 391 node 392 Items []*ByItem 393 } 394 395 // Restore implements Node interface. 396 func (n *OrderByClause) Restore(ctx *format.RestoreCtx) error { 397 ctx.WriteKeyWord("ORDER BY ") 398 for i, item := range n.Items { 399 if i != 0 { 400 ctx.WritePlain(",") 401 } 402 if err := item.Restore(ctx); err != nil { 403 return errors.Annotatef(err, "An error occurred while restore OrderByClause.Items[%d]", i) 404 } 405 } 406 return nil 407 } 408 409 // Accept implements Node Accept interface. 410 func (n *OrderByClause) Accept(v Visitor) (Node, bool) { 411 newNode, skipChildren := v.Enter(n) 412 if skipChildren { 413 return v.Leave(newNode) 414 } 415 n = newNode.(*OrderByClause) 416 for i, val := range n.Items { 417 node, ok := val.Accept(v) 418 if !ok { 419 return n, false 420 } 421 n.Items[i] = node.(*ByItem) 422 } 423 return v.Leave(n) 424 } 425 426 // LimitClause is the limit clause. 427 type LimitClause struct { 428 node 429 430 Count ExprNode 431 Offset ExprNode 432 } 433 434 // Restore implements Node interface. 435 func (n *LimitClause) Restore(ctx *format.RestoreCtx) error { 436 ctx.WriteKeyWord("LIMIT ") 437 if n.Offset != nil { 438 if err := n.Offset.Restore(ctx); err != nil { 439 return errors.Annotate(err, "An error occurred while restore LimitClause.Offset") 440 } 441 ctx.WritePlain(",") 442 } 443 if err := n.Count.Restore(ctx); err != nil { 444 return errors.Annotate(err, "An error occurred while restore LimitClause.Count") 445 } 446 return nil 447 } 448 449 // Accept implements Node Accept interface. 450 func (n *LimitClause) Accept(v Visitor) (Node, bool) { 451 newNode, skipChildren := v.Enter(n) 452 if skipChildren { 453 return v.Leave(newNode) 454 } 455 if n.Count != nil { 456 node, ok := n.Count.Accept(v) 457 if !ok { 458 return n, false 459 } 460 n.Count = node.(ExprNode) 461 } 462 if n.Offset != nil { 463 node, ok := n.Offset.Accept(v) 464 if !ok { 465 return n, false 466 } 467 n.Offset = node.(ExprNode) 468 } 469 470 n = newNode.(*LimitClause) 471 return v.Leave(n) 472 } 473 474 type InsertStmt struct { 475 dmlNode 476 477 PathPatternMacros []*PathPatternMacro 478 IntoGraphName model.CIStr 479 Insertions []*GraphElementInsertion 480 481 // Full modify query 482 // ref: https://pgql-lang.org/spec/1.5/#insert 483 From *MatchClauseList 484 Where ExprNode 485 GroupBy *GroupByClause 486 Having *HavingClause 487 OrderBy *OrderByClause 488 Limit *LimitClause 489 } 490 491 func (n *InsertStmt) Restore(ctx *format.RestoreCtx) error { 492 for _, p := range n.PathPatternMacros { 493 if err := p.Restore(ctx); err != nil { 494 return errors.New("An error occurred while restore SelectStmt.PathPatternMacros") 495 } 496 ctx.WritePlain(" ") 497 } 498 ctx.WriteKeyWord("INSERT ") 499 if n.IntoGraphName.L != "" { 500 ctx.WriteKeyWord("INTO ") 501 ctx.WriteName(n.IntoGraphName.O) 502 ctx.WritePlain(" ") 503 } 504 505 for i, in := range n.Insertions { 506 if i != 0 { 507 ctx.WritePlain(",") 508 } 509 if err := in.Restore(ctx); err != nil { 510 return errors.Annotatef(err, "An error occurred while restore InsertStmt.Insertions[%d]", i) 511 } 512 } 513 514 if n.From != nil { 515 ctx.WriteKeyWord(" FROM ") 516 if err := n.From.Restore(ctx); err != nil { 517 return errors.Annotate(err, "An error occurred while restore InsertStmt.From") 518 } 519 } 520 521 if n.Where != nil { 522 ctx.WriteKeyWord(" WHERE ") 523 if err := n.Where.Restore(ctx); err != nil { 524 return errors.New("An error occurred while restore InsertStmt.Where") 525 } 526 } 527 if n.GroupBy != nil { 528 ctx.WritePlain(" ") 529 if err := n.GroupBy.Restore(ctx); err != nil { 530 return errors.New("An error occurred while restore InsertStmt.GroupBy") 531 } 532 } 533 if n.Having != nil { 534 ctx.WritePlain(" ") 535 if err := n.Having.Restore(ctx); err != nil { 536 return errors.New("An error occurred while restore InsertStmt.Having") 537 } 538 } 539 if n.OrderBy != nil { 540 ctx.WritePlain(" ") 541 if err := n.OrderBy.Restore(ctx); err != nil { 542 return errors.New("An error occurred while restore InsertStmt.OrderBy") 543 } 544 } 545 if n.Limit != nil { 546 ctx.WritePlain(" ") 547 if err := n.Limit.Restore(ctx); err != nil { 548 return errors.New("An error occurred while restore InsertStmt.Limit") 549 } 550 } 551 return nil 552 } 553 554 func (n *InsertStmt) Accept(v Visitor) (node Node, ok bool) { 555 newNode, skipChildren := v.Enter(n) 556 if skipChildren { 557 return v.Leave(newNode) 558 } 559 n = newNode.(*InsertStmt) 560 for i, p := range n.PathPatternMacros { 561 node, ok = p.Accept(v) 562 if !ok { 563 return n, false 564 } 565 n.PathPatternMacros[i] = node.(*PathPatternMacro) 566 } 567 for i, in := range n.Insertions { 568 node, ok = in.Accept(v) 569 if !ok { 570 return n, false 571 } 572 n.Insertions[i] = node.(*GraphElementInsertion) 573 } 574 if n.From != nil { 575 node, ok = n.From.Accept(v) 576 if !ok { 577 return n, false 578 } 579 n.From = node.(*MatchClauseList) 580 } 581 if n.Where != nil { 582 node, ok = n.Where.Accept(v) 583 if !ok { 584 return n, false 585 } 586 n.Where = node.(ExprNode) 587 } 588 if n.GroupBy != nil { 589 node, ok = n.GroupBy.Accept(v) 590 if !ok { 591 return n, false 592 } 593 n.GroupBy = node.(*GroupByClause) 594 } 595 if n.Having != nil { 596 node, ok = n.Having.Accept(v) 597 if !ok { 598 return n, false 599 } 600 n.Having = node.(*HavingClause) 601 } 602 if n.OrderBy != nil { 603 node, ok = n.OrderBy.Accept(v) 604 if !ok { 605 return n, false 606 } 607 n.OrderBy = node.(*OrderByClause) 608 } 609 if n.Limit != nil { 610 node, ok = n.Limit.Accept(v) 611 if !ok { 612 return n, false 613 } 614 n.Limit = node.(*LimitClause) 615 } 616 return v.Leave(n) 617 } 618 619 type DeleteStmt struct { 620 dmlNode 621 622 PathPatternMacros []*PathPatternMacro 623 VariableNames []model.CIStr 624 From *MatchClauseList 625 Where ExprNode 626 GroupBy *GroupByClause 627 Having *HavingClause 628 OrderBy *OrderByClause 629 Limit *LimitClause 630 } 631 632 func (d *DeleteStmt) Restore(ctx *format.RestoreCtx) error { 633 if len(d.PathPatternMacros) > 0 { 634 for i, macro := range d.PathPatternMacros { 635 if i != 0 { 636 ctx.WritePlain(" ") 637 } 638 if err := macro.Restore(ctx); err != nil { 639 return errors.Annotatef(err, "An error occurred while restore DeleteStmt.PathPatternMacros[%d]", i) 640 } 641 } 642 } 643 ctx.WriteKeyWord("DELETE ") 644 645 for i, name := range d.VariableNames { 646 if i != 0 { 647 ctx.WritePlain(",") 648 } 649 ctx.WriteName(name.O) 650 } 651 652 if d.From != nil { 653 ctx.WriteKeyWord(" FROM ") 654 if err := d.From.Restore(ctx); err != nil { 655 return errors.Annotate(err, "An error occurred while restore DeleteStmt.From") 656 } 657 } 658 if d.Where != nil { 659 ctx.WriteKeyWord(" WHERE ") 660 if err := d.Where.Restore(ctx); err != nil { 661 return errors.Annotatef(err, "An error occurred while restore DeleteStmt.Where") 662 } 663 } 664 if d.GroupBy != nil { 665 if err := d.GroupBy.Restore(ctx); err != nil { 666 return errors.Annotatef(err, "An error occurred while restore DeleteStmt.GroupBy") 667 } 668 } 669 if d.Having != nil { 670 if err := d.Having.Restore(ctx); err != nil { 671 return errors.Annotatef(err, "An error occurred while restore DeleteStmt.Having") 672 } 673 } 674 if d.OrderBy != nil { 675 if err := d.OrderBy.Restore(ctx); err != nil { 676 return errors.Annotatef(err, "An error occurred while restore DeleteStmt.OrderBy") 677 } 678 } 679 if d.Limit != nil { 680 if err := d.Limit.Restore(ctx); err != nil { 681 return errors.Annotatef(err, "An error occurred while restore DeleteStmt.Limit") 682 } 683 } 684 685 return nil 686 } 687 688 func (d *DeleteStmt) Accept(v Visitor) (node Node, ok bool) { 689 newNode, skipChildren := v.Enter(d) 690 if skipChildren { 691 return v.Leave(newNode) 692 } 693 694 n := newNode.(*DeleteStmt) 695 if len(n.PathPatternMacros) > 0 { 696 for i, macro := range n.PathPatternMacros { 697 nn, ok := macro.Accept(v) 698 if !ok { 699 return n, false 700 } 701 n.PathPatternMacros[i] = nn.(*PathPatternMacro) 702 } 703 } 704 705 nn, ok := d.From.Accept(v) 706 if !ok { 707 return n, false 708 } 709 n.From = nn.(*MatchClauseList) 710 if n.Where != nil { 711 nn, ok := d.Where.Accept(v) 712 if !ok { 713 return n, false 714 } 715 n.Where = nn.(ExprNode) 716 } 717 if n.GroupBy != nil { 718 nn, ok := d.GroupBy.Accept(v) 719 if !ok { 720 return n, false 721 } 722 n.GroupBy = nn.(*GroupByClause) 723 } 724 if n.Having != nil { 725 nn, ok := d.Having.Accept(v) 726 if !ok { 727 return n, false 728 } 729 n.Having = nn.(*HavingClause) 730 } 731 if n.OrderBy != nil { 732 nn, ok := d.OrderBy.Accept(v) 733 if !ok { 734 return n, false 735 } 736 n.OrderBy = nn.(*OrderByClause) 737 } 738 if n.Limit != nil { 739 nn, ok := d.Limit.Accept(v) 740 if !ok { 741 return n, false 742 } 743 n.Limit = nn.(*LimitClause) 744 } 745 return v.Leave(n) 746 } 747 748 type UpdateStmt struct { 749 dmlNode 750 751 PathPatternMacros []*PathPatternMacro 752 Updates []*GraphElementUpdate 753 754 // Full modify query 755 // ref: https://pgql-lang.org/spec/1.5/#insert 756 From *MatchClauseList 757 Where ExprNode 758 GroupBy *GroupByClause 759 Having *HavingClause 760 OrderBy *OrderByClause 761 Limit *LimitClause 762 } 763 764 func (n *UpdateStmt) Restore(ctx *format.RestoreCtx) error { 765 for _, p := range n.PathPatternMacros { 766 if err := p.Restore(ctx); err != nil { 767 return errors.New("An error occurred while restore UpdateStmt.PathPatternMacros") 768 } 769 ctx.WritePlain(" ") 770 } 771 ctx.WriteKeyWord("UPDATE ") 772 for i, update := range n.Updates { 773 if i != 0 { 774 ctx.WritePlain(",") 775 } 776 if err := update.Restore(ctx); err != nil { 777 return errors.Annotatef(err, "An error occurred while restore UpdateStmt.Updates[%d]", i) 778 } 779 } 780 if n.From != nil { 781 ctx.WriteKeyWord(" FROM ") 782 if err := n.From.Restore(ctx); err != nil { 783 return errors.Annotatef(err, "An error occurred while restore UpdateStmt.From") 784 } 785 } 786 if n.Where != nil { 787 ctx.WriteKeyWord(" WHERE ") 788 if err := n.Where.Restore(ctx); err != nil { 789 return errors.Annotatef(err, "An error occurred while restore UpdateStmt.Where") 790 } 791 } 792 if n.GroupBy != nil { 793 ctx.WritePlain(" ") 794 if err := n.GroupBy.Restore(ctx); err != nil { 795 return errors.Annotatef(err, "An error occurred while restore UpdateStmt.GroupBy") 796 } 797 } 798 if n.Having != nil { 799 ctx.WritePlain(" ") 800 if err := n.Having.Restore(ctx); err != nil { 801 return errors.Annotatef(err, "An error occurred while restore UpdateStmt.Having") 802 } 803 } 804 if n.OrderBy != nil { 805 ctx.WritePlain(" ") 806 if err := n.OrderBy.Restore(ctx); err != nil { 807 return errors.Annotatef(err, "An error occurred while restore UpdateStmt.OrderBy") 808 } 809 } 810 if n.Limit != nil { 811 ctx.WritePlain(" ") 812 if err := n.Limit.Restore(ctx); err != nil { 813 return errors.Annotatef(err, "An error occurred while restore UpdateStmt.Limit") 814 } 815 } 816 return nil 817 } 818 819 func (n *UpdateStmt) Accept(v Visitor) (node Node, ok bool) { 820 newNode, skipChildren := v.Enter(n) 821 if skipChildren { 822 return v.Leave(newNode) 823 } 824 825 n = newNode.(*UpdateStmt) 826 for i, p := range n.PathPatternMacros { 827 node, ok = p.Accept(v) 828 if !ok { 829 return n, false 830 } 831 n.PathPatternMacros[i] = node.(*PathPatternMacro) 832 } 833 for i, u := range n.Updates { 834 node, ok = u.Accept(v) 835 if !ok { 836 return n, false 837 } 838 n.Updates[i] = node.(*GraphElementUpdate) 839 } 840 if n.From != nil { 841 node, ok = n.From.Accept(v) 842 if !ok { 843 return n, false 844 } 845 n.From = node.(*MatchClauseList) 846 } 847 if n.Where != nil { 848 node, ok = n.Where.Accept(v) 849 if !ok { 850 return n, false 851 } 852 n.Where = node.(ExprNode) 853 } 854 if n.GroupBy != nil { 855 node, ok = n.GroupBy.Accept(v) 856 if !ok { 857 return n, false 858 } 859 n.GroupBy = node.(*GroupByClause) 860 } 861 if n.Having != nil { 862 node, ok = n.Having.Accept(v) 863 if !ok { 864 return n, false 865 } 866 n.Having = node.(*HavingClause) 867 } 868 if n.OrderBy != nil { 869 node, ok = n.OrderBy.Accept(v) 870 if !ok { 871 return n, false 872 } 873 n.OrderBy = node.(*OrderByClause) 874 } 875 if n.Limit != nil { 876 node, ok = n.Limit.Accept(v) 877 if !ok { 878 return n, false 879 } 880 n.Limit = node.(*LimitClause) 881 } 882 return v.Leave(n) 883 } 884 885 // SelectElement represents a result field which can be a property from a label, 886 // or an expression in select field. It is a generated property during 887 // binding process. SelectElement is the key element to evaluate a PropertyNameExpr. 888 type SelectElement struct { 889 node 890 891 ExpAsVar *ExpAsVar 892 893 // All Properties with optional prefix 894 Identifier string 895 Prefix string 896 } 897 898 func (n *SelectElement) Restore(ctx *format.RestoreCtx) error { 899 if n.ExpAsVar != nil { 900 if err := n.ExpAsVar.Restore(ctx); err != nil { 901 return errors.Annotatef(err, "An error occurred while restore SelectElement.ExpAsVar") 902 } 903 return nil 904 } 905 906 ctx.WritePlain(n.Identifier + ".*") 907 if n.Prefix != "" { 908 ctx.WriteKeyWord(" PREFIX ") 909 ctx.WritePlain(n.Prefix) 910 } 911 return nil 912 } 913 914 func (n *SelectElement) Accept(v Visitor) (node Node, ok bool) { 915 newNode, skipChildren := v.Enter(n) 916 if skipChildren { 917 return v.Leave(newNode) 918 } 919 920 nn := newNode.(*SelectElement) 921 if nn.ExpAsVar != nil { 922 node, ok := nn.ExpAsVar.Accept(v) 923 if !ok { 924 return nn, false 925 } 926 nn.ExpAsVar = node.(*ExpAsVar) 927 } 928 return v.Leave(nn) 929 } 930 931 type SelectClause struct { 932 node 933 934 Star bool 935 Distinct bool 936 Elements []*SelectElement 937 } 938 939 func (n *SelectClause) Restore(ctx *format.RestoreCtx) error { 940 ctx.WriteKeyWord("SELECT ") 941 if n.Star { 942 ctx.WritePlain("*") 943 return nil 944 } 945 if n.Distinct { 946 ctx.WriteKeyWord("DISTINCT ") 947 } 948 for i, e := range n.Elements { 949 if i != 0 { 950 ctx.WritePlain(",") 951 } 952 if err := e.Restore(ctx); err != nil { 953 return errors.Annotatef(err, "An error occurred while restore SelectClause.Elements[%d]", i) 954 } 955 } 956 return nil 957 } 958 959 func (n *SelectClause) Accept(v Visitor) (node Node, ok bool) { 960 newNode, skipChildren := v.Enter(n) 961 if skipChildren { 962 return v.Leave(newNode) 963 } 964 965 nn := newNode.(*SelectClause) 966 for i, e := range nn.Elements { 967 node, ok := e.Accept(v) 968 if !ok { 969 return nn, false 970 } 971 nn.Elements[i] = node.(*SelectElement) 972 } 973 return v.Leave(nn) 974 } 975 976 type SelectStmt struct { 977 dmlNode 978 979 PathPatternMacros []*PathPatternMacro 980 Select *SelectClause 981 From *MatchClauseList 982 Where ExprNode 983 GroupBy *GroupByClause 984 Having *HavingClause 985 OrderBy *OrderByClause 986 Limit *LimitClause 987 } 988 989 func (n *SelectStmt) Restore(ctx *format.RestoreCtx) error { 990 for _, p := range n.PathPatternMacros { 991 if err := p.Restore(ctx); err != nil { 992 return errors.New("An error occurred while restore SelectStmt.PathPatternMacros") 993 } 994 ctx.WritePlain(" ") 995 } 996 if err := n.Select.Restore(ctx); err != nil { 997 return errors.New("An error occurred while restore SelectStmt.Select") 998 } 999 ctx.WriteKeyWord(" FROM ") 1000 if err := n.From.Restore(ctx); err != nil { 1001 return errors.New("An error occurred while restore SelectStmt.From") 1002 } 1003 if n.Where != nil { 1004 ctx.WriteKeyWord(" WHERE ") 1005 if err := n.Where.Restore(ctx); err != nil { 1006 return errors.New("An error occurred while restore SelectStmt.Where") 1007 } 1008 } 1009 if n.GroupBy != nil { 1010 ctx.WritePlain(" ") 1011 if err := n.GroupBy.Restore(ctx); err != nil { 1012 return errors.New("An error occurred while restore SelectStmt.GroupBy") 1013 } 1014 } 1015 if n.Having != nil { 1016 ctx.WritePlain(" ") 1017 if err := n.Having.Restore(ctx); err != nil { 1018 return errors.New("An error occurred while restore SelectStmt.Having") 1019 } 1020 } 1021 if n.OrderBy != nil { 1022 ctx.WritePlain(" ") 1023 if err := n.OrderBy.Restore(ctx); err != nil { 1024 return errors.New("An error occurred while restore SelectStmt.OrderBy") 1025 } 1026 } 1027 if n.Limit != nil { 1028 ctx.WritePlain(" ") 1029 if err := n.Limit.Restore(ctx); err != nil { 1030 return errors.New("An error occurred while restore SelectStmt.Limit") 1031 } 1032 } 1033 return nil 1034 } 1035 1036 func (n *SelectStmt) Accept(v Visitor) (node Node, ok bool) { 1037 newNode, skipChildren := v.Enter(n) 1038 if skipChildren { 1039 return v.Leave(newNode) 1040 } 1041 nn := newNode.(*SelectStmt) 1042 1043 for i, p := range nn.PathPatternMacros { 1044 node, ok := p.Accept(v) 1045 if !ok { 1046 return nn, false 1047 } 1048 nn.PathPatternMacros[i] = node.(*PathPatternMacro) 1049 } 1050 1051 if nn.From != nil { 1052 node, ok := nn.From.Accept(v) 1053 if !ok { 1054 return nn, false 1055 } 1056 nn.From = node.(*MatchClauseList) 1057 } 1058 1059 if nn.Where != nil { 1060 node, ok := nn.Where.Accept(v) 1061 if !ok { 1062 return nn, false 1063 } 1064 nn.Where = node.(ExprNode) 1065 } 1066 1067 if nn.GroupBy != nil { 1068 node, ok := nn.GroupBy.Accept(v) 1069 if !ok { 1070 return nn, false 1071 } 1072 nn.GroupBy = node.(*GroupByClause) 1073 } 1074 1075 if nn.Having != nil { 1076 node, ok := nn.Having.Accept(v) 1077 if !ok { 1078 return nn, false 1079 } 1080 nn.Having = node.(*HavingClause) 1081 } 1082 1083 if nn.OrderBy != nil { 1084 node, ok := nn.OrderBy.Accept(v) 1085 if !ok { 1086 return nn, false 1087 } 1088 nn.OrderBy = node.(*OrderByClause) 1089 } 1090 1091 if nn.Limit != nil { 1092 node, ok := nn.Limit.Accept(v) 1093 if !ok { 1094 return nn, false 1095 } 1096 nn.Limit = node.(*LimitClause) 1097 } 1098 1099 return v.Leave(nn) 1100 } 1101 1102 type MatchClauseList struct { 1103 node 1104 1105 Matches []*MatchClause 1106 } 1107 1108 func (n *MatchClauseList) resultSet() {} 1109 1110 func (n *MatchClauseList) Restore(ctx *format.RestoreCtx) error { 1111 for i, m := range n.Matches { 1112 if i > 0 { 1113 ctx.WritePlain(",") 1114 } 1115 if err := m.Restore(ctx); err != nil { 1116 return errors.Annotatef(err, "An error occurred while restore MatchClauseList.Matches[%d]", i) 1117 } 1118 } 1119 return nil 1120 } 1121 1122 func (n *MatchClauseList) Accept(v Visitor) (Node, bool) { 1123 newNode, skipChildren := v.Enter(n) 1124 if skipChildren { 1125 return v.Leave(newNode) 1126 } 1127 nn := newNode.(*MatchClauseList) 1128 for i, m := range nn.Matches { 1129 node, ok := m.Accept(v) 1130 if !ok { 1131 return nn, false 1132 } 1133 nn.Matches[i] = node.(*MatchClause) 1134 } 1135 return v.Leave(nn) 1136 } 1137 1138 type MatchClause struct { 1139 node 1140 1141 Graph model.CIStr 1142 Paths []*PathPattern 1143 } 1144 1145 func (n *MatchClause) resultSet() {} 1146 1147 func (n *MatchClause) Restore(ctx *format.RestoreCtx) error { 1148 ctx.WriteKeyWord("MATCH ") 1149 switch len(n.Paths) { 1150 case 0: 1151 return errors.New("MatchClause must have at least one PathPattern") 1152 case 1: 1153 if err := n.Paths[0].Restore(ctx); err != nil { 1154 return errors.Annotate(err, "An error occurred while restore MatchClause.Paths") 1155 } 1156 default: 1157 ctx.WritePlain("(") 1158 for i, p := range n.Paths { 1159 if i > 0 { 1160 ctx.WritePlain(",") 1161 } 1162 if err := p.Restore(ctx); err != nil { 1163 return errors.Annotatef(err, "An error occurred while restore MatchClause.Paths[%d]", i) 1164 } 1165 } 1166 ctx.WritePlain(")") 1167 } 1168 if !n.Graph.IsEmpty() { 1169 ctx.WriteKeyWord(" ON ") 1170 ctx.WriteName(n.Graph.String()) 1171 } 1172 1173 return nil 1174 } 1175 1176 func (n *MatchClause) Accept(v Visitor) (Node, bool) { 1177 newNode, skipChildren := v.Enter(n) 1178 if skipChildren { 1179 return v.Leave(newNode) 1180 } 1181 nn := newNode.(*MatchClause) 1182 for i, p := range nn.Paths { 1183 node, ok := p.Accept(v) 1184 if !ok { 1185 return nn, false 1186 } 1187 nn.Paths[i] = node.(*PathPattern) 1188 } 1189 return v.Leave(nn) 1190 } 1191 1192 type PathPatternType int 1193 1194 const ( 1195 PathPatternSimple PathPatternType = iota 1196 PathPatternAny 1197 PathPatternAnyShortest 1198 PathPatternAllShortest 1199 PathPatternTopKShortest 1200 PathPatternAnyCheapest 1201 PathPatternAllCheapest 1202 PathPatternTopKCheapest 1203 PathPatternAll 1204 ) 1205 1206 type PathPattern struct { 1207 node 1208 1209 Tp PathPatternType 1210 TopK int64 1211 Vertices []*VertexPattern 1212 Connections []VertexPairConnection 1213 } 1214 1215 func (n *PathPattern) Restore(ctx *format.RestoreCtx) error { 1216 if len(n.Vertices) == 0 { 1217 return errors.New("PathPattern must have at least one vertex pattern") 1218 } 1219 if len(n.Vertices) != len(n.Connections)+1 { 1220 return errors.Errorf("PathPattern vertices must be exactly one more than connections, but got %d vertices and %d connections", len(n.Vertices), len(n.Connections)) 1221 } 1222 if n.Tp != PathPatternSimple && len(n.Vertices) != 2 { 1223 return errors.Errorf("variable-length paths can only have exactly two vertices, but got %d", len(n.Vertices)) 1224 } 1225 switch n.Tp { 1226 case PathPatternSimple: 1227 case PathPatternAny: 1228 ctx.WriteKeyWord("ANY ") 1229 case PathPatternAnyShortest: 1230 ctx.WriteKeyWord("ANY SHORTEST ") 1231 case PathPatternAllShortest: 1232 ctx.WriteKeyWord("ALL SHORTEST ") 1233 case PathPatternTopKShortest: 1234 ctx.WriteKeyWord("TOP ") 1235 ctx.WritePlainf("%v", n.TopK) 1236 ctx.WriteKeyWord(" SHORTEST ") 1237 case PathPatternAnyCheapest: 1238 ctx.WriteKeyWord("ANY CHEAPEST ") 1239 case PathPatternAllCheapest: 1240 ctx.WriteKeyWord("ALL CHEAPEST ") 1241 case PathPatternTopKCheapest: 1242 ctx.WriteKeyWord("TOP ") 1243 ctx.WritePlainf("%v", n.TopK) 1244 ctx.WriteKeyWord(" CHEAPEST ") 1245 case PathPatternAll: 1246 ctx.WriteKeyWord("ALL ") 1247 default: 1248 return errors.Errorf("unknown PathPatternType: %v", n.Tp) 1249 } 1250 if err := n.Vertices[0].Restore(ctx); err != nil { 1251 return errors.Annotate(err, "An error occurred while restore PathPattern.Vertices[0]") 1252 } 1253 for i := 0; i < len(n.Connections); i++ { 1254 ctx.WritePlain(" ") 1255 if err := n.Connections[i].Restore(ctx); err != nil { 1256 return errors.Annotatef(err, "An error occurred while restore PathPattern.Connections[%d]", i) 1257 } 1258 ctx.WritePlain(" ") 1259 if err := n.Vertices[i+1].Restore(ctx); err != nil { 1260 return errors.Annotatef(err, "An error occurred while restore PathPattern.Vertices[%d]", i+1) 1261 } 1262 } 1263 return nil 1264 } 1265 1266 func (n *PathPattern) Accept(v Visitor) (Node, bool) { 1267 newNode, skipChildren := v.Enter(n) 1268 if skipChildren { 1269 return v.Leave(newNode) 1270 } 1271 nn := newNode.(*PathPattern) 1272 for i, vertex := range nn.Vertices { 1273 node, ok := vertex.Accept(v) 1274 if !ok { 1275 return nn, false 1276 } 1277 nn.Vertices[i] = node.(*VertexPattern) 1278 } 1279 for i, conn := range nn.Connections { 1280 node, ok := conn.Accept(v) 1281 if !ok { 1282 return nn, false 1283 } 1284 nn.Connections[i] = node.(VertexPairConnection) 1285 } 1286 return v.Leave(nn) 1287 } 1288 1289 type VertexPattern struct { 1290 node 1291 1292 Variable *VariableSpec 1293 } 1294 1295 func (n *VertexPattern) Restore(ctx *format.RestoreCtx) error { 1296 ctx.WritePlain("(") 1297 if err := n.Variable.Restore(ctx); err != nil { 1298 return errors.Annotate(err, "An error occurred while restore VertexPattern.Variable") 1299 } 1300 ctx.WritePlain(")") 1301 return nil 1302 } 1303 1304 func (n *VertexPattern) Accept(v Visitor) (Node, bool) { 1305 newNode, skipChildren := v.Enter(n) 1306 if skipChildren { 1307 return v.Leave(newNode) 1308 } 1309 nn := newNode.(*VertexPattern) 1310 node, ok := nn.Variable.Accept(v) 1311 if !ok { 1312 return nn, false 1313 } 1314 nn.Variable = node.(*VariableSpec) 1315 return v.Leave(nn) 1316 } 1317 1318 type EdgeDirection int 1319 1320 const ( 1321 EdgeDirectionOutgoing = iota 1322 EdgeDirectionIncoming 1323 EdgeDirectionAnyDirected 1324 ) 1325 1326 type VertexPairConnection interface { 1327 Node 1328 1329 vertexPairConnection() 1330 } 1331 1332 type EdgePattern struct { 1333 node 1334 1335 Variable *VariableSpec 1336 Direction EdgeDirection 1337 } 1338 1339 func (n *EdgePattern) vertexPairConnection() {} 1340 1341 func (n *EdgePattern) Restore(ctx *format.RestoreCtx) error { 1342 switch n.Direction { 1343 case EdgeDirectionOutgoing: 1344 if n.Variable == nil { 1345 ctx.WritePlain("->") 1346 } else { 1347 ctx.WritePlain("-[") 1348 if err := n.Variable.Restore(ctx); err != nil { 1349 return errors.Annotate(err, "An error occurred while restore EdgePattern.Variable") 1350 } 1351 ctx.WritePlain("]->") 1352 } 1353 case EdgeDirectionIncoming: 1354 if n.Variable == nil { 1355 ctx.WritePlain("<-") 1356 } else { 1357 ctx.WritePlain("<-[") 1358 if err := n.Variable.Restore(ctx); err != nil { 1359 return errors.Annotate(err, "An error occurred while restore EdgePattern.Variable") 1360 } 1361 ctx.WritePlain("]-") 1362 } 1363 case EdgeDirectionAnyDirected: 1364 if n.Variable == nil { 1365 ctx.WritePlain("-") 1366 } else { 1367 ctx.WritePlain("-[") 1368 if err := n.Variable.Restore(ctx); err != nil { 1369 return errors.Annotate(err, "An error occurred while restore EdgePattern.Variable") 1370 } 1371 ctx.WritePlain("]-") 1372 } 1373 default: 1374 return errors.Errorf("unknown edge direction: %v", n.Direction) 1375 } 1376 return nil 1377 } 1378 1379 func (n *EdgePattern) Accept(v Visitor) (Node, bool) { 1380 newNode, skipChildren := v.Enter(n) 1381 if skipChildren { 1382 return v.Leave(newNode) 1383 } 1384 nn := newNode.(*EdgePattern) 1385 if nn.Variable != nil { 1386 node, ok := nn.Variable.Accept(v) 1387 if !ok { 1388 return nn, false 1389 } 1390 nn.Variable = node.(*VariableSpec) 1391 } 1392 return v.Leave(nn) 1393 } 1394 1395 type ReachabilityPathExpr struct { 1396 node 1397 1398 Labels []model.CIStr 1399 Direction EdgeDirection 1400 Quantifier *PatternQuantifier 1401 // Variable name is not supported in ReachabilityPathExpr. 1402 // But we need an anonymous name for building logical plan. 1403 AnonymousName model.CIStr 1404 // Macros will be assigned in MacroExpansion stage. 1405 // LabelName(lower) -> PathPattern 1406 Macros map[string]*PathPattern 1407 } 1408 1409 func (n *ReachabilityPathExpr) vertexPairConnection() {} 1410 1411 func (n *ReachabilityPathExpr) Restore(ctx *format.RestoreCtx) error { 1412 var prefix, suffix string 1413 switch n.Direction { 1414 case EdgeDirectionOutgoing: 1415 prefix = "-/" 1416 suffix = "/->" 1417 case EdgeDirectionIncoming: 1418 prefix = "<-/" 1419 suffix = "/-" 1420 case EdgeDirectionAnyDirected: 1421 prefix = "-/" 1422 suffix = "/-" 1423 default: 1424 return errors.Errorf("unknown edge direction: %v", n.Direction) 1425 } 1426 ctx.WritePlain(prefix) 1427 if len(n.Labels) == 0 { 1428 return errors.New("ReachabilityPathExpr must have at least one label predicate") 1429 } 1430 ctx.WritePlain(":") 1431 ctx.WriteName(n.Labels[0].String()) 1432 for i := 1; i < len(n.Labels); i++ { 1433 ctx.WritePlain("|") 1434 ctx.WriteName(n.Labels[i].String()) 1435 } 1436 if n.Quantifier != nil { 1437 if err := n.Quantifier.Restore(ctx); err != nil { 1438 return errors.Annotate(err, "An error occurred while restore ReachabilityPathExpr.Quantifier") 1439 } 1440 } 1441 ctx.WritePlain(suffix) 1442 return nil 1443 } 1444 1445 func (n *ReachabilityPathExpr) Accept(v Visitor) (Node, bool) { 1446 newNode, skipChildren := v.Enter(n) 1447 if skipChildren { 1448 return v.Leave(newNode) 1449 } 1450 nn := newNode.(*ReachabilityPathExpr) 1451 if nn.Quantifier != nil { 1452 node, ok := nn.Quantifier.Accept(v) 1453 if !ok { 1454 return nn, false 1455 } 1456 nn.Quantifier = node.(*PatternQuantifier) 1457 } 1458 return v.Leave(nn) 1459 } 1460 1461 type QuantifiedPathExpr struct { 1462 node 1463 1464 Edge *EdgePattern 1465 Quantifier *PatternQuantifier 1466 Source *VertexPattern 1467 Destination *VertexPattern 1468 Where ExprNode 1469 Cost ExprNode 1470 } 1471 1472 func (n *QuantifiedPathExpr) vertexPairConnection() {} 1473 1474 func (n *QuantifiedPathExpr) shouldParenthesize() bool { 1475 return n.Source != nil || n.Destination != nil || n.Where != nil || n.Cost != nil 1476 } 1477 1478 func (n *QuantifiedPathExpr) Restore(ctx *format.RestoreCtx) error { 1479 shouldParenthesize := n.shouldParenthesize() 1480 if shouldParenthesize { 1481 ctx.WritePlain("(") 1482 } 1483 if n.Source != nil { 1484 if err := n.Source.Restore(ctx); err != nil { 1485 return errors.Annotate(err, "An error occurred while restore QuantifiedPathExpr.Source") 1486 } 1487 ctx.WritePlain(" ") 1488 } 1489 if err := n.Edge.Restore(ctx); err != nil { 1490 return errors.Annotate(err, "An error occurred while restore QuantifiedPathExpr.Edge") 1491 } 1492 if n.Destination != nil { 1493 ctx.WritePlain(" ") 1494 if err := n.Destination.Restore(ctx); err != nil { 1495 return errors.Annotate(err, "An error occurred while restore QuantifiedPathExpr.Destination") 1496 } 1497 } 1498 if n.Where != nil { 1499 ctx.WriteKeyWord(" WHERE ") 1500 if err := n.Where.Restore(ctx); err != nil { 1501 return errors.Annotate(err, "An error occurred while restore QuantifiedPathExpr.Where") 1502 } 1503 } 1504 if n.Cost != nil { 1505 ctx.WriteKeyWord(" COST ") 1506 if err := n.Cost.Restore(ctx); err != nil { 1507 return errors.Annotate(err, "An error occurred while restore QuantifiedPathExpr.Cost") 1508 } 1509 } 1510 if shouldParenthesize { 1511 ctx.WritePlain(")") 1512 } 1513 if n.Quantifier != nil { 1514 if err := n.Quantifier.Restore(ctx); err != nil { 1515 return errors.Annotate(err, "An error occurred while restore QuantifiedPathExpr.Quantifier") 1516 } 1517 } 1518 return nil 1519 } 1520 1521 func (n *QuantifiedPathExpr) Accept(v Visitor) (Node, bool) { 1522 newNode, skipChildren := v.Enter(n) 1523 if skipChildren { 1524 return v.Leave(newNode) 1525 } 1526 nn := newNode.(*QuantifiedPathExpr) 1527 node, ok := nn.Edge.Accept(v) 1528 if !ok { 1529 return nn, false 1530 } 1531 nn.Edge = node.(*EdgePattern) 1532 if nn.Quantifier != nil { 1533 node, ok = nn.Quantifier.Accept(v) 1534 if !ok { 1535 return nn, false 1536 } 1537 nn.Quantifier = node.(*PatternQuantifier) 1538 } 1539 if nn.Source != nil { 1540 node, ok = nn.Source.Accept(v) 1541 if !ok { 1542 return nn, false 1543 } 1544 nn.Source = node.(*VertexPattern) 1545 } 1546 if nn.Destination != nil { 1547 node, ok = nn.Destination.Accept(v) 1548 if !ok { 1549 return nn, false 1550 } 1551 nn.Destination = node.(*VertexPattern) 1552 } 1553 if nn.Where != nil { 1554 node, ok = nn.Where.Accept(v) 1555 if !ok { 1556 return nn, false 1557 } 1558 nn.Where = node.(ExprNode) 1559 } 1560 if nn.Cost != nil { 1561 node, ok = nn.Cost.Accept(v) 1562 if !ok { 1563 return nn, false 1564 } 1565 nn.Cost = node.(ExprNode) 1566 } 1567 return v.Leave(nn) 1568 } 1569 1570 type PatternQuantifierType int 1571 1572 const ( 1573 PatternQuantifierZeroOrMore = iota 1574 PatternQuantifierOneOrMore 1575 PatternQuantifierOptional 1576 PatternQuantifierExactlyN 1577 PatternQuantifierNOrMore 1578 PatternQuantifierBetweenNAndM 1579 PatternQuantifierBetweenZeroAndM 1580 ) 1581 1582 type PatternQuantifier struct { 1583 node 1584 1585 Tp PatternQuantifierType 1586 N int64 1587 M int64 1588 } 1589 1590 func (n *PatternQuantifier) Restore(ctx *format.RestoreCtx) error { 1591 switch n.Tp { 1592 case PatternQuantifierZeroOrMore: 1593 ctx.WritePlain("*") 1594 case PatternQuantifierOneOrMore: 1595 ctx.WritePlain("+") 1596 case PatternQuantifierOptional: 1597 ctx.WritePlain("?") 1598 case PatternQuantifierExactlyN: 1599 ctx.WritePlainf("{%d}", n.N) 1600 case PatternQuantifierNOrMore: 1601 ctx.WritePlainf("{%d,}", n.N) 1602 case PatternQuantifierBetweenNAndM: 1603 ctx.WritePlainf("{%d,%d}", n.N, n.M) 1604 case PatternQuantifierBetweenZeroAndM: 1605 ctx.WritePlainf("{,%d}", n.M) 1606 default: 1607 return errors.Errorf("unknown PatternQuantifierType: %v", n.Tp) 1608 } 1609 return nil 1610 } 1611 1612 func (n *PatternQuantifier) Accept(v Visitor) (Node, bool) { 1613 newNode, _ := v.Enter(n) 1614 return v.Leave(newNode) 1615 } 1616 1617 type VariableSpec struct { 1618 node 1619 1620 Name model.CIStr 1621 Labels []model.CIStr 1622 Anonymous bool 1623 } 1624 1625 func (n *VariableSpec) Restore(ctx *format.RestoreCtx) error { 1626 if name := n.Name.String(); name != "" && !n.Anonymous { 1627 ctx.WriteName(name) 1628 } 1629 if len(n.Labels) > 0 { 1630 ctx.WritePlain(":") 1631 ctx.WriteName(n.Labels[0].String()) 1632 } 1633 for i := 1; i < len(n.Labels); i++ { 1634 ctx.WritePlain("|") 1635 ctx.WriteName(n.Labels[i].String()) 1636 } 1637 return nil 1638 } 1639 1640 func (n *VariableSpec) Accept(v Visitor) (Node, bool) { 1641 newNode, _ := v.Enter(n) 1642 return v.Leave(newNode) 1643 } 1644 1645 type PathPatternMacro struct { 1646 node 1647 1648 Name model.CIStr 1649 Path *PathPattern 1650 Where ExprNode 1651 } 1652 1653 func (n *PathPatternMacro) Restore(ctx *format.RestoreCtx) error { 1654 ctx.WriteKeyWord("PATH ") 1655 ctx.WriteName(n.Name.String()) 1656 ctx.WriteKeyWord(" AS ") 1657 if err := n.Path.Restore(ctx); err != nil { 1658 return errors.Annotate(err, "An error occurred while restore PathPatternMacro.Path") 1659 } 1660 if n.Where != nil { 1661 ctx.WriteKeyWord(" WHERE ") 1662 if err := n.Where.Restore(ctx); err != nil { 1663 return errors.Annotate(err, "An error occurred while restore PathPatternMacro.Where") 1664 } 1665 } 1666 return nil 1667 } 1668 1669 func (n *PathPatternMacro) Accept(v Visitor) (Node, bool) { 1670 newNode, skipChildren := v.Enter(n) 1671 if skipChildren { 1672 return v.Leave(newNode) 1673 } 1674 nn := newNode.(*PathPatternMacro) 1675 node, ok := nn.Path.Accept(v) 1676 if !ok { 1677 return nn, false 1678 } 1679 nn.Path = node.(*PathPattern) 1680 if nn.Where != nil { 1681 node, ok = nn.Where.Accept(v) 1682 if !ok { 1683 return nn, false 1684 } 1685 nn.Where = node.(ExprNode) 1686 } 1687 return v.Leave(nn) 1688 }