/*
 * Copyright 1999-2017 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.oscar.visitor;

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.ast.*;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.*;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.*;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*;
import com.alibaba.druid.sql.dialect.oscar.ast.stmt.*;

import java.util.List;

public class OscarPermissionOutputVisitor extends OscarOutputVisitor {
    public OscarPermissionOutputVisitor(Appendable appender) {
        super(appender);
        this.dbType = DbType.oscar;
    }

    public OscarPermissionOutputVisitor(Appendable appender, boolean parameterized) {
        super(appender, parameterized);
        this.dbType = DbType.oscar;
    }

    @Override
    public boolean visit(SQLExprTableSource x) {
        String catalog = x.getCatalog();
        String schema = x.getSchema();
        String tableName = x.getTableName();
        List<SQLName> columns1 = x.getColumns();
        int sourceColumn = x.getSourceColumn();

        //SQLExpr sqlExpr = SQLUtils.toSQLExpr("id=3", dbType);

        print(" (");
        print0(ucase ? "SELECT " : "select ");
        print('*');
        print0(ucase ? " FROM " : " from ");
        printTableSourceExpr(x.getExpr());
        //print0(ucase ? " WHERE " : " where ");
        //printExpr(sqlExpr);
        print(')');

        final SQLTableSampling sampling = x.getSampling();
        if (sampling != null) {
            print(' ');
            sampling.accept(this);
        }

        String alias = x.getAlias();
        List<SQLName> columns = x.getColumnsDirect();
        if (alias != null) {
            print(' ');
            if (columns != null && columns.size() > 0) {
                print0(ucase ? " AS " : " as ");
            }
            print0(alias);
        }

        if (columns != null && columns.size() > 0) {
            print(" (");
            printAndAccept(columns, ", ");
            print(')');
        }

        for (int i = 0; i < x.getHintsSize(); ++i) {
            print(' ');
            x.getHints().get(i).accept(this);
        }

        if (x.getPartitionSize() > 0) {
            print0(ucase ? " PARTITION (" : " partition (");
            printlnAndAccept(x.getPartitions(), ", ");
            print(')');
        }

        return false;
    }
}
