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

Add ShardingSphereResultSetMetaData to process all ResultSetMetaData (#5320)

* Add TablesAggregationRule.findLogicTableByActualTable()

* use rules in ShardingResultSetMetaData

* rename ShardingResultSetMetaData to ShardingSphereResultSetMetaData

* remove EncryptResultSetMetaData
上级 5fa41c05
......@@ -396,4 +396,9 @@ public class ShardingRule implements TablesAggregationRule {
public final boolean isNeedAccumulate(final Collection<String> tables) {
return !isAllBroadcastTables(tables);
}
@Override
public final Optional<String> findLogicTableByActualTable(final String actualTable) {
return findTableRuleByActualTable(actualTable).map(TableRule::getLogicTable);
}
}
......@@ -105,6 +105,16 @@ public final class ShardingRuleTest {
assertFalse(createMaximumShardingRule().findTableRuleByActualTable("table_3").isPresent());
}
@Test
public void assertFindLogicTableByActualTable() {
assertTrue(createMaximumShardingRule().findLogicTableByActualTable("table_0").isPresent());
}
@Test
public void assertNotFindLogicTableByActualTable() {
assertFalse(createMaximumShardingRule().findLogicTableByActualTable("table_3").isPresent());
}
@Test
public void assertGetTableRuleWithShardingTable() {
TableRule actual = createMaximumShardingRule().getTableRule("Logic_Table");
......
......@@ -22,7 +22,7 @@ import lombok.Getter;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.executor.ForceExecuteTemplate;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.ShardingConnection;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset.ShardingResultSetMetaData;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset.ShardingSphereResultSetMetaData;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingStatement;
import org.apache.shardingsphere.shardingjdbc.jdbc.unsupported.AbstractUnsupportedOperationResultSet;
......@@ -62,7 +62,7 @@ public abstract class AbstractResultSetAdapter extends AbstractUnsupportedOperat
@Override
public final ResultSetMetaData getMetaData() throws SQLException {
return new ShardingResultSetMetaData(resultSets.get(0).getMetaData(), getShardingRule(), executionContext.getSqlStatementContext());
return new ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(), getShardingRule().toRules(), executionContext.getSqlStatementContext());
}
private ShardingRule getShardingRule() {
......
......@@ -19,7 +19,6 @@ package org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset;
import lombok.EqualsAndHashCode;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.core.rule.TableRule;
import org.apache.shardingsphere.shardingjdbc.jdbc.unsupported.AbstractUnsupportedDatabaseMetaDataResultSet;
import org.apache.shardingsphere.underlying.common.rule.BaseRule;
......@@ -100,7 +99,7 @@ public final class DatabaseMetaDataResultSet<T extends BaseRule> extends Abstrac
for (int i = 1; i <= columnLabelIndexMap.size(); i++) {
if (tableNameColumnIndex == i) {
String tableName = resultSet.getString(i);
Optional<String> logicTableName = rule instanceof ShardingRule ? ((ShardingRule) rule).findTableRuleByActualTable(tableName).map(TableRule::getLogicTable) : Optional.empty();
Optional<String> logicTableName = rule instanceof ShardingRule ? ((ShardingRule) rule).findLogicTableByActualTable(tableName) : Optional.empty();
result.addObject(logicTableName.orElse(tableName));
} else if (indexNameColumnIndex == i) {
String tableName = resultSet.getString(tableNameColumnIndex);
......
......@@ -49,6 +49,8 @@ import java.util.TreeMap;
*/
public final class EncryptResultSet extends AbstractUnsupportedOperationResultSet {
private final EncryptRuntimeContext runtimeContext;
private final SQLStatementContext sqlStatementContext;
private final Statement encryptStatement;
......@@ -61,6 +63,7 @@ public final class EncryptResultSet extends AbstractUnsupportedOperationResultSe
public EncryptResultSet(final EncryptRuntimeContext encryptRuntimeContext,
final SQLStatementContext sqlStatementContext, final Statement encryptStatement, final ResultSet resultSet) throws SQLException {
runtimeContext = encryptRuntimeContext;
this.sqlStatementContext = sqlStatementContext;
this.encryptStatement = encryptStatement;
originalResultSet = resultSet;
......@@ -444,7 +447,7 @@ public final class EncryptResultSet extends AbstractUnsupportedOperationResultSe
@Override
public ResultSetMetaData getMetaData() throws SQLException {
return new EncryptResultSetMetaData(originalResultSet.getMetaData(), sqlStatementContext);
return new ShardingSphereResultSetMetaData(originalResultSet.getMetaData(), runtimeContext.getRules(), sqlStatementContext);
}
@Override
......
/*
* 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.shardingjdbc.jdbc.core.resultset;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.WrapperAdapter;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.constant.SQLExceptionConstant;
import org.apache.shardingsphere.sql.parser.binder.segment.select.projection.Projection;
import org.apache.shardingsphere.sql.parser.binder.segment.select.projection.impl.ColumnProjection;
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.sql.parser.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.underlying.common.database.DefaultSchema;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;
/**
* Encrypt result set meta data.
*/
@RequiredArgsConstructor
public final class EncryptResultSetMetaData extends WrapperAdapter implements ResultSetMetaData {
private final ResultSetMetaData resultSetMetaData;
private final SQLStatementContext sqlStatementContext;
@Override
public int getColumnCount() {
return sqlStatementContext instanceof SelectStatementContext ? ((SelectStatementContext) sqlStatementContext).getProjectionsContext().getExpandProjections().size() : 0;
}
@Override
public boolean isAutoIncrement(final int column) throws SQLException {
return resultSetMetaData.isAutoIncrement(column);
}
@Override
public boolean isCaseSensitive(final int column) throws SQLException {
return resultSetMetaData.isCaseSensitive(column);
}
@Override
public boolean isSearchable(final int column) throws SQLException {
return resultSetMetaData.isSearchable(column);
}
@Override
public boolean isCurrency(final int column) throws SQLException {
return resultSetMetaData.isCurrency(column);
}
@Override
public int isNullable(final int column) throws SQLException {
return resultSetMetaData.isNullable(column);
}
@Override
public boolean isSigned(final int column) throws SQLException {
return resultSetMetaData.isSigned(column);
}
@Override
public int getColumnDisplaySize(final int column) throws SQLException {
return resultSetMetaData.getColumnDisplaySize(column);
}
@Override
public String getColumnLabel(final int column) throws SQLException {
return resultSetMetaData.getColumnLabel(column);
}
@Override
public String getColumnName(final int column) throws SQLException {
if (sqlStatementContext instanceof SelectStatementContext) {
List<Projection> actualProjections = ((SelectStatementContext) sqlStatementContext).getProjectionsContext().getExpandProjections();
if (column > actualProjections.size()) {
throw new SQLException(SQLExceptionConstant.COLUMN_INDEX_OUT_OF_RANGE, SQLExceptionConstant.OUT_OF_INDEX_SQL_STATE, 0);
}
Projection projection = ((SelectStatementContext) sqlStatementContext).getProjectionsContext().getExpandProjections().get(column - 1);
if (projection instanceof ColumnProjection) {
return ((ColumnProjection) projection).getName();
}
}
return resultSetMetaData.getColumnName(column);
}
@Override
public String getSchemaName(final int column) {
return DefaultSchema.LOGIC_NAME;
}
@Override
public int getPrecision(final int column) throws SQLException {
return resultSetMetaData.getPrecision(column);
}
@Override
public int getScale(final int column) throws SQLException {
return resultSetMetaData.getScale(column);
}
@Override
public String getTableName(final int column) throws SQLException {
return resultSetMetaData.getTableName(column);
}
@Override
public String getCatalogName(final int column) {
return DefaultSchema.LOGIC_NAME;
}
@Override
public int getColumnType(final int column) throws SQLException {
return resultSetMetaData.getColumnType(column);
}
@Override
public String getColumnTypeName(final int column) throws SQLException {
return resultSetMetaData.getColumnTypeName(column);
}
@Override
public boolean isReadOnly(final int column) throws SQLException {
return resultSetMetaData.isReadOnly(column);
}
@Override
public boolean isWritable(final int column) throws SQLException {
return resultSetMetaData.isWritable(column);
}
@Override
public boolean isDefinitelyWritable(final int column) throws SQLException {
return resultSetMetaData.isDefinitelyWritable(column);
}
@Override
public String getColumnClassName(final int column) throws SQLException {
return resultSetMetaData.getColumnClassName(column);
}
}
......@@ -18,8 +18,6 @@
package org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.core.rule.TableRule;
import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.WrapperAdapter;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.constant.SQLExceptionConstant;
import org.apache.shardingsphere.sql.parser.binder.segment.select.projection.Projection;
......@@ -27,20 +25,24 @@ import org.apache.shardingsphere.sql.parser.binder.segment.select.projection.imp
import org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.sql.parser.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.underlying.common.database.DefaultSchema;
import org.apache.shardingsphere.underlying.common.rule.BaseRule;
import org.apache.shardingsphere.underlying.common.rule.TablesAggregationRule;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
/**
* Sharding result set meta data.
* ShardingSphere result set meta data.
*/
@RequiredArgsConstructor
public final class ShardingResultSetMetaData extends WrapperAdapter implements ResultSetMetaData {
public final class ShardingSphereResultSetMetaData extends WrapperAdapter implements ResultSetMetaData {
private final ResultSetMetaData resultSetMetaData;
private final ShardingRule shardingRule;
private final Collection<BaseRule> rules;
private final SQLStatementContext sqlStatementContext;
......@@ -122,7 +124,8 @@ public final class ShardingResultSetMetaData extends WrapperAdapter implements R
@Override
public String getTableName(final int column) throws SQLException {
String actualTableName = resultSetMetaData.getTableName(column);
return shardingRule.findTableRuleByActualTable(actualTableName).map(TableRule::getLogicTable).orElse(actualTableName);
Optional<BaseRule> rule = rules.stream().filter(each -> each instanceof TablesAggregationRule).findFirst();
return rule.isPresent() ? ((TablesAggregationRule) rule.get()).findLogicTableByActualTable(actualTableName).orElse(actualTableName) : actualTableName;
}
@Override
......
......@@ -18,7 +18,6 @@
package org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.core.rule.TableRule;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
......@@ -31,7 +30,6 @@ import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.Optional;
import static org.hamcrest.CoreMatchers.is;
......@@ -110,7 +108,7 @@ public final class DatabaseMetaDataResultSetTest {
private ShardingRule mockShardingRule() {
ShardingRule result = mock(ShardingRule.class);
when(result.findTableRuleByActualTable(ACTUAL_TABLE_NAME)).thenReturn(Optional.of(new TableRule(Collections.emptyList(), LOGIC_TABLE_NAME)));
when(result.findLogicTableByActualTable(ACTUAL_TABLE_NAME)).thenReturn(Optional.of(LOGIC_TABLE_NAME));
return result;
}
......
......@@ -18,7 +18,6 @@
package org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.core.rule.TableRule;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.ShardingConnection;
import org.apache.shardingsphere.shardingjdbc.jdbc.core.context.impl.ShardingRuntimeContext;
......@@ -98,7 +97,7 @@ public final class ShardingResultSetTest {
ShardingConnection shardingConnection = mock(ShardingConnection.class);
ShardingRuntimeContext runtimeContext = mock(ShardingRuntimeContext.class);
ShardingRule shardingRule = mock(ShardingRule.class);
when(shardingRule.findTableRuleByActualTable(anyString())).thenReturn(Optional.of(new TableRule(Collections.emptyList(), "test")));
when(shardingRule.findLogicTableByActualTable(anyString())).thenReturn(Optional.of("test"));
EncryptRule encryptRule = mock(EncryptRule.class);
when(encryptRule.findEncryptor(anyString(), anyString())).thenReturn(Optional.empty());
when(shardingRule.getEncryptRule()).thenReturn(encryptRule);
......
......@@ -19,7 +19,6 @@ package org.apache.shardingsphere.shardingproxy.backend.response.query;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.shardingsphere.core.rule.TableRule;
import org.apache.shardingsphere.shardingproxy.backend.schema.LogicSchema;
import org.apache.shardingsphere.shardingproxy.backend.schema.impl.ShardingSchema;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
......@@ -79,7 +78,7 @@ public final class QueryHeader {
autoIncrement = resultSetMetaData.isAutoIncrement(columnIndex);
String actualTableName = resultSetMetaData.getTableName(columnIndex);
if (null != actualTableName && logicSchema instanceof ShardingSchema) {
table = logicSchema.getShardingRule().findTableRuleByActualTable(actualTableName).map(TableRule::getLogicTable).orElse("");
table = logicSchema.getShardingRule().findLogicTableByActualTable(actualTableName).orElse("");
TableMetaData tableMetaData = logicSchema.getMetaData().getSchema().getConfiguredSchemaMetaData().get(table);
primaryKey = null != tableMetaData && tableMetaData.getColumns().get(resultSetMetaData.getColumnName(columnIndex).toLowerCase()).isPrimaryKey();
} else {
......
......@@ -19,18 +19,17 @@ package org.apache.shardingsphere.shardingproxy.backend.response.query;
import lombok.SneakyThrows;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.core.rule.TableRule;
import org.apache.shardingsphere.shardingproxy.backend.schema.impl.ShardingSchema;
import org.apache.shardingsphere.underlying.common.database.metadata.DataSourceMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.index.IndexMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.segment.select.projection.ProjectionsContext;
import org.apache.shardingsphere.sql.parser.binder.segment.select.projection.impl.ColumnProjection;
import org.apache.shardingsphere.sql.parser.binder.segment.select.projection.impl.ExpressionProjection;
import org.apache.shardingsphere.underlying.common.database.metadata.DataSourceMetaData;
import org.apache.shardingsphere.underlying.common.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.column.ColumnMetaData;
import org.apache.shardingsphere.underlying.common.metadata.datasource.DataSourceMetas;
import org.apache.shardingsphere.sql.parser.binder.metadata.table.TableMetaData;
import org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaData;
import org.apache.shardingsphere.underlying.common.metadata.schema.RuleSchemaMetaData;
import org.junit.Test;
......@@ -141,7 +140,7 @@ public final class QueryHeaderTest {
when(metaData.getDataSources()).thenReturn(dataSourceMetas);
when(result.getMetaData()).thenReturn(metaData);
ShardingRule shardingRule = mock(ShardingRule.class);
when(shardingRule.findTableRuleByActualTable("t_order")).thenReturn(Optional.of(new TableRule(Collections.emptyList(), "t_logic_order")));
when(shardingRule.findLogicTableByActualTable("t_order")).thenReturn(Optional.of("t_logic_order"));
when(result.getShardingRule()).thenReturn(shardingRule);
when(result.getName()).thenReturn("sharding_schema");
return result;
......
......@@ -18,6 +18,7 @@
package org.apache.shardingsphere.underlying.common.rule;
import java.util.Collection;
import java.util.Optional;
/**
* Tables aggregation rule.
......@@ -38,4 +39,12 @@ public interface TablesAggregationRule extends BaseRule {
* @return need accumulate
*/
boolean isNeedAccumulate(Collection<String> tables);
/**
* Find logic table name via actual table name.
*
* @param actualTable actual table name
* @return logic table name
*/
Optional<String> findLogicTableByActualTable(String actualTable);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册