Loading sharding-core/src/main/java/io/shardingjdbc/core/merger/DALMergeEngine.java 0 → 100644 +61 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import io.shardingjdbc.core.merger.show.ShowCreateTableResultSetMerger; import io.shardingjdbc.core.merger.show.ShowDatabasesResultSetMerger; import io.shardingjdbc.core.merger.show.ShowOtherResultSetMerger; import io.shardingjdbc.core.merger.show.ShowTablesResultSetMerger; import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowCreateTableStatement; import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowDatabasesStatement; import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowTablesStatement; import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement; import io.shardingjdbc.core.rule.ShardingRule; import lombok.RequiredArgsConstructor; import java.sql.SQLException; import java.util.List; /** * DAL result set merge engine. * * @author zhangliang */ @RequiredArgsConstructor public final class DALMergeEngine implements MergeEngine { private final ShardingRule shardingRule; private final List<QueryResult> queryResults; private final DALStatement dalStatement; @Override public ResultSetMerger merge() throws SQLException { if (dalStatement instanceof ShowDatabasesStatement) { return new ShowDatabasesResultSetMerger(); } if (dalStatement instanceof ShowTablesStatement) { return new ShowTablesResultSetMerger(shardingRule, queryResults); } if (dalStatement instanceof ShowCreateTableStatement) { return new ShowCreateTableResultSetMerger(shardingRule, queryResults); } return new ShowOtherResultSetMerger(queryResults.get(0)); } } sharding-core/src/main/java/io/shardingjdbc/core/merger/DQLMergeEngine.java 0 → 100644 +100 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import io.shardingjdbc.core.constant.DatabaseType; import io.shardingjdbc.core.merger.groupby.GroupByMemoryResultSetMerger; import io.shardingjdbc.core.merger.groupby.GroupByStreamResultSetMerger; import io.shardingjdbc.core.merger.iterator.IteratorStreamResultSetMerger; import io.shardingjdbc.core.merger.orderby.OrderByStreamResultSetMerger; import io.shardingjdbc.core.merger.pagination.LimitDecoratorResultSetMerger; import io.shardingjdbc.core.merger.pagination.RowNumberDecoratorResultSetMerger; import io.shardingjdbc.core.merger.pagination.TopAndRowNumberDecoratorResultSetMerger; import io.shardingjdbc.core.parsing.parser.context.limit.Limit; import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement; import io.shardingjdbc.core.util.SQLUtil; import java.sql.SQLException; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * DQL result set merge engine. * * @author zhangliang */ public final class DQLMergeEngine implements MergeEngine { private final List<QueryResult> queryResults; private final SelectStatement selectStatement; private final Map<String, Integer> columnLabelIndexMap; public DQLMergeEngine(final List<QueryResult> queryResults, final SelectStatement selectStatement) throws SQLException { this.queryResults = queryResults; this.selectStatement = selectStatement; columnLabelIndexMap = getColumnLabelIndexMap(queryResults.get(0)); } private Map<String, Integer> getColumnLabelIndexMap(final QueryResult queryResult) throws SQLException { Map<String, Integer> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (int i = 1; i <= queryResult.getColumnCount(); i++) { result.put(SQLUtil.getExactlyValue(queryResult.getColumnLabel(i)), i); } return result; } @Override public ResultSetMerger merge() throws SQLException { selectStatement.setIndexForItems(columnLabelIndexMap); return decorate(build()); } private ResultSetMerger build() throws SQLException { if (!selectStatement.getGroupByItems().isEmpty() || !selectStatement.getAggregationSelectItems().isEmpty()) { if (selectStatement.isSameGroupByAndOrderByItems()) { return new GroupByStreamResultSetMerger(columnLabelIndexMap, queryResults, selectStatement); } else { return new GroupByMemoryResultSetMerger(columnLabelIndexMap, queryResults, selectStatement); } } if (!selectStatement.getOrderByItems().isEmpty()) { return new OrderByStreamResultSetMerger(queryResults, selectStatement.getOrderByItems()); } return new IteratorStreamResultSetMerger(queryResults); } private ResultSetMerger decorate(final ResultSetMerger resultSetMerger) throws SQLException { Limit limit = selectStatement.getLimit(); if (null == limit) { return resultSetMerger; } if (DatabaseType.MySQL == limit.getDatabaseType() || DatabaseType.PostgreSQL == limit.getDatabaseType() || DatabaseType.H2 == limit.getDatabaseType()) { return new LimitDecoratorResultSetMerger(resultSetMerger, selectStatement.getLimit()); } if (DatabaseType.Oracle == limit.getDatabaseType()) { return new RowNumberDecoratorResultSetMerger(resultSetMerger, selectStatement.getLimit()); } if (DatabaseType.SQLServer == limit.getDatabaseType()) { return new TopAndRowNumberDecoratorResultSetMerger(resultSetMerger, selectStatement.getLimit()); } return resultSetMerger; } } sharding-core/src/main/java/io/shardingjdbc/core/merger/MergeEngine.java 0 → 100644 +36 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import java.sql.SQLException; /** * result set merge engine. * * @author zhangliang */ public interface MergeEngine { /** * Merge result sets. * * @return merged result set. * @throws SQLException SQL exception */ ResultSetMerger merge() throws SQLException; } sharding-core/src/main/java/io/shardingjdbc/core/merger/QueryResult.java 0 → 100644 +45 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import java.sql.SQLException; /** * Query result form database. * * @author zhangliang */ public interface QueryResult extends ResultSetMerger { /** * Get column count. * * @return column count * @throws SQLException SQL Exception */ int getColumnCount() throws SQLException; /** * Get column label. * * @param columnIndex column index * @return column label * @throws SQLException SQL Exception */ String getColumnLabel(int columnIndex) throws SQLException; } sharding-core/src/main/java/io/shardingjdbc/core/merger/ResultSetMerger.java 0 → 100644 +108 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import java.io.InputStream; import java.sql.SQLException; import java.util.Calendar; /** * ResultSet merger interface. * * @author zhangliang */ public interface ResultSetMerger { /** * iterate next data. * * @return has next data * @throws SQLException SQL Exception */ boolean next() throws SQLException; /** * Get data value. * * @param columnIndex column index * @param type class type of data value * @return data value * @throws SQLException SQL Exception */ Object getValue(int columnIndex, Class<?> type) throws SQLException; /** * Get data value. * * @param columnLabel column label * @param type class type of data value * @return data value * @throws SQLException SQL Exception */ Object getValue(String columnLabel, Class<?> type) throws SQLException; /** * Get calendar value. * * @param columnIndex column index * @param type class type of data value * @param calendar calendar * @return calendar value * @throws SQLException SQL Exception */ Object getCalendarValue(int columnIndex, Class<?> type, Calendar calendar) throws SQLException; /** * Get calendar value. * * @param columnLabel column label * @param type class type of data value * @param calendar calendar * @return calendar value * @throws SQLException SQL Exception */ Object getCalendarValue(String columnLabel, Class<?> type, Calendar calendar) throws SQLException; /** * Get InputStream. * * @param columnIndex column index * @param type class type of data value * @return InputStream * @throws SQLException SQL Exception */ InputStream getInputStream(int columnIndex, String type) throws SQLException; /** * Get InputStream. * * @param columnLabel column label * @param type class type of data value * @return InputStream * @throws SQLException SQL Exception */ InputStream getInputStream(String columnLabel, String type) throws SQLException; /** * Adjust ResultSet is null or not. * * @return ResultSet is null or not * @throws SQLException SQL Exception */ boolean wasNull() throws SQLException; } Loading
sharding-core/src/main/java/io/shardingjdbc/core/merger/DALMergeEngine.java 0 → 100644 +61 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import io.shardingjdbc.core.merger.show.ShowCreateTableResultSetMerger; import io.shardingjdbc.core.merger.show.ShowDatabasesResultSetMerger; import io.shardingjdbc.core.merger.show.ShowOtherResultSetMerger; import io.shardingjdbc.core.merger.show.ShowTablesResultSetMerger; import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowCreateTableStatement; import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowDatabasesStatement; import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowTablesStatement; import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement; import io.shardingjdbc.core.rule.ShardingRule; import lombok.RequiredArgsConstructor; import java.sql.SQLException; import java.util.List; /** * DAL result set merge engine. * * @author zhangliang */ @RequiredArgsConstructor public final class DALMergeEngine implements MergeEngine { private final ShardingRule shardingRule; private final List<QueryResult> queryResults; private final DALStatement dalStatement; @Override public ResultSetMerger merge() throws SQLException { if (dalStatement instanceof ShowDatabasesStatement) { return new ShowDatabasesResultSetMerger(); } if (dalStatement instanceof ShowTablesStatement) { return new ShowTablesResultSetMerger(shardingRule, queryResults); } if (dalStatement instanceof ShowCreateTableStatement) { return new ShowCreateTableResultSetMerger(shardingRule, queryResults); } return new ShowOtherResultSetMerger(queryResults.get(0)); } }
sharding-core/src/main/java/io/shardingjdbc/core/merger/DQLMergeEngine.java 0 → 100644 +100 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import io.shardingjdbc.core.constant.DatabaseType; import io.shardingjdbc.core.merger.groupby.GroupByMemoryResultSetMerger; import io.shardingjdbc.core.merger.groupby.GroupByStreamResultSetMerger; import io.shardingjdbc.core.merger.iterator.IteratorStreamResultSetMerger; import io.shardingjdbc.core.merger.orderby.OrderByStreamResultSetMerger; import io.shardingjdbc.core.merger.pagination.LimitDecoratorResultSetMerger; import io.shardingjdbc.core.merger.pagination.RowNumberDecoratorResultSetMerger; import io.shardingjdbc.core.merger.pagination.TopAndRowNumberDecoratorResultSetMerger; import io.shardingjdbc.core.parsing.parser.context.limit.Limit; import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement; import io.shardingjdbc.core.util.SQLUtil; import java.sql.SQLException; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * DQL result set merge engine. * * @author zhangliang */ public final class DQLMergeEngine implements MergeEngine { private final List<QueryResult> queryResults; private final SelectStatement selectStatement; private final Map<String, Integer> columnLabelIndexMap; public DQLMergeEngine(final List<QueryResult> queryResults, final SelectStatement selectStatement) throws SQLException { this.queryResults = queryResults; this.selectStatement = selectStatement; columnLabelIndexMap = getColumnLabelIndexMap(queryResults.get(0)); } private Map<String, Integer> getColumnLabelIndexMap(final QueryResult queryResult) throws SQLException { Map<String, Integer> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (int i = 1; i <= queryResult.getColumnCount(); i++) { result.put(SQLUtil.getExactlyValue(queryResult.getColumnLabel(i)), i); } return result; } @Override public ResultSetMerger merge() throws SQLException { selectStatement.setIndexForItems(columnLabelIndexMap); return decorate(build()); } private ResultSetMerger build() throws SQLException { if (!selectStatement.getGroupByItems().isEmpty() || !selectStatement.getAggregationSelectItems().isEmpty()) { if (selectStatement.isSameGroupByAndOrderByItems()) { return new GroupByStreamResultSetMerger(columnLabelIndexMap, queryResults, selectStatement); } else { return new GroupByMemoryResultSetMerger(columnLabelIndexMap, queryResults, selectStatement); } } if (!selectStatement.getOrderByItems().isEmpty()) { return new OrderByStreamResultSetMerger(queryResults, selectStatement.getOrderByItems()); } return new IteratorStreamResultSetMerger(queryResults); } private ResultSetMerger decorate(final ResultSetMerger resultSetMerger) throws SQLException { Limit limit = selectStatement.getLimit(); if (null == limit) { return resultSetMerger; } if (DatabaseType.MySQL == limit.getDatabaseType() || DatabaseType.PostgreSQL == limit.getDatabaseType() || DatabaseType.H2 == limit.getDatabaseType()) { return new LimitDecoratorResultSetMerger(resultSetMerger, selectStatement.getLimit()); } if (DatabaseType.Oracle == limit.getDatabaseType()) { return new RowNumberDecoratorResultSetMerger(resultSetMerger, selectStatement.getLimit()); } if (DatabaseType.SQLServer == limit.getDatabaseType()) { return new TopAndRowNumberDecoratorResultSetMerger(resultSetMerger, selectStatement.getLimit()); } return resultSetMerger; } }
sharding-core/src/main/java/io/shardingjdbc/core/merger/MergeEngine.java 0 → 100644 +36 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import java.sql.SQLException; /** * result set merge engine. * * @author zhangliang */ public interface MergeEngine { /** * Merge result sets. * * @return merged result set. * @throws SQLException SQL exception */ ResultSetMerger merge() throws SQLException; }
sharding-core/src/main/java/io/shardingjdbc/core/merger/QueryResult.java 0 → 100644 +45 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import java.sql.SQLException; /** * Query result form database. * * @author zhangliang */ public interface QueryResult extends ResultSetMerger { /** * Get column count. * * @return column count * @throws SQLException SQL Exception */ int getColumnCount() throws SQLException; /** * Get column label. * * @param columnIndex column index * @return column label * @throws SQLException SQL Exception */ String getColumnLabel(int columnIndex) throws SQLException; }
sharding-core/src/main/java/io/shardingjdbc/core/merger/ResultSetMerger.java 0 → 100644 +108 −0 Original line number Diff line number Diff line /* * Copyright 1999-2015 dangdang.com. * <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> */ package io.shardingjdbc.core.merger; import java.io.InputStream; import java.sql.SQLException; import java.util.Calendar; /** * ResultSet merger interface. * * @author zhangliang */ public interface ResultSetMerger { /** * iterate next data. * * @return has next data * @throws SQLException SQL Exception */ boolean next() throws SQLException; /** * Get data value. * * @param columnIndex column index * @param type class type of data value * @return data value * @throws SQLException SQL Exception */ Object getValue(int columnIndex, Class<?> type) throws SQLException; /** * Get data value. * * @param columnLabel column label * @param type class type of data value * @return data value * @throws SQLException SQL Exception */ Object getValue(String columnLabel, Class<?> type) throws SQLException; /** * Get calendar value. * * @param columnIndex column index * @param type class type of data value * @param calendar calendar * @return calendar value * @throws SQLException SQL Exception */ Object getCalendarValue(int columnIndex, Class<?> type, Calendar calendar) throws SQLException; /** * Get calendar value. * * @param columnLabel column label * @param type class type of data value * @param calendar calendar * @return calendar value * @throws SQLException SQL Exception */ Object getCalendarValue(String columnLabel, Class<?> type, Calendar calendar) throws SQLException; /** * Get InputStream. * * @param columnIndex column index * @param type class type of data value * @return InputStream * @throws SQLException SQL Exception */ InputStream getInputStream(int columnIndex, String type) throws SQLException; /** * Get InputStream. * * @param columnLabel column label * @param type class type of data value * @return InputStream * @throws SQLException SQL Exception */ InputStream getInputStream(String columnLabel, String type) throws SQLException; /** * Adjust ResultSet is null or not. * * @return ResultSet is null or not * @throws SQLException SQL Exception */ boolean wasNull() throws SQLException; }