shardingsphere-operator/pkg/distsql/visitor/shadow_rdl.go (225 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package visitor
import (
"fmt"
"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/pkg/distsql/ast"
parser "github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/pkg/distsql/visitor_parser/shadow"
)
type ShadowVisitor struct {
parser.BaseRDLStatementVisitor
}
func (v *ShadowVisitor) VisitCreateShadowRule(ctx *parser.CreateShadowRuleContext) *ast.CreateShadowRule {
stmt := &ast.CreateShadowRule{}
if ctx.IfNotExists() != nil {
stmt.IfNotExists = v.VisitIfNotExists(ctx.IfNotExists().(*parser.IfNotExistsContext))
}
if ctx.AllShadowRuleDefinition() != nil {
for _, r := range ctx.AllShadowRuleDefinition() {
stmt.AllShadowRuleDefinition = append(stmt.AllShadowRuleDefinition, v.VisitShadowRuleDefinition(r.(*parser.ShadowRuleDefinitionContext)))
}
}
return stmt
}
func (v *ShadowVisitor) VisitAlterShadowRule(ctx *parser.AlterShadowRuleContext) *ast.AlterShadowRule {
stmt := &ast.AlterShadowRule{}
if ctx.AllShadowRuleDefinition() != nil {
for _, r := range ctx.AllShadowRuleDefinition() {
stmt.AllShadowRuleDefinition = append(stmt.AllShadowRuleDefinition, v.VisitShadowRuleDefinition(r.(*parser.ShadowRuleDefinitionContext)))
}
}
return stmt
}
func (v *ShadowVisitor) VisitDropShadowRule(ctx *parser.DropShadowRuleContext) *ast.DropShadowRule {
stmt := &ast.DropShadowRule{}
if ctx.IfExists() != nil {
stmt.IfExists = v.VisitIfExists(ctx.IfExists().(*parser.IfExistsContext))
}
if ctx.AllRuleName() != nil {
for _, rn := range ctx.AllRuleName() {
stmt.AllRuleName = append(stmt.AllRuleName, v.VisitRuleName(rn.(*parser.RuleNameContext)))
}
}
return stmt
}
func (v *ShadowVisitor) VisitDropShadowAlgorithm(ctx *parser.DropShadowAlgorithmContext) *ast.DropShadowAlgorithm {
stmt := &ast.DropShadowAlgorithm{}
if ctx.IfExists() != nil {
stmt.IfExists = v.VisitIfExists(ctx.IfExists().(*parser.IfExistsContext))
}
if ctx.AllAlgorithmName() != nil {
for _, algorithm := range ctx.AllAlgorithmName() {
stmt.AllAlgorithmName = append(stmt.AllAlgorithmName, v.VisitAlgorithmName(algorithm.(*parser.AlgorithmNameContext)))
}
}
return stmt
}
func (v *ShadowVisitor) VisitCreateDefaultShadowAlgorithm(ctx *parser.CreateDefaultShadowAlgorithmContext) *ast.CreateDefaultShadowAlgorithm {
stmt := &ast.CreateDefaultShadowAlgorithm{}
if ctx.IfNotExists() != nil {
stmt.IfNotExists = v.VisitIfNotExists(ctx.IfNotExists().(*parser.IfNotExistsContext))
}
if ctx.AlgorithmDefinition() != nil {
stmt.AlgorithmDefinition = v.VisitAlgorithmDefinition(ctx.AlgorithmDefinition().(*parser.AlgorithmDefinitionContext))
}
return stmt
}
func (v *ShadowVisitor) VisitDropDefaultShadowAlgorithm(ctx *parser.DropDefaultShadowAlgorithmContext) *ast.DropDefaultShadowAlgorithm {
stmt := &ast.DropDefaultShadowAlgorithm{}
if ctx.IfExists() != nil {
stmt.IfExists = v.VisitIfExists(ctx.IfExists().(*parser.IfExistsContext))
}
return stmt
}
func (v *ShadowVisitor) VisitAlterDefaultShadowAlgorithm(ctx *parser.AlterDefaultShadowAlgorithmContext) *ast.AlterDefaultShadowAlgorithm {
stmt := &ast.AlterDefaultShadowAlgorithm{}
if ctx.AlgorithmDefinition() != nil {
stmt.AlgorithmDefinition = v.VisitAlgorithmDefinition(ctx.AlgorithmDefinition().(*parser.AlgorithmDefinitionContext))
}
return stmt
}
func (v *ShadowVisitor) VisitShadowRuleDefinition(ctx *parser.ShadowRuleDefinitionContext) *ast.ShadowRuleDefinition {
stmt := &ast.ShadowRuleDefinition{}
if ctx.RuleName() != nil {
stmt.RuleName = v.VisitRuleName(ctx.RuleName().(*parser.RuleNameContext))
}
if ctx.Source() != nil {
stmt.Source = v.VisitSource(ctx.Source().(*parser.SourceContext))
}
if ctx.SHADOW() != nil {
stmt.Shadow = v.VisitShadow(ctx.Shadow().(*parser.ShadowContext))
}
if ctx.AllShadowTableRule() != nil {
for _, r := range ctx.AllShadowTableRule() {
stmt.AllShadowTableRule = append(stmt.AllShadowTableRule, v.VisitShadowTableRule(r.(*parser.ShadowTableRuleContext)))
}
}
return stmt
}
func (v *ShadowVisitor) VisitShadowTableRule(ctx *parser.ShadowTableRuleContext) *ast.ShadowTableRule {
stmt := &ast.ShadowTableRule{}
if ctx.TableName() != nil {
stmt.TableName = v.VisitTableName(ctx.TableName().(*parser.TableNameContext))
}
if ctx.AllAlgorithmDefinition() != nil {
for _, algorithm := range ctx.AllAlgorithmDefinition() {
stmt.AllAlgorithmDefinition = append(stmt.AllAlgorithmDefinition, v.VisitAlgorithmDefinition(algorithm.(*parser.AlgorithmDefinitionContext)))
}
}
return stmt
}
func (v *ShadowVisitor) VisitSource(ctx *parser.SourceContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *ShadowVisitor) VisitShadow(ctx *parser.ShadowContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *ShadowVisitor) VisitTableName(ctx *parser.TableNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *ShadowVisitor) VisitAlgorithmName(ctx *parser.AlgorithmNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *ShadowVisitor) VisitIfExists(ctx *parser.IfExistsContext) *ast.IfExists {
return &ast.IfExists{
IfExists: fmt.Sprintf("%s %s", ctx.IF().GetText(), ctx.EXISTS().GetText()),
}
}
func (v *ShadowVisitor) VisitIfNotExists(ctx *parser.IfNotExistsContext) *ast.IfNotExists {
return &ast.IfNotExists{
IfNotExists: fmt.Sprintf("%s %s %s", ctx.IF().GetText(), ctx.NOT().GetText(), ctx.EXISTS().GetText()),
}
}
// nolint
func (v *ShadowVisitor) VisitLiteral(ctx *parser.LiteralContext) *ast.Literal {
stmt := &ast.Literal{}
switch {
case ctx.STRING_() != nil:
stmt.Literal = ctx.STRING_().GetText()
case ctx.MINUS_() != nil:
stmt.Literal = ctx.MINUS_().GetText()
case ctx.INT_() != nil:
stmt.Literal = ctx.INT_().GetText()
case ctx.TRUE() != nil:
stmt.Literal = ctx.TRUE().GetText()
case ctx.FALSE() != nil:
stmt.Literal = ctx.FALSE().GetText()
}
return stmt
}
func (v *ShadowVisitor) VisitAlgorithmDefinition(ctx *parser.AlgorithmDefinitionContext) *ast.AlgorithmDefinition {
stmt := &ast.AlgorithmDefinition{}
if ctx.AlgorithmTypeName() != nil {
stmt.AlgorithmTypeName = v.VisitAlgorithmTypeName(ctx.AlgorithmTypeName().(*parser.AlgorithmTypeNameContext))
}
if ctx.PropertiesDefinition() != nil {
stmt.PropertiesDefinition = v.VisitPropertiesDefinition(ctx.PropertiesDefinition().(*parser.PropertiesDefinitionContext))
}
return stmt
}
func (v *ShadowVisitor) VisitAlgorithmTypeName(ctx *parser.AlgorithmTypeNameContext) *ast.AlgorithmTypeName {
stmt := &ast.AlgorithmTypeName{}
switch {
case ctx.STRING_() != nil:
stmt.String = ctx.STRING_().GetText()
case ctx.BuildInShadowAlgorithmType() != nil:
stmt.BuildinAlgorithmTypeName = v.VisitBuildInShadowAlgorithmType(ctx.BuildInShadowAlgorithmType().(*parser.BuildInShadowAlgorithmTypeContext))
}
return stmt
}
// nolint
func (v *ShadowVisitor) VisitBuildInShadowAlgorithmType(ctx *parser.BuildInShadowAlgorithmTypeContext) *ast.BuildinAlgorithmTypeName {
stmt := &ast.BuildinAlgorithmTypeName{}
switch {
case ctx.VALUE_MATCH() != nil:
stmt.AlgorithmTypeName = ctx.VALUE_MATCH().GetText()
case ctx.REGEX_MATCH() != nil:
stmt.AlgorithmTypeName = ctx.REGEX_MATCH().GetText()
case ctx.SQL_HINT() != nil:
stmt.AlgorithmTypeName = ctx.SQL_HINT().GetText()
}
return stmt
}
func (v *ShadowVisitor) VisitPropertiesDefinition(ctx *parser.PropertiesDefinitionContext) *ast.PropertiesDefinition {
stmt := &ast.PropertiesDefinition{}
if ctx.Properties() != nil {
stmt.Properties = v.VisitProperties(ctx.Properties().(*parser.PropertiesContext))
}
return stmt
}
func (v *ShadowVisitor) VisitProperties(ctx *parser.PropertiesContext) *ast.Properties {
stmt := &ast.Properties{}
for _, p := range ctx.AllProperty() {
stmt.Properties = append(stmt.Properties, v.VisitProperty(p.(*parser.PropertyContext)))
}
return stmt
}
func (v *ShadowVisitor) VisitProperty(ctx *parser.PropertyContext) *ast.Property {
stmt := &ast.Property{}
if ctx.STRING_() != nil {
stmt.Key = ctx.STRING_().GetText()
}
if ctx.Literal() != nil {
stmt.Literal = v.VisitLiteral(ctx.Literal().(*parser.LiteralContext))
}
return stmt
}
func (v *ShadowVisitor) VisitRuleName(ctx *parser.RuleNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}