From ab325a0ff50bedc37a1bef92d2ef8c13ad2d3237 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Thu, 12 Nov 2020 07:07:11 +0800 Subject: [PATCH] Remove EncryptColumnMetaData (#8140) * Decouple EncryptColumnMetaData * Remove EncryptColumnMetaData --- .../metadata/EncryptColumnMetaData.java | 46 ------ .../metadata/EncryptTableMetaDataBuilder.java | 7 +- .../merge/dal/EncryptDALResultDecorator.java | 14 +- .../DecoratedEncryptColumnsMergedResult.java | 6 +- .../dal/impl/EncryptColumnsMergedResult.java | 62 ++------ .../MergedEncryptColumnsMergedResult.java | 6 +- .../merge/dql/EncryptDQLResultDecorator.java | 8 +- .../dal/EncryptDALResultDecoratorTest.java | 24 +-- .../MergedEncryptColumnsMergedResultTest.java | 62 ++++---- ...coratedEncryptColumnsMergedResultTest.java | 4 +- .../dql/EncryptDQLResultDecoratorTest.java | 20 +-- .../EncryptColumnsMergedResultFixture.java | 6 +- .../impl/EncryptColumnsMergedResultTest.java | 137 ------------------ .../metadata/schema/model/ColumnMetaData.java | 2 +- .../infra/merge/MergeEngine.java | 4 +- .../engine/decorator/ResultDecorator.java | 16 +- .../impl/TransparentResultDecorator.java | 9 +- .../decorator/impl/TransparentRule.java | 26 ++++ .../impl/TransparentResultDecoratorTest.java | 7 +- .../decorator/ResultDecoratorFixture.java | 10 +- 20 files changed, 136 insertions(+), 340 deletions(-) delete mode 100644 shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-common/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptColumnMetaData.java delete mode 100644 shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/impl/EncryptColumnsMergedResultTest.java create mode 100644 shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentRule.java diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-common/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptColumnMetaData.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-common/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptColumnMetaData.java deleted file mode 100644 index ad2fc15adb..0000000000 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-common/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptColumnMetaData.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.encrypt.metadata; - -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; -import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData; - -/** - * Column meta data for encrypt. - */ -@Getter -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public final class EncryptColumnMetaData extends ColumnMetaData { - - private final String cipherColumnName; - - private final String plainColumnName; - - private final String assistedQueryColumnName; - - public EncryptColumnMetaData(final String name, final int dataType, final String dataTypeName, final boolean primaryKey, - final String cipherColumnName, final String plainColumnName, final String assistedQueryColumnName) { - super(name, dataType, dataTypeName, primaryKey, false, false); - this.cipherColumnName = cipherColumnName; - this.plainColumnName = plainColumnName; - this.assistedQueryColumnName = assistedQueryColumnName; - } -} diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-common/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptTableMetaDataBuilder.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-common/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptTableMetaDataBuilder.java index 98fc95a13d..0fa55d3447 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-common/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptTableMetaDataBuilder.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-common/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptTableMetaDataBuilder.java @@ -67,11 +67,8 @@ public final class EncryptTableMetaDataBuilder implements RuleBasedTableMetaData return originalColumnMetaData; } String logicColumnName = encryptRule.getLogicColumnOfCipher(tableName, originalColumnMetaData.getName()); - String plainColumnName = encryptRule.findPlainColumn(tableName, logicColumnName).orElse(null); - String assistedQueryColumnName = encryptRule.findAssistedQueryColumn(tableName, logicColumnName).orElse(null); - return new EncryptColumnMetaData( - logicColumnName, originalColumnMetaData.getDataType(), originalColumnMetaData.getDataTypeName(), originalColumnMetaData.isPrimaryKey(), originalColumnMetaData.getName(), - plainColumnName, assistedQueryColumnName); + return new ColumnMetaData(logicColumnName, originalColumnMetaData.getDataType(), + originalColumnMetaData.getDataTypeName(), originalColumnMetaData.isPrimaryKey(), originalColumnMetaData.isGenerated(), originalColumnMetaData.isCaseSensitive()); } @Override diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java index 780bb047ea..46e056f2cd 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java @@ -19,12 +19,12 @@ package org.apache.shardingsphere.encrypt.merge.dal; import org.apache.shardingsphere.encrypt.merge.dal.impl.DecoratedEncryptColumnsMergedResult; import org.apache.shardingsphere.encrypt.merge.dal.impl.MergedEncryptColumnsMergedResult; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLDescribeStatement; import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowColumnsStatement; @@ -32,17 +32,17 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ /** * DAL result decorator for encrypt. */ -public final class EncryptDALResultDecorator implements ResultDecorator { +public final class EncryptDALResultDecorator implements ResultDecorator { @Override - public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { + public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final EncryptRule rule) { return isNeedMergeEncryptColumns(sqlStatementContext.getSqlStatement()) - ? new MergedEncryptColumnsMergedResult(queryResult, sqlStatementContext, schema) : new TransparentMergedResult(queryResult); + ? new MergedEncryptColumnsMergedResult(queryResult, sqlStatementContext, rule) : new TransparentMergedResult(queryResult); } @Override - public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { - return isNeedMergeEncryptColumns(sqlStatementContext.getSqlStatement()) ? new DecoratedEncryptColumnsMergedResult(mergedResult, sqlStatementContext, schema) : mergedResult; + public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final EncryptRule rule) { + return isNeedMergeEncryptColumns(sqlStatementContext.getSqlStatement()) ? new DecoratedEncryptColumnsMergedResult(mergedResult, sqlStatementContext, rule) : mergedResult; } private boolean isNeedMergeEncryptColumns(final SQLStatement sqlStatement) { diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/DecoratedEncryptColumnsMergedResult.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/DecoratedEncryptColumnsMergedResult.java index 0f4b51dc89..feacf17e55 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/DecoratedEncryptColumnsMergedResult.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/DecoratedEncryptColumnsMergedResult.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.encrypt.merge.dal.impl; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.merge.result.MergedResult; @@ -30,8 +30,8 @@ public final class DecoratedEncryptColumnsMergedResult extends EncryptColumnsMer private final MergedResult mergedResult; - public DecoratedEncryptColumnsMergedResult(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { - super(sqlStatementContext, schema); + public DecoratedEncryptColumnsMergedResult(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) { + super(sqlStatementContext, encryptRule); this.mergedResult = mergedResult; } diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/EncryptColumnsMergedResult.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/EncryptColumnsMergedResult.java index 748348df2f..b7ea91030d 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/EncryptColumnsMergedResult.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/EncryptColumnsMergedResult.java @@ -18,9 +18,8 @@ package org.apache.shardingsphere.encrypt.merge.dal.impl; import com.google.common.base.Preconditions; -import org.apache.shardingsphere.encrypt.metadata.EncryptColumnMetaData; -import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; +import org.apache.shardingsphere.encrypt.rule.EncryptTable; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.type.TableAvailable; import org.apache.shardingsphere.infra.merge.result.MergedResult; @@ -29,38 +28,35 @@ import java.io.InputStream; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.Calendar; -import java.util.Collection; -import java.util.LinkedList; -import java.util.Map.Entry; import java.util.Optional; -import java.util.stream.Collectors; /** * Encrypt column merged result. */ public abstract class EncryptColumnsMergedResult implements MergedResult { - private final ShardingSphereSchema schema; - private final String tableName; - protected EncryptColumnsMergedResult(final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { - this.schema = schema; + private final EncryptRule encryptRule; + + protected EncryptColumnsMergedResult(final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) { Preconditions.checkState(sqlStatementContext instanceof TableAvailable && 1 == ((TableAvailable) sqlStatementContext).getAllTables().size()); tableName = ((TableAvailable) sqlStatementContext).getAllTables().iterator().next().getTableName().getIdentifier().getValue(); + this.encryptRule = encryptRule; } @Override public final boolean next() throws SQLException { boolean hasNext = nextValue(); - if (hasNext && getTableEncryptColumnMetaDataList().isEmpty()) { + Optional encryptTable = encryptRule.findEncryptTable(tableName); + if (hasNext && !encryptTable.isPresent()) { return true; } if (!hasNext) { return false; } String columnName = getOriginalValue(1, String.class).toString(); - while (getAssistedQueryColumns().contains(columnName) || getPlainColumns().contains(columnName)) { + while (encryptTable.get().getAssistedQueryColumns().contains(columnName) || encryptTable.get().getPlainColumns().contains(columnName)) { hasNext = nextValue(); if (!hasNext) { return false; @@ -70,48 +66,20 @@ public abstract class EncryptColumnsMergedResult implements MergedResult { return true; } - private Collection getAssistedQueryColumns() { - return getTableEncryptColumnMetaDataList().stream().map(EncryptColumnMetaData::getAssistedQueryColumnName) - .collect(Collectors.toList()); - } - - private Collection getPlainColumns() { - return getTableEncryptColumnMetaDataList().stream().map(EncryptColumnMetaData::getPlainColumnName) - .collect(Collectors.toList()); - } - - private Collection getTableEncryptColumnMetaDataList() { - Collection result = new LinkedList<>(); - for (Entry entry : schema.get(tableName).getColumns().entrySet()) { - if (entry.getValue() instanceof EncryptColumnMetaData) { - result.add((EncryptColumnMetaData) entry.getValue()); - } - } - return result; - } - @Override public final Object getValue(final int columnIndex, final Class type) throws SQLException { if (1 == columnIndex) { String columnName = getOriginalValue(1, type).toString(); - Optional logicColumn = getLogicColumnOfCipher(columnName); + Optional encryptTable = encryptRule.findEncryptTable(tableName); + if (!encryptTable.isPresent()) { + return columnName; + } + Optional logicColumn = encryptTable.get().isCipherColumn(columnName) ? Optional.of(encryptTable.get().getLogicColumn(columnName)) : Optional.empty(); return logicColumn.orElse(columnName); } return getOriginalValue(columnIndex, type); } - - private Optional getLogicColumnOfCipher(final String cipherColumn) { - for (Entry entry : schema.get(tableName).getColumns().entrySet()) { - if (entry.getValue() instanceof EncryptColumnMetaData) { - EncryptColumnMetaData encryptColumnMetaData = (EncryptColumnMetaData) entry.getValue(); - if (encryptColumnMetaData.getCipherColumnName().equalsIgnoreCase(cipherColumn)) { - return Optional.of(entry.getKey()); - } - } - } - return Optional.empty(); - } - + @Override public final Object getCalendarValue(final int columnIndex, final Class type, final Calendar calendar) throws SQLException { throw new SQLFeatureNotSupportedException(""); diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/MergedEncryptColumnsMergedResult.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/MergedEncryptColumnsMergedResult.java index 5d81088c3c..2977a63edb 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/MergedEncryptColumnsMergedResult.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/impl/MergedEncryptColumnsMergedResult.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.encrypt.merge.dal.impl; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; @@ -30,8 +30,8 @@ public final class MergedEncryptColumnsMergedResult extends EncryptColumnsMerged private final QueryResult queryResult; - public MergedEncryptColumnsMergedResult(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { - super(sqlStatementContext, schema); + public MergedEncryptColumnsMergedResult(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) { + super(sqlStatementContext, encryptRule); this.queryResult = queryResult; } diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java index 4309f856f2..7ca5e994b1 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.encrypt.merge.dql; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; @@ -29,19 +29,19 @@ import org.apache.shardingsphere.infra.merge.result.impl.transparent.Transparent * DQL result decorator for encrypt. */ @RequiredArgsConstructor -public final class EncryptDQLResultDecorator implements ResultDecorator { +public final class EncryptDQLResultDecorator implements ResultDecorator { private final EncryptAlgorithmMetaData metaData; private final boolean queryWithCipherColumn; @Override - public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { + public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final EncryptRule rule) { return new EncryptMergedResult(metaData, new TransparentMergedResult(queryResult), queryWithCipherColumn); } @Override - public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { + public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final EncryptRule rule) { return new EncryptMergedResult(metaData, mergedResult, queryWithCipherColumn); } } diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java index 433b5d7e00..6a61c7b3d4 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java @@ -19,18 +19,19 @@ package org.apache.shardingsphere.encrypt.merge.dal; import org.apache.shardingsphere.encrypt.merge.dal.impl.DecoratedEncryptColumnsMergedResult; import org.apache.shardingsphere.encrypt.merge.dal.impl.MergedEncryptColumnsMergedResult; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.statement.dal.DescribeStatementContext; +import org.apache.shardingsphere.infra.binder.statement.dal.ShowColumnsStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; -import org.apache.shardingsphere.infra.binder.statement.dal.DescribeStatementContext; -import org.apache.shardingsphere.infra.binder.statement.dal.ShowColumnsStatementContext; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue; import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLDescribeStatement; import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowColumnsStatement; -import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -48,6 +49,9 @@ public final class EncryptDALResultDecoratorTest { @Mock private ShardingSphereSchema schema; + + @Mock + private EncryptRule rule; @Mock private SQLStatementContext sqlStatementContext; @@ -57,8 +61,8 @@ public final class EncryptDALResultDecoratorTest { schema = mock(ShardingSphereSchema.class); sqlStatementContext = getDescribeStatementContext(); EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator(); - assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, schema), instanceOf(MergedEncryptColumnsMergedResult.class)); - assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, schema), instanceOf(DecoratedEncryptColumnsMergedResult.class)); + assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, rule), instanceOf(MergedEncryptColumnsMergedResult.class)); + assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, rule), instanceOf(DecoratedEncryptColumnsMergedResult.class)); } @Test @@ -66,8 +70,8 @@ public final class EncryptDALResultDecoratorTest { schema = mock(ShardingSphereSchema.class); sqlStatementContext = getShowColumnsStatementContext(); EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator(); - assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, schema), instanceOf(MergedEncryptColumnsMergedResult.class)); - assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, schema), instanceOf(DecoratedEncryptColumnsMergedResult.class)); + assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, rule), instanceOf(MergedEncryptColumnsMergedResult.class)); + assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, rule), instanceOf(DecoratedEncryptColumnsMergedResult.class)); } @Test @@ -75,8 +79,8 @@ public final class EncryptDALResultDecoratorTest { schema = mock(ShardingSphereSchema.class); sqlStatementContext = mock(SQLStatementContext.class); EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator(); - assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, schema), instanceOf(TransparentMergedResult.class)); - assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, schema), instanceOf(MergedResult.class)); + assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, rule), instanceOf(TransparentMergedResult.class)); + assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, rule), instanceOf(MergedResult.class)); } private SQLStatementContext getDescribeStatementContext() { diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/MergedEncryptColumnsMergedResultTest.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/MergedEncryptColumnsMergedResultTest.java index e996e7abb7..0e278afa10 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/MergedEncryptColumnsMergedResultTest.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/MergedEncryptColumnsMergedResultTest.java @@ -18,11 +18,10 @@ package org.apache.shardingsphere.encrypt.merge.dal; import org.apache.shardingsphere.encrypt.merge.dal.impl.MergedEncryptColumnsMergedResult; -import org.apache.shardingsphere.encrypt.metadata.EncryptColumnMetaData; -import org.apache.shardingsphere.infra.executor.sql.QueryResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; +import org.apache.shardingsphere.encrypt.rule.EncryptTable; import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext; +import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment; import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue; @@ -32,10 +31,8 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.sql.SQLException; -import java.sql.Types; import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.Optional; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertFalse; @@ -51,71 +48,62 @@ public final class MergedEncryptColumnsMergedResultTest { private QueryResult queryResult; @Test - public void assertNextWithTableEncryptColumnMetaDataListEmpty() throws SQLException { - when(queryResult.next()).thenReturn(true); - TableMetaData tableMetaData = new TableMetaData(Collections.emptyList(), Collections.emptyList()); - Map tables = new HashMap<>(1, 1); - tables.put("test", tableMetaData); - assertTrue(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).next()); + public void assertNextWithNotHasNext() throws SQLException { + assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).next()); } @Test public void assertNextWithHasNext() throws SQLException { - assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mock(ShardingSphereSchema.class)).next()); + when(queryResult.next()).thenReturn(true); + assertTrue(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).next()); } @Test public void assertNextWithAssistedQuery() throws SQLException { when(queryResult.next()).thenReturn(true).thenReturn(false); when(queryResult.getValue(1, String.class)).thenReturn("assistedQuery"); - EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("id", Types.VARCHAR, "varchar", true, "cipher", "plain", "assistedQuery"); - TableMetaData tableMetaData = new TableMetaData(Collections.singletonList(encryptColumnMetaData), Collections.emptyList()); - Map tables = new HashMap<>(1, 1); - tables.put("test", tableMetaData); - assertFalse(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).next()); + assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule()).next()); } @Test public void assertGetValueWithCipherColumn() throws SQLException { when(queryResult.getValue(1, String.class)).thenReturn("cipher"); - EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("id", Types.VARCHAR, "varchar", true, "cipher", "plain", "assistedQuery"); - TableMetaData tableMetaData = new TableMetaData(Collections.singletonList(encryptColumnMetaData), Collections.emptyList()); - Map tables = new HashMap<>(1); - tables.put("test", tableMetaData); - assertThat(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).getValue(1, String.class), is("id")); + assertThat(createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule()).getValue(1, String.class), is("id")); + } + + private EncryptRule mockEncryptRule() { + EncryptRule encryptRule = mock(EncryptRule.class); + EncryptTable encryptTable = mock(EncryptTable.class); + when(encryptRule.findEncryptTable("test")).thenReturn(Optional.of(encryptTable)); + when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.singleton("assistedQuery")); + when(encryptTable.isCipherColumn("cipher")).thenReturn(true); + when(encryptTable.getLogicColumn("cipher")).thenReturn("id"); + return encryptRule; } @Test public void assertGetValueWithOtherColumn() throws SQLException { when(queryResult.getValue(1, String.class)).thenReturn("assistedQuery"); - EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("id", Types.VARCHAR, "varchar", true, "cipher", "plain", "assistedQuery"); - TableMetaData tableMetaData = new TableMetaData(Collections.singletonList(encryptColumnMetaData), Collections.emptyList()); - Map tables = new HashMap<>(1, 1); - tables.put("test", tableMetaData); - assertThat(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).getValue(1, String.class), is("assistedQuery")); + assertThat(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getValue(1, String.class), is("assistedQuery")); } @Test public void assertGetValueWithOtherIndex() throws SQLException { when(queryResult.getValue(2, String.class)).thenReturn("id"); - EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("id", Types.VARCHAR, "varchar", true, "cipher", "plain", "assistedQuery"); - TableMetaData tableMetaData = new TableMetaData(Collections.singletonList(encryptColumnMetaData), Collections.emptyList()); - Map tables = new HashMap<>(1, 1); - tables.put("test", tableMetaData); - assertThat(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).getValue(2, String.class), is("id")); + assertThat(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getValue(2, String.class), is("id")); } @Test public void assertWasNull() throws SQLException { - assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mock(ShardingSphereSchema.class)).wasNull()); + assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).wasNull()); } - private MergedEncryptColumnsMergedResult createMergedEncryptColumnsMergedResult(final QueryResult queryResult, final ShardingSphereSchema schema) { + private MergedEncryptColumnsMergedResult createMergedEncryptColumnsMergedResult(final QueryResult queryResult, final EncryptRule encryptRule) { SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class); IdentifierValue identifierValue = new IdentifierValue("test"); TableNameSegment tableNameSegment = new TableNameSegment(1, 4, identifierValue); SimpleTableSegment simpleTableSegment = new SimpleTableSegment(tableNameSegment); when(sqlStatementContext.getAllTables()).thenReturn(Collections.singletonList(simpleTableSegment)); - return new MergedEncryptColumnsMergedResult(queryResult, sqlStatementContext, schema); + return new MergedEncryptColumnsMergedResult(queryResult, sqlStatementContext, encryptRule); } } diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/DecoratedEncryptColumnsMergedResultTest.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/DecoratedEncryptColumnsMergedResultTest.java index 150cc8dcf1..a5fa8b53d4 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/DecoratedEncryptColumnsMergedResultTest.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/DecoratedEncryptColumnsMergedResultTest.java @@ -18,8 +18,8 @@ package org.apache.shardingsphere.encrypt.merge.dal.impl; import org.apache.shardingsphere.encrypt.merge.dal.impl.fixture.TestStatementContext; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.merge.result.MergedResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment; import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue; @@ -52,7 +52,7 @@ public final class DecoratedEncryptColumnsMergedResultTest { when(mergedResult.next()).thenReturn(true); when(mergedResult.wasNull()).thenReturn(false); when(mergedResult.getValue(eq(new Integer(1)), eq(getClass()))).thenReturn("test"); - DecoratedEncryptColumnsMergedResult actual = new DecoratedEncryptColumnsMergedResult(mergedResult, testStatementContext, mock(ShardingSphereSchema.class)); + DecoratedEncryptColumnsMergedResult actual = new DecoratedEncryptColumnsMergedResult(mergedResult, testStatementContext, mock(EncryptRule.class)); assertNotNull(actual); assertTrue(actual.nextValue()); assertFalse(actual.wasNull()); diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java index 1be02d3ef7..fdd5ccab34 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java @@ -17,10 +17,10 @@ package org.apache.shardingsphere.encrypt.merge.dql; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.merge.result.MergedResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.junit.Test; import java.sql.SQLException; @@ -30,26 +30,22 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public final class EncryptDQLResultDecoratorTest { - - private EncryptAlgorithmMetaData metaData; - - private boolean queryWithCipherColumn; - + @Test public void assertDecorateQueryResult() throws SQLException { QueryResult queryResult = mock(QueryResult.class); when(queryResult.next()).thenReturn(true); - EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(metaData, queryWithCipherColumn); - MergedResult actual = decorator.decorate(queryResult, mock(SQLStatementContext.class), mock(ShardingSphereSchema.class)); + EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(mock(EncryptAlgorithmMetaData.class), false); + MergedResult actual = decorator.decorate(queryResult, mock(SQLStatementContext.class), mock(EncryptRule.class)); assertTrue(actual.next()); } - + @Test public void assertDecorateMergedResult() throws SQLException { MergedResult mergedResult = mock(MergedResult.class); when(mergedResult.next()).thenReturn(true); - EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(metaData, queryWithCipherColumn); - MergedResult actual = decorator.decorate(mergedResult, mock(SQLStatementContext.class), mock(ShardingSphereSchema.class)); + EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(mock(EncryptAlgorithmMetaData.class), false); + MergedResult actual = decorator.decorate(mergedResult, mock(SQLStatementContext.class), mock(EncryptRule.class)); assertTrue(actual.next()); } } diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/EncryptColumnsMergedResultFixture.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/EncryptColumnsMergedResultFixture.java index feb4ff73af..152e6c9f7e 100644 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/EncryptColumnsMergedResultFixture.java +++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/EncryptColumnsMergedResultFixture.java @@ -18,13 +18,13 @@ package org.apache.shardingsphere.encrypt.merge.dql.fixture; import org.apache.shardingsphere.encrypt.merge.dal.impl.EncryptColumnsMergedResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; public final class EncryptColumnsMergedResultFixture extends EncryptColumnsMergedResult { - public EncryptColumnsMergedResultFixture(final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { - super(sqlStatementContext, schema); + public EncryptColumnsMergedResultFixture(final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) { + super(sqlStatementContext, encryptRule); } @Override diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/impl/EncryptColumnsMergedResultTest.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/impl/EncryptColumnsMergedResultTest.java deleted file mode 100644 index 66fe8beaa3..0000000000 --- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-merge/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/impl/EncryptColumnsMergedResultTest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * 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.encrypt.merge.dql.impl; - -import com.google.common.collect.Lists; -import org.apache.shardingsphere.encrypt.merge.dql.fixture.EncryptColumnsMergedResultFixture; -import org.apache.shardingsphere.encrypt.merge.dql.fixture.TableAvailableAndSqlStatementContextFixture; -import org.apache.shardingsphere.encrypt.metadata.EncryptColumnMetaData; -import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData; -import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment; -import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment; -import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - -import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; -import java.util.Calendar; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public final class EncryptColumnsMergedResultTest { - - @Mock - private TableAvailableAndSqlStatementContextFixture tableAvailableAndSqlStatementContextFixture; - - @Mock - private ShardingSphereSchema schema; - - @Mock - private TableMetaData tableMetaData; - - private EncryptColumnsMergedResultFixture encryptColumnsMergedResultFixture; - - @Before - public void setUp() { - Map columns = new HashMap<>(1, 1); - EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("order", 1, "Integer", false, "status", "status", "status"); - columns.put("", encryptColumnMetaData); - SimpleTableSegment simpleTableSegment = mock(SimpleTableSegment.class); - TableNameSegment tableNameSegment = mock(TableNameSegment.class); - IdentifierValue identifierValue = mock(IdentifierValue.class); - when(tableAvailableAndSqlStatementContextFixture.getAllTables()).thenReturn(Lists.newArrayList(simpleTableSegment)); - when(simpleTableSegment.getTableName()).thenReturn(tableNameSegment); - when(tableNameSegment.getIdentifier()).thenReturn(identifierValue); - String tableName = "t_order"; - when(identifierValue.getValue()).thenReturn(tableName); - when(schema.get(anyString())).thenReturn(tableMetaData); - when(tableMetaData.getColumns()).thenReturn(columns); - encryptColumnsMergedResultFixture = spy(new EncryptColumnsMergedResultFixture(tableAvailableAndSqlStatementContextFixture, schema)); - } - - @Test - public void assertHasNextWithEmptyColumnMetaData() throws SQLException { - when(schema.get(anyString())).thenReturn(tableMetaData); - when(tableMetaData.getColumns()).thenReturn(Collections.emptyMap()); - EncryptColumnsMergedResultFixture encryptColumnsMergedResultFixture = spy(new EncryptColumnsMergedResultFixture(tableAvailableAndSqlStatementContextFixture, schema)); - when(encryptColumnsMergedResultFixture.nextValue()).thenReturn(true).thenReturn(false); - assertThat(encryptColumnsMergedResultFixture.next(), is(true)); - } - - @Test - public void assertWithoutHasNext() throws SQLException { - EncryptColumnsMergedResultFixture encryptColumnsMergedResultFixture = spy(new EncryptColumnsMergedResultFixture(tableAvailableAndSqlStatementContextFixture, schema)); - when(encryptColumnsMergedResultFixture.nextValue()).thenReturn(false); - assertThat(encryptColumnsMergedResultFixture.next(), is(false)); - } - - @Test - public void assertContainerColumnName() throws SQLException { - Map columns = new HashMap<>(1, 1); - EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("order", 1, "Integer", false, "status", "status", "status"); - columns.put("", encryptColumnMetaData); - when(schema.get(anyString())).thenReturn(tableMetaData); - when(tableMetaData.getColumns()).thenReturn(columns); - EncryptColumnsMergedResultFixture encryptColumnsMergedResultFixture = spy(new EncryptColumnsMergedResultFixture(tableAvailableAndSqlStatementContextFixture, schema)); - when(encryptColumnsMergedResultFixture.nextValue()).thenReturn(true).thenReturn(true); - when(encryptColumnsMergedResultFixture.getOriginalValue(1, String.class)).thenReturn("status").thenReturn("noInThatCollection"); - assertThat(encryptColumnsMergedResultFixture.next(), is(true)); - } - - @Test - public void assertGetValueWithColumnIndex() throws SQLException { - Map columns = new HashMap<>(1, 1); - EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("order", 1, "Integer", false, "status", "status", "status"); - columns.put("key", encryptColumnMetaData); - when(schema.get(anyString())).thenReturn(tableMetaData); - when(tableMetaData.getColumns()).thenReturn(columns); - when(encryptColumnsMergedResultFixture.getOriginalValue(1, String.class)).thenReturn("status"); - assertThat(encryptColumnsMergedResultFixture.getValue(1, String.class), is("key")); - } - - @Test - public void assertGetValueWithOutColumnIndex() throws SQLException { - when(encryptColumnsMergedResultFixture.getOriginalValue(2, String.class)).thenReturn("status"); - assertThat(encryptColumnsMergedResultFixture.getValue(2, String.class), is("status")); - } - - @Test(expected = SQLFeatureNotSupportedException.class) - public void assertGetCalendarValue() throws SQLException { - encryptColumnsMergedResultFixture.getCalendarValue(1, String.class, Calendar.getInstance()); - } - - @Test(expected = SQLFeatureNotSupportedException.class) - public void assertGetInputStream() throws SQLException { - encryptColumnsMergedResultFixture.getInputStream(1, "whateverString"); - } -} diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/model/ColumnMetaData.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/model/ColumnMetaData.java index 1883f49f99..37f7236bbe 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/model/ColumnMetaData.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/model/ColumnMetaData.java @@ -29,7 +29,7 @@ import lombok.ToString; @Getter @EqualsAndHashCode @ToString -public class ColumnMetaData { +public final class ColumnMetaData { private final String name; diff --git a/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java b/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java index e179529efb..eb4bf4d801 100644 --- a/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java +++ b/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java @@ -96,7 +96,7 @@ public final class MergeEngine { for (Entry entry : engines.entrySet()) { if (entry.getValue() instanceof ResultDecoratorEngine) { ResultDecorator resultDecorator = ((ResultDecoratorEngine) entry.getValue()).newInstance(databaseType, schema, entry.getKey(), props, sqlStatementContext); - result = null == result ? resultDecorator.decorate(mergedResult, sqlStatementContext, schema) : resultDecorator.decorate(result, sqlStatementContext, schema); + result = null == result ? resultDecorator.decorate(mergedResult, sqlStatementContext, entry.getKey()) : resultDecorator.decorate(result, sqlStatementContext, entry.getKey()); } } return null == result ? mergedResult : result; @@ -108,7 +108,7 @@ public final class MergeEngine { for (Entry entry : engines.entrySet()) { if (entry.getValue() instanceof ResultDecoratorEngine) { ResultDecorator resultDecorator = ((ResultDecoratorEngine) entry.getValue()).newInstance(databaseType, schema, entry.getKey(), props, sqlStatementContext); - result = null == result ? resultDecorator.decorate(queryResult, sqlStatementContext, schema) : resultDecorator.decorate(result, sqlStatementContext, schema); + result = null == result ? resultDecorator.decorate(queryResult, sqlStatementContext, entry.getKey()) : resultDecorator.decorate(result, sqlStatementContext, entry.getKey()); } } return Optional.ofNullable(result); diff --git a/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecorator.java b/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecorator.java index 91072662c3..a76f59bd41 100644 --- a/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecorator.java +++ b/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecorator.java @@ -17,37 +17,39 @@ package org.apache.shardingsphere.infra.merge.engine.decorator; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.merge.result.MergedResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import java.sql.SQLException; /** * Result decorator. + * + * @param type of ShardingSphere rule */ -public interface ResultDecorator { +public interface ResultDecorator { /** * Decorate query result. * * @param queryResult query result * @param sqlStatementContext SQL statement context - * @param schema ShardingSphere schema + * @param rule ShardingSphere rule * @return merged result * @throws SQLException SQL exception */ - MergedResult decorate(QueryResult queryResult, SQLStatementContext sqlStatementContext, ShardingSphereSchema schema) throws SQLException; + MergedResult decorate(QueryResult queryResult, SQLStatementContext sqlStatementContext, T rule) throws SQLException; /** * Decorate merged result. * * @param mergedResult merged result * @param sqlStatementContext SQL statement context - * @param schema ShardingSphere schema + * @param rule ShardingSphere rule * @return merged result * @throws SQLException SQL exception */ - MergedResult decorate(MergedResult mergedResult, SQLStatementContext sqlStatementContext, ShardingSphereSchema schema) throws SQLException; + MergedResult decorate(MergedResult mergedResult, SQLStatementContext sqlStatementContext, T rule) throws SQLException; } diff --git a/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecorator.java b/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecorator.java index 843751f05c..5f86d91604 100644 --- a/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecorator.java +++ b/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecorator.java @@ -17,25 +17,24 @@ package org.apache.shardingsphere.infra.merge.engine.decorator.impl; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; /** * Transparent result decorator. */ -public final class TransparentResultDecorator implements ResultDecorator { +public final class TransparentResultDecorator implements ResultDecorator { @Override - public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { + public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final TransparentRule rule) { return new TransparentMergedResult(queryResult); } @Override - public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { + public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final TransparentRule rule) { return mergedResult; } } diff --git a/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentRule.java b/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentRule.java new file mode 100644 index 0000000000..faf45d88e5 --- /dev/null +++ b/shardingsphere-infra/shardingsphere-infra-merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentRule.java @@ -0,0 +1,26 @@ +/* + * 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.infra.merge.engine.decorator.impl; + +import org.apache.shardingsphere.infra.rule.ShardingSphereRule; + +/** + * Transparent rule. + */ +public final class TransparentRule implements ShardingSphereRule { +} diff --git a/shardingsphere-infra/shardingsphere-infra-merge/src/test/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecoratorTest.java b/shardingsphere-infra/shardingsphere-infra-merge/src/test/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecoratorTest.java index aa9a957a73..fbf0f72b5c 100644 --- a/shardingsphere-infra/shardingsphere-infra-merge/src/test/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecoratorTest.java +++ b/shardingsphere-infra/shardingsphere-infra-merge/src/test/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecoratorTest.java @@ -17,10 +17,9 @@ package org.apache.shardingsphere.infra.merge.engine.decorator.impl; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.merge.result.MergedResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.junit.Test; import java.sql.SQLException; @@ -36,7 +35,7 @@ public final class TransparentResultDecoratorTest { QueryResult queryResult = mock(QueryResult.class); when(queryResult.next()).thenReturn(true); TransparentResultDecorator decorator = new TransparentResultDecorator(); - MergedResult actual = decorator.decorate(queryResult, mock(SQLStatementContext.class), mock(ShardingSphereSchema.class)); + MergedResult actual = decorator.decorate(queryResult, mock(SQLStatementContext.class), new TransparentRule()); assertTrue(actual.next()); } @@ -45,7 +44,7 @@ public final class TransparentResultDecoratorTest { MergedResult mergedResult = mock(MergedResult.class); when(mergedResult.next()).thenReturn(true); TransparentResultDecorator decorator = new TransparentResultDecorator(); - MergedResult actual = decorator.decorate(mergedResult, mock(SQLStatementContext.class), mock(ShardingSphereSchema.class)); + MergedResult actual = decorator.decorate(mergedResult, mock(SQLStatementContext.class), new TransparentRule()); assertTrue(actual.next()); } } diff --git a/shardingsphere-infra/shardingsphere-infra-merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorFixture.java b/shardingsphere-infra/shardingsphere-infra-merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorFixture.java index ac84ac161b..0a2540e158 100644 --- a/shardingsphere-infra/shardingsphere-infra-merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorFixture.java +++ b/shardingsphere-infra/shardingsphere-infra-merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorFixture.java @@ -17,13 +17,13 @@ package org.apache.shardingsphere.infra.merge.fixture.decorator; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.queryresult.StreamQueryResult; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; +import org.apache.shardingsphere.infra.merge.fixture.rule.DecoratorRuleFixture; import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; -import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; -import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import java.sql.ResultSet; import java.sql.SQLException; @@ -31,17 +31,17 @@ import java.sql.SQLException; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public final class ResultDecoratorFixture implements ResultDecorator { +public final class ResultDecoratorFixture implements ResultDecorator { @Override - public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) throws SQLException { + public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final DecoratorRuleFixture rule) throws SQLException { ResultSet resultSet = mock(ResultSet.class); when(resultSet.getString(1)).thenReturn("decorated_value"); return new TransparentMergedResult(new StreamQueryResult(resultSet)); } @Override - public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) throws SQLException { + public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final DecoratorRuleFixture rule) throws SQLException { ResultSet resultSet = mock(ResultSet.class); when(resultSet.getString(1)).thenReturn("decorated_merged_value"); return new TransparentMergedResult(new StreamQueryResult(resultSet)); -- GitLab