mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Add basic implementation for TD Visitor
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
+20
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+135
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+21
-1
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user