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  }