Add basic implementation for TD Visitor

This commit is contained in:
Louis Xu
2016-03-28 19:37:06 +08:00
parent 611f4f8163
commit 30de161630
4 changed files with 189 additions and 1 deletions
@@ -15,8 +15,21 @@
*/
package com.alibaba.druid.sql.dialect.teradata.visitor;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalytic;
import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalyticWindowing;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public interface TeradataASTVisitor extends SQLASTVisitor {
boolean visit(TeradataAnalyticWindowing x);
void endVisit(TeradataAnalyticWindowing x);
boolean visit(TeradataAnalytic x);
boolean visit(SQLSelectQueryBlock x);
boolean visit(SQLSelect x);
}
@@ -15,8 +15,28 @@
*/
package com.alibaba.druid.sql.dialect.teradata.visitor;
import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalytic;
import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalyticWindowing;
import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter;
public class TeradataASTVisitorAdapter extends SQLASTVisitorAdapter implements TeradataASTVisitor {
@Override
public boolean visit(TeradataAnalyticWindowing x) {
// TODO Auto-generated method stub
return true;
}
@Override
public void endVisit(TeradataAnalyticWindowing x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(TeradataAnalytic x) {
// TODO Auto-generated method stub
return false;
}
}
@@ -15,6 +15,15 @@
*/
package com.alibaba.druid.sql.dialect.teradata.visitor;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalytic;
import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalyticWindowing;
import com.alibaba.druid.sql.dialect.teradata.ast.stmt.TeradataSelectQueryBlock;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class TeradataOutputVisitor extends SQLASTOutputVisitor implements TeradataASTVisitor {
@@ -22,5 +31,131 @@ public class TeradataOutputVisitor extends SQLASTOutputVisitor implements Terada
public TeradataOutputVisitor(Appendable appender){
super(appender);
}
public boolean visit(TeradataAnalytic x) {
print0(ucase ? "OVER (" : "over (");
boolean space = false;
if (x.getPartitionBy().size() > 0) {
print0(ucase ? "PARTITION BY " : "partition by ");
printAndAccept(x.getPartitionBy(), ", ");
space = true;
}
if (x.getOrderBy() != null) {
if (space) {
print(' ');
}
x.getOrderBy().accept(this);
space = true;
}
if (x.getWindowing() != null) {
if (space) {
print(' ');
}
x.getWindowing().accept(this);
}
print(')');
return false;
}
@Override
public boolean visit(TeradataAnalyticWindowing x) {
print0(x.getType().name().toUpperCase());
print(' ');
x.getExpr().accept(this);
return false;
}
@Override
public void endVisit(TeradataAnalyticWindowing x) {
// TODO Auto-generated method stub
}
public boolean visit(SQLSelectQueryBlock select) {
if(select instanceof TeradataSelectQueryBlock) {
return visit((TeradataSelectQueryBlock) select);
}
return super.visit(select);
}
public boolean visit(TeradataSelectQueryBlock x) {
if (x.getOrderBy() != null) {
x.getOrderBy().setParent(x);
}
print0(ucase ? "SELECT " : "select ");
if (SQLSetQuantifier.ALL == x.getDistionOption()) {
print0(ucase ? "ALL " : "all ");
} else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) {
print0(ucase ? "DISTINCT " : "distinct ");
} else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) {
print0(ucase ? "UNIQUE " : "unique ");
}
printSelectList(x.getSelectList());
if (x.getInto() != null) {
println();
print0(ucase ? "INTO " : "into ");
x.getInto().accept(this);
}
println();
print0(ucase ? "FROM " : "from ");
if (x.getFrom() == null) {
print0(ucase ? "DUAL" : "dual");
} else {
x.getFrom().setParent(x);
x.getFrom().accept(this);
}
if (x.getWhere() != null) {
println();
print0(ucase ? "WHERE " : "where ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
}
if (x.getGroupBy() != null) {
println();
x.getGroupBy().accept(this);
}
if (x.getOrderBy() != null) {
println();
x.getOrderBy().accept(this);
}
return false;
}
public boolean visit(SQLSelect x) {
return super.visit(x);
}
protected void visitAggreateRest(SQLAggregateExpr aggregateExpr) {
{
SQLOrderBy value = (SQLOrderBy) aggregateExpr.getAttribute("ORDER BY");
if (value != null) {
print(' ');
((SQLObject) value).accept(this);
}
}
{
Object value = aggregateExpr.getAttribute("SEPARATOR");
if (value != null) {
print0(ucase ? " SEPARATOR " : " separator ");
((SQLObject) value).accept(this);
}
}
}
}
@@ -15,6 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.teradata.visitor;
import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalytic;
import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalyticWindowing;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.util.JdbcUtils;
@@ -22,7 +24,25 @@ public class TeradataSchemaStatVisitor extends SchemaStatVisitor implements Tera
@Override
public String getDbType() {
return JdbcUtils.POSTGRESQL;
return JdbcUtils.TERADATA;
}
@Override
public boolean visit(TeradataAnalyticWindowing x) {
// TODO Auto-generated method stub
return true;
}
@Override
public void endVisit(TeradataAnalyticWindowing x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(TeradataAnalytic x) {
// TODO Auto-generated method stub
return false;
}
}