未验证 提交 c2ff73ce 编写于 作者: L Liang Zhang 提交者: GitHub

decouple find RemoveAvailable with SQLStatement (#4370)

上级 ee4d8603
...@@ -17,8 +17,10 @@ ...@@ -17,8 +17,10 @@
package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql; package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql;
import com.google.common.base.Optional;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.RemoveAvailable;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment; import org.apache.shardingsphere.sql.parser.sql.segment.generic.TableSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement; import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.generic.TableSegmentAvailable; import org.apache.shardingsphere.sql.parser.sql.statement.generic.TableSegmentAvailable;
...@@ -26,9 +28,20 @@ import org.apache.shardingsphere.sql.parser.sql.statement.generic.TableSegmentAv ...@@ -26,9 +28,20 @@ import org.apache.shardingsphere.sql.parser.sql.statement.generic.TableSegmentAv
/** /**
* Show columns statement. * Show columns statement.
*/ */
@Setter
@Getter @Getter
@Setter
public final class ShowColumnsStatement extends DALStatement implements TableSegmentAvailable { public final class ShowColumnsStatement extends DALStatement implements TableSegmentAvailable {
private TableSegment table; private TableSegment table;
private RemoveAvailable fromSchema;
/**
* Get from schema.
*
* @return from schema
*/
public Optional<RemoveAvailable> getFromSchema() {
return Optional.fromNullable(fromSchema);
}
} }
...@@ -17,10 +17,25 @@ ...@@ -17,10 +17,25 @@
package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql; package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql;
import com.google.common.base.Optional;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.RemoveAvailable;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement; import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
/** /**
* Show table status statement. * Show table status statement.
*/ */
@Setter
public final class ShowTableStatusStatement extends DALStatement { public final class ShowTableStatusStatement extends DALStatement {
private RemoveAvailable fromSchema;
/**
* Get from schema.
*
* @return from schema
*/
public Optional<RemoveAvailable> getFromSchema() {
return Optional.fromNullable(fromSchema);
}
} }
...@@ -17,10 +17,25 @@ ...@@ -17,10 +17,25 @@
package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql; package org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql;
import com.google.common.base.Optional;
import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.RemoveAvailable;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement; import org.apache.shardingsphere.sql.parser.sql.statement.dal.DALStatement;
/** /**
* Show tables statement. * Show tables statement.
*/ */
@Setter
public final class ShowTablesStatement extends DALStatement { public final class ShowTablesStatement extends DALStatement {
private RemoveAvailable fromSchema;
/**
* Get from schema.
*
* @return from schema
*/
public Optional<RemoveAvailable> getFromSchema() {
return Optional.fromNullable(fromSchema);
}
} }
/*
* 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.sql.parser.core.filler.dal;
import org.apache.shardingsphere.sql.parser.core.filler.SQLSegmentFiller;
import org.apache.shardingsphere.sql.parser.sql.segment.dal.FromSchemaSegment;
import org.apache.shardingsphere.sql.parser.sql.statement.SQLStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowColumnsStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowTableStatusStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowTablesStatement;
/**
* From schema filler.
*/
public final class FromSchemaFiller implements SQLSegmentFiller<FromSchemaSegment> {
@Override
public void fill(final FromSchemaSegment sqlSegment, final SQLStatement sqlStatement) {
if (sqlStatement instanceof ShowTablesStatement) {
((ShowTablesStatement) sqlStatement).setFromSchema(sqlSegment);
}
if (sqlStatement instanceof ShowTableStatusStatement) {
((ShowTableStatusStatement) sqlStatement).setFromSchema(sqlSegment);
}
if (sqlStatement instanceof ShowColumnsStatement) {
((ShowColumnsStatement) sqlStatement).setFromSchema(sqlSegment);
}
}
}
...@@ -89,6 +89,7 @@ public final class MySQLDALVisitor extends MySQLVisitor { ...@@ -89,6 +89,7 @@ public final class MySQLDALVisitor extends MySQLVisitor {
if (null != ctx.fromSchema()) { if (null != ctx.fromSchema()) {
FromSchemaSegment fromSchemaSegment = (FromSchemaSegment) visit(ctx.fromSchema()); FromSchemaSegment fromSchemaSegment = (FromSchemaSegment) visit(ctx.fromSchema());
result.getAllSQLSegments().add(fromSchemaSegment); result.getAllSQLSegments().add(fromSchemaSegment);
result.setFromSchema(fromSchemaSegment);
} }
if (null != ctx.showLike()) { if (null != ctx.showLike()) {
ShowLikeSegment showLikeSegment = (ShowLikeSegment) visit(ctx.showLike()); ShowLikeSegment showLikeSegment = (ShowLikeSegment) visit(ctx.showLike());
...@@ -103,6 +104,7 @@ public final class MySQLDALVisitor extends MySQLVisitor { ...@@ -103,6 +104,7 @@ public final class MySQLDALVisitor extends MySQLVisitor {
if (null != ctx.fromSchema()) { if (null != ctx.fromSchema()) {
FromSchemaSegment fromSchemaSegment = (FromSchemaSegment) visit(ctx.fromSchema()); FromSchemaSegment fromSchemaSegment = (FromSchemaSegment) visit(ctx.fromSchema());
result.getAllSQLSegments().add(fromSchemaSegment); result.getAllSQLSegments().add(fromSchemaSegment);
result.setFromSchema(fromSchemaSegment);
} }
if (null != ctx.showLike()) { if (null != ctx.showLike()) {
ShowLikeSegment showLikeSegment = (ShowLikeSegment) visit(ctx.showLike()); ShowLikeSegment showLikeSegment = (ShowLikeSegment) visit(ctx.showLike());
...@@ -123,6 +125,7 @@ public final class MySQLDALVisitor extends MySQLVisitor { ...@@ -123,6 +125,7 @@ public final class MySQLDALVisitor extends MySQLVisitor {
if (null != ctx.fromSchema()) { if (null != ctx.fromSchema()) {
FromSchemaSegment fromSchemaSegment = (FromSchemaSegment) visit(ctx.fromSchema()); FromSchemaSegment fromSchemaSegment = (FromSchemaSegment) visit(ctx.fromSchema());
result.getAllSQLSegments().add(fromSchemaSegment); result.getAllSQLSegments().add(fromSchemaSegment);
result.setFromSchema(fromSchemaSegment);
} }
return result; return result;
} }
......
...@@ -18,4 +18,5 @@ ...@@ -18,4 +18,5 @@
<filler-rule-definition> <filler-rule-definition>
<filler-rule sql-segment-class="org.apache.shardingsphere.sql.parser.sql.segment.tcl.AutoCommitSegment" filler-class="org.apache.shardingsphere.sql.parser.core.filler.tcl.MySQLAutoCommitFiller" /> <filler-rule sql-segment-class="org.apache.shardingsphere.sql.parser.sql.segment.tcl.AutoCommitSegment" filler-class="org.apache.shardingsphere.sql.parser.core.filler.tcl.MySQLAutoCommitFiller" />
<filler-rule sql-segment-class="org.apache.shardingsphere.sql.parser.sql.segment.dal.FromSchemaSegment" filler-class="org.apache.shardingsphere.sql.parser.core.filler.dal.FromSchemaFiller" />
</filler-rule-definition> </filler-rule-definition>
...@@ -17,14 +17,17 @@ ...@@ -17,14 +17,17 @@
package org.apache.shardingsphere.underlying.rewrite.sql.token.generator.generic; package org.apache.shardingsphere.underlying.rewrite.sql.token.generator.generic;
import com.google.common.base.Preconditions;
import org.apache.shardingsphere.sql.parser.relation.statement.SQLStatementContext; import org.apache.shardingsphere.sql.parser.relation.statement.SQLStatementContext;
import org.apache.shardingsphere.sql.parser.sql.segment.SQLSegment;
import org.apache.shardingsphere.sql.parser.sql.segment.generic.RemoveAvailable; import org.apache.shardingsphere.sql.parser.sql.segment.generic.RemoveAvailable;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowColumnsStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowTableStatusStatement;
import org.apache.shardingsphere.sql.parser.sql.statement.dal.dialect.mysql.ShowTablesStatement;
import org.apache.shardingsphere.underlying.rewrite.sql.token.generator.CollectionSQLTokenGenerator; import org.apache.shardingsphere.underlying.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
import org.apache.shardingsphere.underlying.rewrite.sql.token.pojo.generic.RemoveToken; import org.apache.shardingsphere.underlying.rewrite.sql.token.pojo.generic.RemoveToken;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.Collections;
/** /**
* Remove token generator. * Remove token generator.
...@@ -33,15 +36,35 @@ public final class RemoveTokenGenerator implements CollectionSQLTokenGenerator { ...@@ -33,15 +36,35 @@ public final class RemoveTokenGenerator implements CollectionSQLTokenGenerator {
@Override @Override
public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) { public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) {
return !sqlStatementContext.getSqlStatement().findSQLSegments(RemoveAvailable.class).isEmpty(); if (sqlStatementContext.getSqlStatement() instanceof ShowTablesStatement) {
return ((ShowTablesStatement) sqlStatementContext.getSqlStatement()).getFromSchema().isPresent();
}
if (sqlStatementContext.getSqlStatement() instanceof ShowTableStatusStatement) {
return ((ShowTableStatusStatement) sqlStatementContext.getSqlStatement()).getFromSchema().isPresent();
}
if (sqlStatementContext.getSqlStatement() instanceof ShowColumnsStatement) {
return ((ShowColumnsStatement) sqlStatementContext.getSqlStatement()).getFromSchema().isPresent();
}
return false;
} }
@Override @Override
public Collection<RemoveToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) { public Collection<RemoveToken> generateSQLTokens(final SQLStatementContext sqlStatementContext) {
Collection<RemoveToken> result = new LinkedList<>(); if (sqlStatementContext.getSqlStatement() instanceof ShowTablesStatement) {
for (SQLSegment each : sqlStatementContext.getSqlStatement().findSQLSegments(RemoveAvailable.class)) { Preconditions.checkState(((ShowTablesStatement) sqlStatementContext.getSqlStatement()).getFromSchema().isPresent());
result.add(new RemoveToken(each.getStartIndex(), each.getStopIndex())); RemoveAvailable removeAvailable = ((ShowTablesStatement) sqlStatementContext.getSqlStatement()).getFromSchema().get();
return Collections.singletonList(new RemoveToken(removeAvailable.getStartIndex(), removeAvailable.getStopIndex()));
}
if (sqlStatementContext.getSqlStatement() instanceof ShowTableStatusStatement) {
Preconditions.checkState(((ShowTableStatusStatement) sqlStatementContext.getSqlStatement()).getFromSchema().isPresent());
RemoveAvailable removeAvailable = ((ShowTableStatusStatement) sqlStatementContext.getSqlStatement()).getFromSchema().get();
return Collections.singletonList(new RemoveToken(removeAvailable.getStartIndex(), removeAvailable.getStopIndex()));
}
if (sqlStatementContext.getSqlStatement() instanceof ShowColumnsStatement) {
Preconditions.checkState(((ShowColumnsStatement) sqlStatementContext.getSqlStatement()).getFromSchema().isPresent());
RemoveAvailable removeAvailable = ((ShowColumnsStatement) sqlStatementContext.getSqlStatement()).getFromSchema().get();
return Collections.singletonList(new RemoveToken(removeAvailable.getStartIndex(), removeAvailable.getStopIndex()));
} }
return result; return Collections.emptyList();
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册