InsertColumnsClauseParser.java 4.2 KB
Newer Older
1
/*
T
terrymanu 已提交
2
 * Copyright 2016-2018 shardingsphere.io.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 * <p>
 * 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.
 * </p>
 */

18
package io.shardingsphere.core.parsing.parser.clause;
19 20

import com.google.common.base.Optional;
21 22 23 24 25 26 27
import io.shardingsphere.core.metadata.ShardingMetaData;
import io.shardingsphere.core.parsing.lexer.LexerEngine;
import io.shardingsphere.core.parsing.lexer.token.Assist;
import io.shardingsphere.core.parsing.lexer.token.Symbol;
import io.shardingsphere.core.parsing.parser.context.condition.Column;
import io.shardingsphere.core.parsing.parser.sql.dml.insert.InsertStatement;
import io.shardingsphere.core.parsing.parser.token.InsertColumnToken;
28
import io.shardingsphere.core.parsing.parser.token.ItemsToken;
29 30
import io.shardingsphere.core.rule.ShardingRule;
import io.shardingsphere.core.util.SQLUtil;
31 32 33 34
import lombok.RequiredArgsConstructor;

import java.util.Collection;
import java.util.LinkedList;
T
tristaZero 已提交
35
import java.util.List;
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

/**
 * Insert columns clause parser.
 *
 * @author zhangliang
 */
@RequiredArgsConstructor
public final class InsertColumnsClauseParser implements SQLClauseParser {
    
    private final ShardingRule shardingRule;
    
    private final LexerEngine lexerEngine;
    
    /**
     * Parse insert columns.
     *
     * @param insertStatement insert statement
T
tristaZero 已提交
53
     * @param shardingMetaData sharding meta data
54
     */
T
tristaZero 已提交
55
    public void parse(final InsertStatement insertStatement, final ShardingMetaData shardingMetaData) {
56
        Collection<Column> result = new LinkedList<>();
T
tristaZero 已提交
57 58 59
        String tableName = insertStatement.getTables().getSingleTableName();
        Optional<Column> generateKeyColumn = shardingRule.getGenerateKeyColumn(tableName);
        int count = 0;
60 61 62 63 64 65
        if (lexerEngine.equalAny(Symbol.LEFT_PAREN)) {
            do {
                lexerEngine.nextToken();
                String columnName = SQLUtil.getExactlyValue(lexerEngine.getCurrentToken().getLiterals());
                result.add(new Column(columnName, tableName));
                lexerEngine.nextToken();
66
                if (generateKeyColumn.isPresent() && generateKeyColumn.get().getName().equalsIgnoreCase(columnName)) {
67 68 69 70 71 72
                    insertStatement.setGenerateKeyColumnIndex(count);
                }
                count++;
            } while (!lexerEngine.equalAny(Symbol.RIGHT_PAREN) && !lexerEngine.equalAny(Assist.END));
            insertStatement.setColumnsListLastPosition(lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length());
            lexerEngine.nextToken();
T
tristaZero 已提交
73 74 75
        } else {
            List<String> columnNames = shardingMetaData.getTableMetaDataMap().get(tableName).getAllColumnNames();
            int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length() - 1;
76
            insertStatement.getSqlTokens().add(new InsertColumnToken(beginPosition, "("));
T
tristaZero 已提交
77 78 79 80 81 82 83 84 85 86 87
            ItemsToken columnsToken = new ItemsToken(beginPosition);
            columnsToken.setFirstOfItemsSpecial(true);
            for (String columnName : columnNames) {
                result.add(new Column(columnName, tableName));
                if (generateKeyColumn.isPresent() && generateKeyColumn.get().getName().equalsIgnoreCase(columnName)) {
                    insertStatement.setGenerateKeyColumnIndex(count);
                }
                columnsToken.getItems().add(columnName);
                count++;
            }
            insertStatement.getSqlTokens().add(columnsToken);
88
            insertStatement.getSqlTokens().add(new InsertColumnToken(beginPosition, ")"));
T
tristaZero 已提交
89
            insertStatement.setColumnsListLastPosition(beginPosition);
90 91 92 93
        }
        insertStatement.getColumns().addAll(result);
    }
}