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

Remove EncryptColumnMetaData (#8140)

* Decouple EncryptColumnMetaData

* Remove EncryptColumnMetaData
上级 84c641c2
...@@ -67,11 +67,8 @@ public final class EncryptTableMetaDataBuilder implements RuleBasedTableMetaData ...@@ -67,11 +67,8 @@ public final class EncryptTableMetaDataBuilder implements RuleBasedTableMetaData
return originalColumnMetaData; return originalColumnMetaData;
} }
String logicColumnName = encryptRule.getLogicColumnOfCipher(tableName, originalColumnMetaData.getName()); String logicColumnName = encryptRule.getLogicColumnOfCipher(tableName, originalColumnMetaData.getName());
String plainColumnName = encryptRule.findPlainColumn(tableName, logicColumnName).orElse(null); return new ColumnMetaData(logicColumnName, originalColumnMetaData.getDataType(),
String assistedQueryColumnName = encryptRule.findAssistedQueryColumn(tableName, logicColumnName).orElse(null); originalColumnMetaData.getDataTypeName(), originalColumnMetaData.isPrimaryKey(), originalColumnMetaData.isGenerated(), originalColumnMetaData.isCaseSensitive());
return new EncryptColumnMetaData(
logicColumnName, originalColumnMetaData.getDataType(), originalColumnMetaData.getDataTypeName(), originalColumnMetaData.isPrimaryKey(), originalColumnMetaData.getName(),
plainColumnName, assistedQueryColumnName);
} }
@Override @Override
......
...@@ -19,12 +19,12 @@ package org.apache.shardingsphere.encrypt.merge.dal; ...@@ -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.DecoratedEncryptColumnsMergedResult;
import org.apache.shardingsphere.encrypt.merge.dal.impl.MergedEncryptColumnsMergedResult; 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.executor.sql.QueryResult;
import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; 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.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.MySQLDescribeStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowColumnsStatement; 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 ...@@ -32,17 +32,17 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ
/** /**
* DAL result decorator for encrypt. * DAL result decorator for encrypt.
*/ */
public final class EncryptDALResultDecorator implements ResultDecorator { public final class EncryptDALResultDecorator implements ResultDecorator<EncryptRule> {
@Override @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()) return isNeedMergeEncryptColumns(sqlStatementContext.getSqlStatement())
? new MergedEncryptColumnsMergedResult(queryResult, sqlStatementContext, schema) : new TransparentMergedResult(queryResult); ? new MergedEncryptColumnsMergedResult(queryResult, sqlStatementContext, rule) : new TransparentMergedResult(queryResult);
} }
@Override @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 isNeedMergeEncryptColumns(sqlStatementContext.getSqlStatement()) ? new DecoratedEncryptColumnsMergedResult(mergedResult, sqlStatementContext, schema) : mergedResult; return isNeedMergeEncryptColumns(sqlStatementContext.getSqlStatement()) ? new DecoratedEncryptColumnsMergedResult(mergedResult, sqlStatementContext, rule) : mergedResult;
} }
private boolean isNeedMergeEncryptColumns(final SQLStatement sqlStatement) { private boolean isNeedMergeEncryptColumns(final SQLStatement sqlStatement) {
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
package org.apache.shardingsphere.encrypt.merge.dal.impl; 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.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.MergedResult;
...@@ -30,8 +30,8 @@ public final class DecoratedEncryptColumnsMergedResult extends EncryptColumnsMer ...@@ -30,8 +30,8 @@ public final class DecoratedEncryptColumnsMergedResult extends EncryptColumnsMer
private final MergedResult mergedResult; private final MergedResult mergedResult;
public DecoratedEncryptColumnsMergedResult(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { public DecoratedEncryptColumnsMergedResult(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) {
super(sqlStatementContext, schema); super(sqlStatementContext, encryptRule);
this.mergedResult = mergedResult; this.mergedResult = mergedResult;
} }
......
...@@ -18,9 +18,8 @@ ...@@ -18,9 +18,8 @@
package org.apache.shardingsphere.encrypt.merge.dal.impl; package org.apache.shardingsphere.encrypt.merge.dal.impl;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import org.apache.shardingsphere.encrypt.metadata.EncryptColumnMetaData; import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData; import org.apache.shardingsphere.encrypt.rule.EncryptTable;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.type.TableAvailable; import org.apache.shardingsphere.infra.binder.type.TableAvailable;
import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.MergedResult;
...@@ -29,38 +28,35 @@ import java.io.InputStream; ...@@ -29,38 +28,35 @@ import java.io.InputStream;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException; import java.sql.SQLFeatureNotSupportedException;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Map.Entry;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
/** /**
* Encrypt column merged result. * Encrypt column merged result.
*/ */
public abstract class EncryptColumnsMergedResult implements MergedResult { public abstract class EncryptColumnsMergedResult implements MergedResult {
private final ShardingSphereSchema schema;
private final String tableName; private final String tableName;
protected EncryptColumnsMergedResult(final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { private final EncryptRule encryptRule;
this.schema = schema;
protected EncryptColumnsMergedResult(final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) {
Preconditions.checkState(sqlStatementContext instanceof TableAvailable && 1 == ((TableAvailable) sqlStatementContext).getAllTables().size()); Preconditions.checkState(sqlStatementContext instanceof TableAvailable && 1 == ((TableAvailable) sqlStatementContext).getAllTables().size());
tableName = ((TableAvailable) sqlStatementContext).getAllTables().iterator().next().getTableName().getIdentifier().getValue(); tableName = ((TableAvailable) sqlStatementContext).getAllTables().iterator().next().getTableName().getIdentifier().getValue();
this.encryptRule = encryptRule;
} }
@Override @Override
public final boolean next() throws SQLException { public final boolean next() throws SQLException {
boolean hasNext = nextValue(); boolean hasNext = nextValue();
if (hasNext && getTableEncryptColumnMetaDataList().isEmpty()) { Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
if (hasNext && !encryptTable.isPresent()) {
return true; return true;
} }
if (!hasNext) { if (!hasNext) {
return false; return false;
} }
String columnName = getOriginalValue(1, String.class).toString(); 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(); hasNext = nextValue();
if (!hasNext) { if (!hasNext) {
return false; return false;
...@@ -70,48 +66,20 @@ public abstract class EncryptColumnsMergedResult implements MergedResult { ...@@ -70,48 +66,20 @@ public abstract class EncryptColumnsMergedResult implements MergedResult {
return true; return true;
} }
private Collection<String> getAssistedQueryColumns() {
return getTableEncryptColumnMetaDataList().stream().map(EncryptColumnMetaData::getAssistedQueryColumnName)
.collect(Collectors.toList());
}
private Collection<String> getPlainColumns() {
return getTableEncryptColumnMetaDataList().stream().map(EncryptColumnMetaData::getPlainColumnName)
.collect(Collectors.toList());
}
private Collection<EncryptColumnMetaData> getTableEncryptColumnMetaDataList() {
Collection<EncryptColumnMetaData> result = new LinkedList<>();
for (Entry<String, ColumnMetaData> entry : schema.get(tableName).getColumns().entrySet()) {
if (entry.getValue() instanceof EncryptColumnMetaData) {
result.add((EncryptColumnMetaData) entry.getValue());
}
}
return result;
}
@Override @Override
public final Object getValue(final int columnIndex, final Class<?> type) throws SQLException { public final Object getValue(final int columnIndex, final Class<?> type) throws SQLException {
if (1 == columnIndex) { if (1 == columnIndex) {
String columnName = getOriginalValue(1, type).toString(); String columnName = getOriginalValue(1, type).toString();
Optional<String> logicColumn = getLogicColumnOfCipher(columnName); Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
if (!encryptTable.isPresent()) {
return columnName;
}
Optional<String> logicColumn = encryptTable.get().isCipherColumn(columnName) ? Optional.of(encryptTable.get().getLogicColumn(columnName)) : Optional.empty();
return logicColumn.orElse(columnName); return logicColumn.orElse(columnName);
} }
return getOriginalValue(columnIndex, type); return getOriginalValue(columnIndex, type);
} }
private Optional<String> getLogicColumnOfCipher(final String cipherColumn) {
for (Entry<String, ColumnMetaData> 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 @Override
public final Object getCalendarValue(final int columnIndex, final Class<?> type, final Calendar calendar) throws SQLException { public final Object getCalendarValue(final int columnIndex, final Class<?> type, final Calendar calendar) throws SQLException {
throw new SQLFeatureNotSupportedException(""); throw new SQLFeatureNotSupportedException("");
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
package org.apache.shardingsphere.encrypt.merge.dal.impl; 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.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.executor.sql.QueryResult;
...@@ -30,8 +30,8 @@ public final class MergedEncryptColumnsMergedResult extends EncryptColumnsMerged ...@@ -30,8 +30,8 @@ public final class MergedEncryptColumnsMergedResult extends EncryptColumnsMerged
private final QueryResult queryResult; private final QueryResult queryResult;
public MergedEncryptColumnsMergedResult(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { public MergedEncryptColumnsMergedResult(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) {
super(sqlStatementContext, schema); super(sqlStatementContext, encryptRule);
this.queryResult = queryResult; this.queryResult = queryResult;
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
package org.apache.shardingsphere.encrypt.merge.dql; package org.apache.shardingsphere.encrypt.merge.dql;
import lombok.RequiredArgsConstructor; 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.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.infra.executor.sql.QueryResult;
import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
...@@ -29,19 +29,19 @@ import org.apache.shardingsphere.infra.merge.result.impl.transparent.Transparent ...@@ -29,19 +29,19 @@ import org.apache.shardingsphere.infra.merge.result.impl.transparent.Transparent
* DQL result decorator for encrypt. * DQL result decorator for encrypt.
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
public final class EncryptDQLResultDecorator implements ResultDecorator { public final class EncryptDQLResultDecorator implements ResultDecorator<EncryptRule> {
private final EncryptAlgorithmMetaData metaData; private final EncryptAlgorithmMetaData metaData;
private final boolean queryWithCipherColumn; private final boolean queryWithCipherColumn;
@Override @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); return new EncryptMergedResult(metaData, new TransparentMergedResult(queryResult), queryWithCipherColumn);
} }
@Override @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); return new EncryptMergedResult(metaData, mergedResult, queryWithCipherColumn);
} }
} }
...@@ -19,18 +19,19 @@ package org.apache.shardingsphere.encrypt.merge.dal; ...@@ -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.DecoratedEncryptColumnsMergedResult;
import org.apache.shardingsphere.encrypt.merge.dal.impl.MergedEncryptColumnsMergedResult; 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.executor.sql.QueryResult;
import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; 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.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment; 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.MySQLDescribeStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowColumnsStatement; 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.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
...@@ -48,6 +49,9 @@ public final class EncryptDALResultDecoratorTest { ...@@ -48,6 +49,9 @@ public final class EncryptDALResultDecoratorTest {
@Mock @Mock
private ShardingSphereSchema schema; private ShardingSphereSchema schema;
@Mock
private EncryptRule rule;
@Mock @Mock
private SQLStatementContext<?> sqlStatementContext; private SQLStatementContext<?> sqlStatementContext;
...@@ -57,8 +61,8 @@ public final class EncryptDALResultDecoratorTest { ...@@ -57,8 +61,8 @@ public final class EncryptDALResultDecoratorTest {
schema = mock(ShardingSphereSchema.class); schema = mock(ShardingSphereSchema.class);
sqlStatementContext = getDescribeStatementContext(); sqlStatementContext = getDescribeStatementContext();
EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator(); EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator();
assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, schema), instanceOf(MergedEncryptColumnsMergedResult.class)); assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, rule), instanceOf(MergedEncryptColumnsMergedResult.class));
assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, schema), instanceOf(DecoratedEncryptColumnsMergedResult.class)); assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, rule), instanceOf(DecoratedEncryptColumnsMergedResult.class));
} }
@Test @Test
...@@ -66,8 +70,8 @@ public final class EncryptDALResultDecoratorTest { ...@@ -66,8 +70,8 @@ public final class EncryptDALResultDecoratorTest {
schema = mock(ShardingSphereSchema.class); schema = mock(ShardingSphereSchema.class);
sqlStatementContext = getShowColumnsStatementContext(); sqlStatementContext = getShowColumnsStatementContext();
EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator(); EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator();
assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, schema), instanceOf(MergedEncryptColumnsMergedResult.class)); assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, rule), instanceOf(MergedEncryptColumnsMergedResult.class));
assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, schema), instanceOf(DecoratedEncryptColumnsMergedResult.class)); assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, rule), instanceOf(DecoratedEncryptColumnsMergedResult.class));
} }
@Test @Test
...@@ -75,8 +79,8 @@ public final class EncryptDALResultDecoratorTest { ...@@ -75,8 +79,8 @@ public final class EncryptDALResultDecoratorTest {
schema = mock(ShardingSphereSchema.class); schema = mock(ShardingSphereSchema.class);
sqlStatementContext = mock(SQLStatementContext.class); sqlStatementContext = mock(SQLStatementContext.class);
EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator(); EncryptDALResultDecorator encryptDALResultDecorator = new EncryptDALResultDecorator();
assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, schema), instanceOf(TransparentMergedResult.class)); assertThat(encryptDALResultDecorator.decorate(mock(QueryResult.class), sqlStatementContext, rule), instanceOf(TransparentMergedResult.class));
assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, schema), instanceOf(MergedResult.class)); assertThat(encryptDALResultDecorator.decorate(mock(MergedResult.class), sqlStatementContext, rule), instanceOf(MergedResult.class));
} }
private SQLStatementContext<?> getDescribeStatementContext() { private SQLStatementContext<?> getDescribeStatementContext() {
......
...@@ -18,11 +18,10 @@ ...@@ -18,11 +18,10 @@
package org.apache.shardingsphere.encrypt.merge.dal; package org.apache.shardingsphere.encrypt.merge.dal;
import org.apache.shardingsphere.encrypt.merge.dal.impl.MergedEncryptColumnsMergedResult; import org.apache.shardingsphere.encrypt.merge.dal.impl.MergedEncryptColumnsMergedResult;
import org.apache.shardingsphere.encrypt.metadata.EncryptColumnMetaData; import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.infra.executor.sql.QueryResult; import org.apache.shardingsphere.encrypt.rule.EncryptTable;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext; 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.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment; 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.common.value.identifier.IdentifierValue;
...@@ -32,10 +31,8 @@ import org.mockito.Mock; ...@@ -32,10 +31,8 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Types;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.Optional;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
...@@ -51,71 +48,62 @@ public final class MergedEncryptColumnsMergedResultTest { ...@@ -51,71 +48,62 @@ public final class MergedEncryptColumnsMergedResultTest {
private QueryResult queryResult; private QueryResult queryResult;
@Test @Test
public void assertNextWithTableEncryptColumnMetaDataListEmpty() throws SQLException { public void assertNextWithNotHasNext() throws SQLException {
when(queryResult.next()).thenReturn(true); assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).next());
TableMetaData tableMetaData = new TableMetaData(Collections.emptyList(), Collections.emptyList());
Map<String, TableMetaData> tables = new HashMap<>(1, 1);
tables.put("test", tableMetaData);
assertTrue(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).next());
} }
@Test @Test
public void assertNextWithHasNext() throws SQLException { 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 @Test
public void assertNextWithAssistedQuery() throws SQLException { public void assertNextWithAssistedQuery() throws SQLException {
when(queryResult.next()).thenReturn(true).thenReturn(false); when(queryResult.next()).thenReturn(true).thenReturn(false);
when(queryResult.getValue(1, String.class)).thenReturn("assistedQuery"); when(queryResult.getValue(1, String.class)).thenReturn("assistedQuery");
EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("id", Types.VARCHAR, "varchar", true, "cipher", "plain", "assistedQuery"); assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule()).next());
TableMetaData tableMetaData = new TableMetaData(Collections.singletonList(encryptColumnMetaData), Collections.emptyList());
Map<String, TableMetaData> tables = new HashMap<>(1, 1);
tables.put("test", tableMetaData);
assertFalse(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).next());
} }
@Test @Test
public void assertGetValueWithCipherColumn() throws SQLException { public void assertGetValueWithCipherColumn() throws SQLException {
when(queryResult.getValue(1, String.class)).thenReturn("cipher"); when(queryResult.getValue(1, String.class)).thenReturn("cipher");
EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("id", Types.VARCHAR, "varchar", true, "cipher", "plain", "assistedQuery"); assertThat(createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule()).getValue(1, String.class), is("id"));
TableMetaData tableMetaData = new TableMetaData(Collections.singletonList(encryptColumnMetaData), Collections.emptyList()); }
Map<String, TableMetaData> tables = new HashMap<>(1);
tables.put("test", tableMetaData); private EncryptRule mockEncryptRule() {
assertThat(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).getValue(1, String.class), is("id")); 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 @Test
public void assertGetValueWithOtherColumn() throws SQLException { public void assertGetValueWithOtherColumn() throws SQLException {
when(queryResult.getValue(1, String.class)).thenReturn("assistedQuery"); when(queryResult.getValue(1, String.class)).thenReturn("assistedQuery");
EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("id", Types.VARCHAR, "varchar", true, "cipher", "plain", "assistedQuery"); assertThat(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getValue(1, String.class), is("assistedQuery"));
TableMetaData tableMetaData = new TableMetaData(Collections.singletonList(encryptColumnMetaData), Collections.emptyList());
Map<String, TableMetaData> tables = new HashMap<>(1, 1);
tables.put("test", tableMetaData);
assertThat(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).getValue(1, String.class), is("assistedQuery"));
} }
@Test @Test
public void assertGetValueWithOtherIndex() throws SQLException { public void assertGetValueWithOtherIndex() throws SQLException {
when(queryResult.getValue(2, String.class)).thenReturn("id"); when(queryResult.getValue(2, String.class)).thenReturn("id");
EncryptColumnMetaData encryptColumnMetaData = new EncryptColumnMetaData("id", Types.VARCHAR, "varchar", true, "cipher", "plain", "assistedQuery"); assertThat(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getValue(2, String.class), is("id"));
TableMetaData tableMetaData = new TableMetaData(Collections.singletonList(encryptColumnMetaData), Collections.emptyList());
Map<String, TableMetaData> tables = new HashMap<>(1, 1);
tables.put("test", tableMetaData);
assertThat(createMergedEncryptColumnsMergedResult(queryResult, new ShardingSphereSchema(tables)).getValue(2, String.class), is("id"));
} }
@Test @Test
public void assertWasNull() throws SQLException { 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); SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class);
IdentifierValue identifierValue = new IdentifierValue("test"); IdentifierValue identifierValue = new IdentifierValue("test");
TableNameSegment tableNameSegment = new TableNameSegment(1, 4, identifierValue); TableNameSegment tableNameSegment = new TableNameSegment(1, 4, identifierValue);
SimpleTableSegment simpleTableSegment = new SimpleTableSegment(tableNameSegment); SimpleTableSegment simpleTableSegment = new SimpleTableSegment(tableNameSegment);
when(sqlStatementContext.getAllTables()).thenReturn(Collections.singletonList(simpleTableSegment)); when(sqlStatementContext.getAllTables()).thenReturn(Collections.singletonList(simpleTableSegment));
return new MergedEncryptColumnsMergedResult(queryResult, sqlStatementContext, schema); return new MergedEncryptColumnsMergedResult(queryResult, sqlStatementContext, encryptRule);
} }
} }
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
package org.apache.shardingsphere.encrypt.merge.dal.impl; package org.apache.shardingsphere.encrypt.merge.dal.impl;
import org.apache.shardingsphere.encrypt.merge.dal.impl.fixture.TestStatementContext; 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.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.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment; 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.common.value.identifier.IdentifierValue;
...@@ -52,7 +52,7 @@ public final class DecoratedEncryptColumnsMergedResultTest { ...@@ -52,7 +52,7 @@ public final class DecoratedEncryptColumnsMergedResultTest {
when(mergedResult.next()).thenReturn(true); when(mergedResult.next()).thenReturn(true);
when(mergedResult.wasNull()).thenReturn(false); when(mergedResult.wasNull()).thenReturn(false);
when(mergedResult.getValue(eq(new Integer(1)), eq(getClass()))).thenReturn("test"); 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); assertNotNull(actual);
assertTrue(actual.nextValue()); assertTrue(actual.nextValue());
assertFalse(actual.wasNull()); assertFalse(actual.wasNull());
......
...@@ -17,10 +17,10 @@ ...@@ -17,10 +17,10 @@
package org.apache.shardingsphere.encrypt.merge.dql; 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.executor.sql.QueryResult;
import org.apache.shardingsphere.infra.merge.result.MergedResult; 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 org.junit.Test;
import java.sql.SQLException; import java.sql.SQLException;
...@@ -30,26 +30,22 @@ import static org.mockito.Mockito.mock; ...@@ -30,26 +30,22 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
public final class EncryptDQLResultDecoratorTest { public final class EncryptDQLResultDecoratorTest {
private EncryptAlgorithmMetaData metaData;
private boolean queryWithCipherColumn;
@Test @Test
public void assertDecorateQueryResult() throws SQLException { public void assertDecorateQueryResult() throws SQLException {
QueryResult queryResult = mock(QueryResult.class); QueryResult queryResult = mock(QueryResult.class);
when(queryResult.next()).thenReturn(true); when(queryResult.next()).thenReturn(true);
EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(metaData, queryWithCipherColumn); EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(mock(EncryptAlgorithmMetaData.class), false);
MergedResult actual = decorator.decorate(queryResult, mock(SQLStatementContext.class), mock(ShardingSphereSchema.class)); MergedResult actual = decorator.decorate(queryResult, mock(SQLStatementContext.class), mock(EncryptRule.class));
assertTrue(actual.next()); assertTrue(actual.next());
} }
@Test @Test
public void assertDecorateMergedResult() throws SQLException { public void assertDecorateMergedResult() throws SQLException {
MergedResult mergedResult = mock(MergedResult.class); MergedResult mergedResult = mock(MergedResult.class);
when(mergedResult.next()).thenReturn(true); when(mergedResult.next()).thenReturn(true);
EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(metaData, queryWithCipherColumn); EncryptDQLResultDecorator decorator = new EncryptDQLResultDecorator(mock(EncryptAlgorithmMetaData.class), false);
MergedResult actual = decorator.decorate(mergedResult, mock(SQLStatementContext.class), mock(ShardingSphereSchema.class)); MergedResult actual = decorator.decorate(mergedResult, mock(SQLStatementContext.class), mock(EncryptRule.class));
assertTrue(actual.next()); assertTrue(actual.next());
} }
} }
...@@ -18,13 +18,13 @@ ...@@ -18,13 +18,13 @@
package org.apache.shardingsphere.encrypt.merge.dql.fixture; package org.apache.shardingsphere.encrypt.merge.dql.fixture;
import org.apache.shardingsphere.encrypt.merge.dal.impl.EncryptColumnsMergedResult; 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; import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
public final class EncryptColumnsMergedResultFixture extends EncryptColumnsMergedResult { public final class EncryptColumnsMergedResultFixture extends EncryptColumnsMergedResult {
public EncryptColumnsMergedResultFixture(final SQLStatementContext sqlStatementContext, final ShardingSphereSchema schema) { public EncryptColumnsMergedResultFixture(final SQLStatementContext sqlStatementContext, final EncryptRule encryptRule) {
super(sqlStatementContext, schema); super(sqlStatementContext, encryptRule);
} }
@Override @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.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<String, ColumnMetaData> 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<String, ColumnMetaData> 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<String, ColumnMetaData> 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");
}
}
...@@ -29,7 +29,7 @@ import lombok.ToString; ...@@ -29,7 +29,7 @@ import lombok.ToString;
@Getter @Getter
@EqualsAndHashCode @EqualsAndHashCode
@ToString @ToString
public class ColumnMetaData { public final class ColumnMetaData {
private final String name; private final String name;
......
...@@ -96,7 +96,7 @@ public final class MergeEngine { ...@@ -96,7 +96,7 @@ public final class MergeEngine {
for (Entry<ShardingSphereRule, ResultProcessEngine> entry : engines.entrySet()) { for (Entry<ShardingSphereRule, ResultProcessEngine> entry : engines.entrySet()) {
if (entry.getValue() instanceof ResultDecoratorEngine) { if (entry.getValue() instanceof ResultDecoratorEngine) {
ResultDecorator resultDecorator = ((ResultDecoratorEngine) entry.getValue()).newInstance(databaseType, schema, entry.getKey(), props, sqlStatementContext); 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; return null == result ? mergedResult : result;
...@@ -108,7 +108,7 @@ public final class MergeEngine { ...@@ -108,7 +108,7 @@ public final class MergeEngine {
for (Entry<ShardingSphereRule, ResultProcessEngine> entry : engines.entrySet()) { for (Entry<ShardingSphereRule, ResultProcessEngine> entry : engines.entrySet()) {
if (entry.getValue() instanceof ResultDecoratorEngine) { if (entry.getValue() instanceof ResultDecoratorEngine) {
ResultDecorator resultDecorator = ((ResultDecoratorEngine) entry.getValue()).newInstance(databaseType, schema, entry.getKey(), props, sqlStatementContext); 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); return Optional.ofNullable(result);
......
...@@ -17,37 +17,39 @@ ...@@ -17,37 +17,39 @@
package org.apache.shardingsphere.infra.merge.engine.decorator; 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.executor.sql.QueryResult;
import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema; import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import java.sql.SQLException; import java.sql.SQLException;
/** /**
* Result decorator. * Result decorator.
*
* @param <T> type of ShardingSphere rule
*/ */
public interface ResultDecorator { public interface ResultDecorator<T extends ShardingSphereRule> {
/** /**
* Decorate query result. * Decorate query result.
* *
* @param queryResult query result * @param queryResult query result
* @param sqlStatementContext SQL statement context * @param sqlStatementContext SQL statement context
* @param schema ShardingSphere schema * @param rule ShardingSphere rule
* @return merged result * @return merged result
* @throws SQLException SQL exception * @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. * Decorate merged result.
* *
* @param mergedResult merged result * @param mergedResult merged result
* @param sqlStatementContext SQL statement context * @param sqlStatementContext SQL statement context
* @param schema ShardingSphere schema * @param rule ShardingSphere rule
* @return merged result * @return merged result
* @throws SQLException SQL exception * @throws SQLException SQL exception
*/ */
MergedResult decorate(MergedResult mergedResult, SQLStatementContext<?> sqlStatementContext, ShardingSphereSchema schema) throws SQLException; MergedResult decorate(MergedResult mergedResult, SQLStatementContext<?> sqlStatementContext, T rule) throws SQLException;
} }
...@@ -17,25 +17,24 @@ ...@@ -17,25 +17,24 @@
package org.apache.shardingsphere.infra.merge.engine.decorator.impl; 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.executor.sql.QueryResult;
import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; 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. * Transparent result decorator.
*/ */
public final class TransparentResultDecorator implements ResultDecorator { public final class TransparentResultDecorator implements ResultDecorator<TransparentRule> {
@Override @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); return new TransparentMergedResult(queryResult);
} }
@Override @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; return mergedResult;
} }
} }
...@@ -15,32 +15,12 @@ ...@@ -15,32 +15,12 @@
* limitations under the License. * limitations under the License.
*/ */
package org.apache.shardingsphere.encrypt.metadata; package org.apache.shardingsphere.infra.merge.engine.decorator.impl;
import lombok.EqualsAndHashCode; import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
/** /**
* Column meta data for encrypt. * Transparent rule.
*/ */
@Getter public final class TransparentRule implements ShardingSphereRule {
@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;
}
} }
...@@ -17,10 +17,9 @@ ...@@ -17,10 +17,9 @@
package org.apache.shardingsphere.infra.merge.engine.decorator.impl; 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.executor.sql.QueryResult;
import org.apache.shardingsphere.infra.merge.result.MergedResult; 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 org.junit.Test;
import java.sql.SQLException; import java.sql.SQLException;
...@@ -36,7 +35,7 @@ public final class TransparentResultDecoratorTest { ...@@ -36,7 +35,7 @@ public final class TransparentResultDecoratorTest {
QueryResult queryResult = mock(QueryResult.class); QueryResult queryResult = mock(QueryResult.class);
when(queryResult.next()).thenReturn(true); when(queryResult.next()).thenReturn(true);
TransparentResultDecorator decorator = new TransparentResultDecorator(); 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()); assertTrue(actual.next());
} }
...@@ -45,7 +44,7 @@ public final class TransparentResultDecoratorTest { ...@@ -45,7 +44,7 @@ public final class TransparentResultDecoratorTest {
MergedResult mergedResult = mock(MergedResult.class); MergedResult mergedResult = mock(MergedResult.class);
when(mergedResult.next()).thenReturn(true); when(mergedResult.next()).thenReturn(true);
TransparentResultDecorator decorator = new TransparentResultDecorator(); 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()); assertTrue(actual.next());
} }
} }
...@@ -17,13 +17,13 @@ ...@@ -17,13 +17,13 @@
package org.apache.shardingsphere.infra.merge.fixture.decorator; 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.QueryResult;
import org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.queryresult.StreamQueryResult; 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.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.MergedResult;
import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; 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.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
...@@ -31,17 +31,17 @@ import java.sql.SQLException; ...@@ -31,17 +31,17 @@ import java.sql.SQLException;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
public final class ResultDecoratorFixture implements ResultDecorator { public final class ResultDecoratorFixture implements ResultDecorator<DecoratorRuleFixture> {
@Override @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); ResultSet resultSet = mock(ResultSet.class);
when(resultSet.getString(1)).thenReturn("decorated_value"); when(resultSet.getString(1)).thenReturn("decorated_value");
return new TransparentMergedResult(new StreamQueryResult(resultSet)); return new TransparentMergedResult(new StreamQueryResult(resultSet));
} }
@Override @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); ResultSet resultSet = mock(ResultSet.class);
when(resultSet.getString(1)).thenReturn("decorated_merged_value"); when(resultSet.getString(1)).thenReturn("decorated_merged_value");
return new TransparentMergedResult(new StreamQueryResult(resultSet)); return new TransparentMergedResult(new StreamQueryResult(resultSet));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册