Package com.alibaba.druid.sql.oracle.demo

Source Code of com.alibaba.druid.sql.oracle.demo.Demo1$MyOracleVisitor

/*
* 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.oracle.demo;

import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter;
import com.alibaba.druid.sql.parser.SQLStatementParser;

public class Demo1 extends TestCase {

    public void test_0() throws Exception {
        String sql = "select * from user where uid = ? and uname = ?";
        List<Object> parameters = new ArrayList<Object>();
        parameters.add(1);
        parameters.add("wenshao");

        SQLStatementParser parser = new OracleStatementParser(sql);
        List<SQLStatement> stmtList = parser.parseStatementList(); //

        SQLStatement first = (SQLStatement) stmtList.get(0);

        GetVariantVisitor variantVisitor = new GetVariantVisitor();
        first.accept(variantVisitor);

        SQLVariantRefExpr firstVar = variantVisitor.getVariantList().get(0);
       
        int varIndex = (Integer) firstVar.getAttribute("varIndex");
        Integer param = (Integer) parameters.get(varIndex);
       
        String tableName;
        if (param.intValue() == 1) {
            tableName = "user_1";
        } else {
            tableName = "user_x";
        }

        MyOracleVisitor visitor = new MyOracleVisitor(tableName);
        first.accept(visitor);
       
        String realSql = SQLUtils.toOracleString(first);
        System.out.println(realSql);
    }

    private static class GetVariantVisitor extends OracleASTVisitorAdapter {

        private int                     varIndex    = 0;
        private List<SQLVariantRefExpr> variantList = new ArrayList<SQLVariantRefExpr>();

        public boolean visit(SQLVariantRefExpr x) {
            x.getAttributes().put("varIndex", varIndex++);
            return true;
        }

        public boolean visit(SQLBinaryOpExpr x) {
            if (x.getLeft() instanceof SQLIdentifierExpr && x.getRight() instanceof SQLVariantRefExpr) {
                SQLIdentifierExpr identExpr = (SQLIdentifierExpr) x.getLeft();
                String ident = identExpr.getName();
                if (ident.equals("uid")) {
                    variantList.add((SQLVariantRefExpr) x.getRight());
                }
            }

            return true;
        }

        public int getVarIndex() {
            return varIndex;
        }

        public void setVarIndex(int varIndex) {
            this.varIndex = varIndex;
        }

        public List<SQLVariantRefExpr> getVariantList() {
            return variantList;
        }

        public void setVariantList(List<SQLVariantRefExpr> variantList) {
            this.variantList = variantList;
        }

    }

    private static class MyOracleVisitor extends OracleASTVisitorAdapter {

        private String tableName;

        public MyOracleVisitor(String tableName){
            this.tableName = tableName;
        }
       
        public boolean visit(OracleSelectTableReference x) {
            SQLExpr expr = x.getExpr();
            if (expr instanceof SQLIdentifierExpr) {
                SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr;
                String tableName = identExpr.getName();
               
                if (tableName.equals("user")) {
                    identExpr.setName(this.tableName);
                }
            } else if (expr instanceof SQLPropertyExpr) {
                SQLPropertyExpr proExpr = (SQLPropertyExpr) expr;
                String tableName = proExpr.getName();
               
                if (tableName.equals("user")) {
                    proExpr.setName(this.tableName);
                }
            }

            return true;
        }

        public boolean visit(SQLExprTableSource x) {
            SQLExpr expr = x.getExpr();
            if (expr instanceof SQLIdentifierExpr) {
                SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr;
                String tableName = identExpr.getName();
               
                if (tableName.equals("user")) {
                    identExpr.setName(this.tableName);
                }
            } else if (expr instanceof SQLPropertyExpr) {
                SQLPropertyExpr proExpr = (SQLPropertyExpr) expr;
                String tableName = proExpr.getName();
               
                if (tableName.equals("user")) {
                    proExpr.setName(this.tableName);
                }
            }

            return true;
        }
    }

}
TOP

Related Classes of com.alibaba.druid.sql.oracle.demo.Demo1$MyOracleVisitor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.