/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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 com.alibaba.druid.sql.dialect.sqlserver.visitor;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition.Identity;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop;
import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr;
import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement;
import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement;
import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerUpdateStatement;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLServerASTVisitor {
public SQLServerOutputVisitor(Appendable appender){
super(appender);
}
public boolean visit(SQLServerSelectQueryBlock x) {
print("SELECT ");
if (SQLSetQuantifier.ALL == x.getDistionOption()) {
print("ALL ");
} else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) {
print("DISTINCT ");
} else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) {
print("UNIQUE ");
}
if (x.getTop() != null) {
x.getTop().accept(this);
print(' ');
}
printSelectList(x.getSelectList());
if (x.getInto() != null) {
println();
print("INTO ");
x.getInto().accept(this);
}
if (x.getFrom() != null) {
println();
print("FROM ");
x.getFrom().accept(this);
}
if (x.getWhere() != null) {
println();
print("WHERE ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
if (x.getGroupBy() != null) {
println();
x.getGroupBy().accept(this);
}
return false;
}
@Override
public void endVisit(SQLServerSelectQueryBlock x) {
}
@Override
public boolean visit(SQLServerTop x) {
print("TOP ");
boolean paren = false;
if (x.getParent() instanceof SQLServerUpdateStatement) {
paren = true;
print("(");
}
x.getExpr().accept(this);
if (paren) {
print(")");
}
if (x.isPercent()) {
print(" PERCENT");
}
return false;
}
@Override
public void endVisit(SQLServerTop x) {
}
@Override
public boolean visit(SQLServerObjectReferenceExpr x) {
print(x.toString());
return false;
}
@Override
public void endVisit(SQLServerObjectReferenceExpr x) {
}
@Override
public boolean visit(SQLServerInsertStatement x) {
print("INSERT INTO ");
x.getTableSource().accept(this);
if (x.getColumns().size() > 0) {
incrementIndent();
println();
print("(");
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
if (i != 0) {
if (i % 5 == 0) {
println();
}
print(", ");
}
x.getColumns().get(i).accept(this);
}
print(")");
decrementIndent();
}
if (x.getValuesList().size() != 0) {
println();
print("VALUES");
println();
for (int i = 0, size = x.getValuesList().size(); i < size; ++i) {
if (i != 0) {
print(",");
println();
}
x.getValuesList().get(i).accept(this);
}
}
if (x.getQuery() != null) {
println();
x.getQuery().accept(this);
}
if (x.isDefaultValues()) {
print(" DEFAULT VALUES");
}
return false;
}
@Override
public void endVisit(SQLServerInsertStatement x) {
}
@Override
public boolean visit(SQLServerUpdateStatement x) {
print("UPDATE ");
if (x.getTop() != null) {
x.getTop().setParent(x);
x.getTop().accept(this);
print(' ');
}
x.getTableSource().accept(this);
println();
print("SET ");
for (int i = 0, size = x.getItems().size(); i < size; ++i) {
if (i != 0) {
print(", ");
}
x.getItems().get(i).accept(this);
}
if (x.getFrom() != null) {
println();
print("FROM ");
x.getFrom().setParent(x);
x.getFrom().accept(this);
}
if (x.getWhere() != null) {
println();
print("WHERE ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
return false;
}
@Override
public void endVisit(SQLServerUpdateStatement x) {
}
public boolean visit(SQLExprTableSource x) {
x.getExpr().accept(this);
if (x.getHints() != null && x.getHints().size() > 0) {
print(" WITH (");
printAndAccept(x.getHints(), ", ");
print(")");
}
if (x.getAlias() != null) {
print(' ');
print(x.getAlias());
}
return false;
}
@Override
public boolean visit(Identity x) {
print("IDENTITY (");
print(x.getSeed());
print(", ");
print(x.getIncrement());
print(")");
return false;
}
@Override
public void endVisit(Identity x) {
}
@Override
public boolean visit(SQLServerColumnDefinition x) {
x.getName().accept(this);
if (x.getDataType() != null) {
print(' ');
x.getDataType().accept(this);
}
if (x.getDefaultExpr() != null) {
visitColumnDefault(x);
}
for (SQLColumnConstraint item : x.getConstraints()) {
print(' ');
item.accept(this);
}
if (x.getIdentity() != null) {
print(' ');
x.getIdentity().accept(this);
}
if (x.getEnable() != null) {
if (x.getEnable().booleanValue()) {
print(" ENABLE");
}
}
return false;
}
@Override
public void endVisit(SQLServerColumnDefinition x) {
}
public boolean visit(SQLColumnDefinition x) {
if (x instanceof SQLServerColumnDefinition) {
return visit((SQLServerColumnDefinition) x);
}
return super.visit(x);
}
@Override
public boolean visit(SQLServerExecStatement x) {
print("EXEC ");
SQLName moduleName = x.getModuleName();
if (moduleName != null) {
moduleName.accept(this);
print(' ');
} else {
print(" (");
}
printAndAccept(x.getParameters(), ", ");
if (moduleName == null) {
print(')');
}
return false;
}
@Override
public void endVisit(SQLServerExecStatement x) {
}
}