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

Remove EncryptColumnMetaData (#8140)

* Decouple EncryptColumnMetaData

* Remove EncryptColumnMetaData
上级 84c641c2
......@@ -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
......
......@@ -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<EncryptRule> {
@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) {
......
......@@ -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;
}
......
......@@ -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> 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<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
public final Object getValue(final int columnIndex, final Class<?> type) throws SQLException {
if (1 == columnIndex) {
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 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
public final Object getCalendarValue(final int columnIndex, final Class<?> type, final Calendar calendar) throws SQLException {
throw new SQLFeatureNotSupportedException("");
......
......@@ -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;
}
......
......@@ -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<EncryptRule> {
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);
}
}
......@@ -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() {
......
......@@ -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<String, TableMetaData> 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<String, TableMetaData> 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<String, TableMetaData> 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<String, TableMetaData> 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<String, TableMetaData> 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);
}
}
......@@ -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());
......
......@@ -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());
}
}
......@@ -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
......
/*
* 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;
@Getter
@EqualsAndHashCode
@ToString
public class ColumnMetaData {
public final class ColumnMetaData {
private final String name;
......
......@@ -96,7 +96,7 @@ public final class MergeEngine {
for (Entry<ShardingSphereRule, ResultProcessEngine> 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<ShardingSphereRule, ResultProcessEngine> 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);
......
......@@ -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 <T> type of ShardingSphere rule
*/
public interface ResultDecorator {
public interface ResultDecorator<T extends ShardingSphereRule> {
/**
* 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;
}
......@@ -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<TransparentRule> {
@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;
}
}
......@@ -15,32 +15,12 @@
* limitations under the License.
*/
package org.apache.shardingsphere.encrypt.metadata;
package org.apache.shardingsphere.infra.merge.engine.decorator.impl;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
/**
* Column meta data for encrypt.
* Transparent rule.
*/
@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;
}
public final class TransparentRule implements ShardingSphereRule {
}
......@@ -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());
}
}
......@@ -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<DecoratorRuleFixture> {
@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));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册