From b7e01921c51706b86bb3ee3bb88f72b41fd8d658 Mon Sep 17 00:00:00 2001 From: terrymanu Date: Wed, 13 Mar 2019 12:53:47 +0800 Subject: [PATCH] for #1864, use spi for sql parser --- sharding-core/sharding-core-parser/pom.xml | 1 + .../sharding-core-parser-common/pom.xml | 5 ++ .../antlr/parser/impl/SQLParserFactory.java | 59 ++++--------------- .../parser/impl/dialect/MySQLParser.java | 2 +- .../parser/impl/dialect/OracleParser.java | 2 +- .../parser/impl/dialect/PostgreSQLParser.java | 2 +- .../parser/impl/dialect/SQLServerParser.java | 2 +- .../antlr/spi/H2ShardingParseEngine.java | 43 ++++++++++++++ .../antlr/spi/MySQLShardingParseEngine.java | 43 ++++++++++++++ .../antlr/spi/OracleShardingParseEngine.java | 43 ++++++++++++++ .../spi/PostgreSQLShardingParseEngine.java | 43 ++++++++++++++ .../spi/SQLServerShardingParseEngine.java | 43 ++++++++++++++ ...phere.core.parsing.spi.ShardingParseEngine | 39 ++++++++++++ .../sharding-core-parser-spi/pom.xml | 30 ++++++++++ .../core/parsing/api}/SQLParser.java | 2 +- .../core/parsing/spi/ShardingParseEngine.java | 43 ++++++++++++++ 16 files changed, 350 insertions(+), 52 deletions(-) create mode 100644 sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/H2ShardingParseEngine.java create mode 100644 sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/MySQLShardingParseEngine.java create mode 100644 sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/OracleShardingParseEngine.java create mode 100644 sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/PostgreSQLShardingParseEngine.java create mode 100644 sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/SQLServerShardingParseEngine.java create mode 100644 sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/resources/META-INF/services/org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine create mode 100644 sharding-core/sharding-core-parser/sharding-core-parser-spi/pom.xml rename sharding-core/sharding-core-parser/{sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl => sharding-core-parser-spi/src/main/java/org/apache/shardingsphere/core/parsing/api}/SQLParser.java (94%) create mode 100644 sharding-core/sharding-core-parser/sharding-core-parser-spi/src/main/java/org/apache/shardingsphere/core/parsing/spi/ShardingParseEngine.java diff --git a/sharding-core/sharding-core-parser/pom.xml b/sharding-core/sharding-core-parser/pom.xml index cae7f79d0d..069bb35699 100644 --- a/sharding-core/sharding-core-parser/pom.xml +++ b/sharding-core/sharding-core-parser/pom.xml @@ -33,6 +33,7 @@ sharding-core-parser-postgresql sharding-core-parser-oracle sharding-core-parser-sqlserver + sharding-core-parser-spi diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/pom.xml b/sharding-core/sharding-core-parser/sharding-core-parser-common/pom.xml index c046dbd236..c24e565c16 100644 --- a/sharding-core/sharding-core-parser/sharding-core-parser-common/pom.xml +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/pom.xml @@ -39,6 +39,11 @@ sharding-core-common ${project.version} + + org.apache.shardingsphere + sharding-core-parser-spi + ${project.version} + org.apache.shardingsphere sharding-core-parser-mysql diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/SQLParserFactory.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/SQLParserFactory.java index 5fe59af7f1..ccf1eb71b7 100644 --- a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/SQLParserFactory.java +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/SQLParserFactory.java @@ -19,20 +19,10 @@ package org.apache.shardingsphere.core.parsing.antlr.parser.impl; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.TokenStream; import org.apache.shardingsphere.core.constant.DatabaseType; -import org.apache.shardingsphere.core.parsing.antlr.autogen.MySQLStatementLexer; -import org.apache.shardingsphere.core.parsing.antlr.autogen.OracleStatementLexer; -import org.apache.shardingsphere.core.parsing.antlr.autogen.PostgreSQLStatementLexer; -import org.apache.shardingsphere.core.parsing.antlr.autogen.SQLServerStatementLexer; -import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.MySQLParser; -import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.OracleParser; -import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.PostgreSQLParser; -import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.SQLServerParser; +import org.apache.shardingsphere.core.parsing.api.SQLParser; +import org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine; +import org.apache.shardingsphere.core.spi.NewInstanceServiceLoader; /** * SQL parser factory. @@ -43,6 +33,10 @@ import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.SQLServe @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class SQLParserFactory { + static { + NewInstanceServiceLoader.register(ShardingParseEngine.class); + } + /** * New instance of SQL parser. * @@ -51,40 +45,11 @@ public final class SQLParserFactory { * @return SQL parser */ public static SQLParser newInstance(final DatabaseType databaseType, final String sql) { - return createSQLParser(databaseType, createLexer(databaseType, sql)); - } - - private static Lexer createLexer(final DatabaseType databaseType, final String sql) { - CharStream sqlCharStream = CharStreams.fromString(sql); - switch (databaseType) { - case H2: - case MySQL: - return new MySQLStatementLexer(sqlCharStream); - case PostgreSQL: - return new PostgreSQLStatementLexer(sqlCharStream); - case SQLServer: - return new SQLServerStatementLexer(sqlCharStream); - case Oracle: - return new OracleStatementLexer(sqlCharStream); - default: - throw new UnsupportedOperationException(String.format("Can not support database type [%s].", databaseType)); - } - } - - private static SQLParser createSQLParser(final DatabaseType databaseType, final Lexer lexer) { - TokenStream tokenStream = new CommonTokenStream(lexer); - switch (databaseType) { - case H2: - case MySQL: - return new MySQLParser(tokenStream); - case PostgreSQL: - return new PostgreSQLParser(tokenStream); - case SQLServer: - return new SQLServerParser(tokenStream); - case Oracle: - return new OracleParser(tokenStream); - default: - throw new UnsupportedOperationException(String.format("Can not support database type [%s].", databaseType)); + for (ShardingParseEngine each : NewInstanceServiceLoader.newServiceInstances(ShardingParseEngine.class)) { + if (DatabaseType.valueOf(each.getDatabaseType()) == databaseType) { + return each.createSQLParser(sql); + } } + throw new UnsupportedOperationException(String.format("Cannot support database type '%s'", databaseType)); } } diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/MySQLParser.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/MySQLParser.java index e579950abd..47867abb27 100644 --- a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/MySQLParser.java +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/MySQLParser.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.core.parsing.antlr.autogen.MySQLStatementParser import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedErrorStrategy; import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedMatchHandler; import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedParserATNSimulator; -import org.apache.shardingsphere.core.parsing.antlr.parser.impl.SQLParser; +import org.apache.shardingsphere.core.parsing.api.SQLParser; /** * SQL parser for MySQL. diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/OracleParser.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/OracleParser.java index f6b8002b8d..998a930828 100644 --- a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/OracleParser.java +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/OracleParser.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.core.parsing.antlr.autogen.OracleStatementParse import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedErrorStrategy; import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedMatchHandler; import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedParserATNSimulator; -import org.apache.shardingsphere.core.parsing.antlr.parser.impl.SQLParser; +import org.apache.shardingsphere.core.parsing.api.SQLParser; /** * SQL parser for Oracle. diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/PostgreSQLParser.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/PostgreSQLParser.java index 4bd2d3b388..cc0768901a 100644 --- a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/PostgreSQLParser.java +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/PostgreSQLParser.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.core.parsing.antlr.autogen.PostgreSQLStatementP import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedErrorStrategy; import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedMatchHandler; import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedParserATNSimulator; -import org.apache.shardingsphere.core.parsing.antlr.parser.impl.SQLParser; +import org.apache.shardingsphere.core.parsing.api.SQLParser; /** * SQL parser for PostgreSQL. diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/SQLServerParser.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/SQLServerParser.java index f84f24f074..357f8bcf80 100644 --- a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/SQLServerParser.java +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/dialect/SQLServerParser.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.core.parsing.antlr.autogen.SQLServerStatementPa import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedErrorStrategy; import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedMatchHandler; import org.apache.shardingsphere.core.parsing.antlr.parser.advanced.AdvancedParserATNSimulator; -import org.apache.shardingsphere.core.parsing.antlr.parser.impl.SQLParser; +import org.apache.shardingsphere.core.parsing.api.SQLParser; /** * SQL parser for SQLServer. diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/H2ShardingParseEngine.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/H2ShardingParseEngine.java new file mode 100644 index 0000000000..3e39bc9882 --- /dev/null +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/H2ShardingParseEngine.java @@ -0,0 +1,43 @@ +/* + * 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.parsing.antlr.spi; + +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.apache.shardingsphere.core.constant.DatabaseType; +import org.apache.shardingsphere.core.parsing.antlr.autogen.MySQLStatementLexer; +import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.MySQLParser; +import org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine; + +/** + * Sharding parse engine for H2. + * + * @author zhangliang + */ +public final class H2ShardingParseEngine implements ShardingParseEngine { + + @Override + public String getDatabaseType() { + return DatabaseType.H2.name(); + } + + @Override + public MySQLParser createSQLParser(final String sql) { + return new MySQLParser(new CommonTokenStream(new MySQLStatementLexer(CharStreams.fromString(sql)))); + } +} diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/MySQLShardingParseEngine.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/MySQLShardingParseEngine.java new file mode 100644 index 0000000000..cbb444dd2d --- /dev/null +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/MySQLShardingParseEngine.java @@ -0,0 +1,43 @@ +/* + * 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.parsing.antlr.spi; + +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.apache.shardingsphere.core.constant.DatabaseType; +import org.apache.shardingsphere.core.parsing.antlr.autogen.MySQLStatementLexer; +import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.MySQLParser; +import org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine; + +/** + * Sharding parse engine for MySQL. + * + * @author zhangliang + */ +public final class MySQLShardingParseEngine implements ShardingParseEngine { + + @Override + public String getDatabaseType() { + return DatabaseType.MySQL.name(); + } + + @Override + public MySQLParser createSQLParser(final String sql) { + return new MySQLParser(new CommonTokenStream(new MySQLStatementLexer(CharStreams.fromString(sql)))); + } +} diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/OracleShardingParseEngine.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/OracleShardingParseEngine.java new file mode 100644 index 0000000000..63c183095f --- /dev/null +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/OracleShardingParseEngine.java @@ -0,0 +1,43 @@ +/* + * 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.parsing.antlr.spi; + +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.apache.shardingsphere.core.constant.DatabaseType; +import org.apache.shardingsphere.core.parsing.antlr.autogen.OracleStatementLexer; +import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.OracleParser; +import org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine; + +/** + * Sharding parse engine for Oracle. + * + * @author zhangliang + */ +public final class OracleShardingParseEngine implements ShardingParseEngine { + + @Override + public String getDatabaseType() { + return DatabaseType.Oracle.name(); + } + + @Override + public OracleParser createSQLParser(final String sql) { + return new OracleParser(new CommonTokenStream(new OracleStatementLexer(CharStreams.fromString(sql)))); + } +} diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/PostgreSQLShardingParseEngine.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/PostgreSQLShardingParseEngine.java new file mode 100644 index 0000000000..40e18e3e78 --- /dev/null +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/PostgreSQLShardingParseEngine.java @@ -0,0 +1,43 @@ +/* + * 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.parsing.antlr.spi; + +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.apache.shardingsphere.core.constant.DatabaseType; +import org.apache.shardingsphere.core.parsing.antlr.autogen.PostgreSQLStatementLexer; +import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.PostgreSQLParser; +import org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine; + +/** + * Sharding parse engine for PostgreSQL. + * + * @author zhangliang + */ +public final class PostgreSQLShardingParseEngine implements ShardingParseEngine { + + @Override + public String getDatabaseType() { + return DatabaseType.PostgreSQL.name(); + } + + @Override + public PostgreSQLParser createSQLParser(final String sql) { + return new PostgreSQLParser(new CommonTokenStream(new PostgreSQLStatementLexer(CharStreams.fromString(sql)))); + } +} diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/SQLServerShardingParseEngine.java b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/SQLServerShardingParseEngine.java new file mode 100644 index 0000000000..5ae0e0d45e --- /dev/null +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/spi/SQLServerShardingParseEngine.java @@ -0,0 +1,43 @@ +/* + * 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.parsing.antlr.spi; + +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.apache.shardingsphere.core.constant.DatabaseType; +import org.apache.shardingsphere.core.parsing.antlr.autogen.SQLServerStatementLexer; +import org.apache.shardingsphere.core.parsing.antlr.parser.impl.dialect.SQLServerParser; +import org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine; + +/** + * Sharding parse engine for SQLServer. + * + * @author zhangliang + */ +public final class SQLServerShardingParseEngine implements ShardingParseEngine { + + @Override + public String getDatabaseType() { + return DatabaseType.SQLServer.name(); + } + + @Override + public SQLServerParser createSQLParser(final String sql) { + return new SQLServerParser(new CommonTokenStream(new SQLServerStatementLexer(CharStreams.fromString(sql)))); + } +} diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/resources/META-INF/services/org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/resources/META-INF/services/org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine new file mode 100644 index 0000000000..cc9a0e0569 --- /dev/null +++ b/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/resources/META-INF/services/org.apache.shardingsphere.core.parsing.spi.ShardingParseEngine @@ -0,0 +1,39 @@ +# +# 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. +# + +# +# 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. +# + +org.apache.shardingsphere.core.parsing.antlr.spi.MySQLShardingParseEngine +org.apache.shardingsphere.core.parsing.antlr.spi.PostgreSQLShardingParseEngine +org.apache.shardingsphere.core.parsing.antlr.spi.SQLServerShardingParseEngine +org.apache.shardingsphere.core.parsing.antlr.spi.OracleShardingParseEngine +org.apache.shardingsphere.core.parsing.antlr.spi.H2ShardingParseEngine diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-spi/pom.xml b/sharding-core/sharding-core-parser/sharding-core-parser-spi/pom.xml new file mode 100644 index 0000000000..1161127eaa --- /dev/null +++ b/sharding-core/sharding-core-parser/sharding-core-parser-spi/pom.xml @@ -0,0 +1,30 @@ + + + + + + sharding-core-parser + org.apache.shardingsphere + 4.0.0-RC2-SNAPSHOT + + 4.0.0 + sharding-core-parser-spi + ${project.artifactId} + diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/SQLParser.java b/sharding-core/sharding-core-parser/sharding-core-parser-spi/src/main/java/org/apache/shardingsphere/core/parsing/api/SQLParser.java similarity index 94% rename from sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/SQLParser.java rename to sharding-core/sharding-core-parser/sharding-core-parser-spi/src/main/java/org/apache/shardingsphere/core/parsing/api/SQLParser.java index bcf382e89c..d003661501 100644 --- a/sharding-core/sharding-core-parser/sharding-core-parser-common/src/main/java/org/apache/shardingsphere/core/parsing/antlr/parser/impl/SQLParser.java +++ b/sharding-core/sharding-core-parser/sharding-core-parser-spi/src/main/java/org/apache/shardingsphere/core/parsing/api/SQLParser.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.core.parsing.antlr.parser.impl; +package org.apache.shardingsphere.core.parsing.api; import org.antlr.v4.runtime.ParserRuleContext; diff --git a/sharding-core/sharding-core-parser/sharding-core-parser-spi/src/main/java/org/apache/shardingsphere/core/parsing/spi/ShardingParseEngine.java b/sharding-core/sharding-core-parser/sharding-core-parser-spi/src/main/java/org/apache/shardingsphere/core/parsing/spi/ShardingParseEngine.java new file mode 100644 index 0000000000..dead813d2c --- /dev/null +++ b/sharding-core/sharding-core-parser/sharding-core-parser-spi/src/main/java/org/apache/shardingsphere/core/parsing/spi/ShardingParseEngine.java @@ -0,0 +1,43 @@ +/* + * 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.parsing.spi; + +import org.apache.shardingsphere.core.parsing.api.SQLParser; + +/** + * Sharding parse engine. + * + * @author zhangliang + */ +public interface ShardingParseEngine { + + /** + * Get database type. + * + * @return database type + */ + String getDatabaseType(); + + /** + * Create SQL parser. + * + * @param sql SQL + * @return instance of SQL parser + */ + SQLParser createSQLParser(String sql); +} -- GitLab