Commit 2b23f3ea authored by terrymanu's avatar terrymanu
Browse files

for #2084, remove PlaceholderIndexesAware, use param to pass...

for #2084, remove PlaceholderIndexesAware, use param to pass placeholderIndexes for concurrency issue
parent 64d19fc6
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import com.google.common.base.Preconditions;
import org.antlr.v4.runtime.ParserRuleContext;
import org.apache.shardingsphere.core.parse.antlr.extractor.api.CollectionSQLSegmentExtractor;
import org.apache.shardingsphere.core.parse.antlr.extractor.api.OptionalSQLSegmentExtractor;
import org.apache.shardingsphere.core.parse.antlr.extractor.api.PlaceholderIndexesAware;
import org.apache.shardingsphere.core.parse.antlr.extractor.api.SQLSegmentExtractor;
import org.apache.shardingsphere.core.parse.antlr.extractor.util.ExtractorUtils;
import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName;
@@ -50,17 +49,15 @@ public final class SQLSegmentsExtractorEngine {
    public Collection<SQLSegment> extract(final SQLAST ast) {
        Collection<SQLSegment> result = new LinkedList<>();
        Preconditions.checkState(ast.getSQLStatementRule().isPresent());
        Map<ParserRuleContext, Integer> placeholderIndexes = getPlaceholderIndexes(ast.getParserRuleContext());
        for (SQLSegmentExtractor each : ast.getSQLStatementRule().get().getExtractors()) {
            if (each instanceof PlaceholderIndexesAware) {
                ((PlaceholderIndexesAware) each).setPlaceholderIndexes(getPlaceholderIndexes(ast.getParserRuleContext()));
            }
            if (each instanceof OptionalSQLSegmentExtractor) {
                Optional<? extends SQLSegment> sqlSegment = ((OptionalSQLSegmentExtractor) each).extract(ast.getParserRuleContext());
                Optional<? extends SQLSegment> sqlSegment = ((OptionalSQLSegmentExtractor) each).extract(ast.getParserRuleContext(), placeholderIndexes);
                if (sqlSegment.isPresent()) {
                    result.add(sqlSegment.get());
                }
            } else if (each instanceof CollectionSQLSegmentExtractor) {
                result.addAll(((CollectionSQLSegmentExtractor) each).extract(ast.getParserRuleContext()));
                result.addAll(((CollectionSQLSegmentExtractor) each).extract(ast.getParserRuleContext(), placeholderIndexes));
            }
        }
        return result;
+3 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import org.antlr.v4.runtime.ParserRuleContext;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.SQLSegment;

import java.util.Collection;
import java.util.Map;

/**
 * Collection SQL segment extractor.
@@ -33,7 +34,8 @@ public interface CollectionSQLSegmentExtractor extends SQLSegmentExtractor {
     * Extract SQL segments from SQL AST.
     *  
     * @param ancestorNode ancestor node of AST
     * @param placeholderIndexes placeholder indexes
     * @return SQL segments
     */
    Collection<? extends SQLSegment> extract(ParserRuleContext ancestorNode);
    Collection<? extends SQLSegment> extract(ParserRuleContext ancestorNode, Map<ParserRuleContext, Integer> placeholderIndexes);
}
+4 −1
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import com.google.common.base.Optional;
import org.antlr.v4.runtime.ParserRuleContext;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.SQLSegment;

import java.util.Map;

/**
 * Optional SQL segment extractor.
 * 
@@ -32,7 +34,8 @@ public interface OptionalSQLSegmentExtractor extends SQLSegmentExtractor {
     * Extract SQL segment from SQL AST.
     *  
     * @param ancestorNode ancestor node of AST
     * @param placeholderIndexes placeholder indexes
     * @return SQL segment
     */
    Optional<? extends SQLSegment> extract(ParserRuleContext ancestorNode);
    Optional<? extends SQLSegment> extract(ParserRuleContext ancestorNode, Map<ParserRuleContext, Integer> placeholderIndexes);
}
+0 −37
Original line number Diff line number Diff line
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.shardingsphere.core.parse.antlr.extractor.api;

import org.antlr.v4.runtime.ParserRuleContext;

import java.util.Map;

/**
 * Placeholder indexes aware.
 *
 * @author zhangliang
 */
public interface PlaceholderIndexesAware {
    
    /**
     * Set placeholder indexes.
     * 
     * @param placeholderIndexes placeholder indexes
     */
    void setPlaceholderIndexes(Map<ParserRuleContext, Integer> placeholderIndexes);
}
+3 −1
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.util.ExtractorUtils;
import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnSegment;

import java.util.Map;

/**
 * Column extractor.
 *
@@ -34,7 +36,7 @@ import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.column.ColumnS
public final class ColumnExtractor implements OptionalSQLSegmentExtractor {
    
    @Override
    public Optional<ColumnSegment> extract(final ParserRuleContext ancestorNode) {
    public Optional<ColumnSegment> extract(final ParserRuleContext ancestorNode, final Map<ParserRuleContext, Integer> placeholderIndexes) {
        Optional<ParserRuleContext> columnNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.COLUMN_NAME);
        return columnNode.isPresent() ? Optional.of(getColumnSegment(columnNode.get())) : Optional.<ColumnSegment>absent();
    }
Loading