This is an automated email from the ASF dual-hosted git repository. sunnianjun pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new 2b38d67330a Remove MaskAlgorithmMetaData (#30550) 2b38d67330a is described below commit 2b38d67330a7e2bf73eaa2efc930f35f4a2e4de2 Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Tue Mar 19 23:01:23 2024 +0800 Remove MaskAlgorithmMetaData (#30550) --- .../mask/merge/MaskResultDecoratorEngine.java | 5 +- .../mask/merge/dql/MaskAlgorithmMetaData.java | 60 -------------------- .../mask/merge/dql/MaskDQLResultDecorator.java | 9 ++- .../mask/merge/dql/MaskMergedResult.java | 13 ++++- .../mask/merge/dql/MaskAlgorithmMetaDataTest.java | 64 ---------------------- .../mask/merge/dql/MaskDQLResultDecoratorTest.java | 5 +- .../mask/merge/dql/MaskMergedResultTest.java | 36 ++++++++---- .../select/projection/ProjectionsContext.java | 14 +++++ 8 files changed, 61 insertions(+), 145 deletions(-) diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java index a49a6236520..ff182069649 100644 --- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java +++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java @@ -24,7 +24,6 @@ import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecoratorEngine; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.mask.constant.MaskOrder; -import org.apache.shardingsphere.mask.merge.dql.MaskAlgorithmMetaData; import org.apache.shardingsphere.mask.merge.dql.MaskDQLResultDecorator; import org.apache.shardingsphere.mask.rule.MaskRule; @@ -38,9 +37,7 @@ public final class MaskResultDecoratorEngine implements ResultDecoratorEngine<Ma @Override public Optional<ResultDecorator<MaskRule>> newInstance(final ShardingSphereDatabase database, final MaskRule maskRule, final ConfigurationProperties props, final SQLStatementContext sqlStatementContext) { - return sqlStatementContext instanceof SelectStatementContext - ? Optional.of(new MaskDQLResultDecorator(new MaskAlgorithmMetaData(maskRule, (SelectStatementContext) sqlStatementContext))) - : Optional.empty(); + return sqlStatementContext instanceof SelectStatementContext ? Optional.of(new MaskDQLResultDecorator(maskRule, (SelectStatementContext) sqlStatementContext)) : Optional.empty(); } @Override diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaData.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaData.java deleted file mode 100644 index 129756092cf..00000000000 --- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaData.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mask.merge.dql; - -import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.binder.context.segment.select.projection.Projection; -import org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection; -import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; -import org.apache.shardingsphere.mask.rule.MaskRule; -import org.apache.shardingsphere.mask.spi.MaskAlgorithm; - -import java.util.List; -import java.util.Optional; - -/** - * Mask algorithm meta data. - */ -@RequiredArgsConstructor -public final class MaskAlgorithmMetaData { - - private final MaskRule maskRule; - - private final SelectStatementContext selectStatementContext; - - /** - * Find mask algorithm. - * - * @param columnIndex column index - * @return found mask algorithm - */ - @SuppressWarnings("rawtypes") - public Optional<MaskAlgorithm> findMaskAlgorithm(final int columnIndex) { - Optional<ColumnProjection> columnProjection = findColumnProjection(columnIndex); - return columnProjection.isPresent() ? maskRule.findAlgorithm(columnProjection.get().getOriginalTable().getValue(), columnProjection.get().getName().getValue()) : Optional.empty(); - } - - private Optional<ColumnProjection> findColumnProjection(final int columnIndex) { - List<Projection> expandProjections = selectStatementContext.getProjectionsContext().getExpandProjections(); - if (expandProjections.size() < columnIndex) { - return Optional.empty(); - } - Projection projection = expandProjections.get(columnIndex - 1); - return projection instanceof ColumnProjection ? Optional.of((ColumnProjection) projection) : Optional.empty(); - } -} diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecorator.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecorator.java index aa76c145926..ecb55cd2680 100644 --- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecorator.java +++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecorator.java @@ -19,6 +19,7 @@ package org.apache.shardingsphere.mask.merge.dql; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult; import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator; import org.apache.shardingsphere.infra.merge.result.MergedResult; @@ -31,15 +32,17 @@ import org.apache.shardingsphere.mask.rule.MaskRule; @RequiredArgsConstructor public final class MaskDQLResultDecorator implements ResultDecorator<MaskRule> { - private final MaskAlgorithmMetaData metaData; + private final MaskRule maskRule; + + private final SelectStatementContext selectStatementContext; @Override public MergedResult decorate(final QueryResult queryResult, final SQLStatementContext sqlStatementContext, final MaskRule rule) { - return new MaskMergedResult(metaData, new TransparentMergedResult(queryResult)); + return new MaskMergedResult(maskRule, selectStatementContext, new TransparentMergedResult(queryResult)); } @Override public MergedResult decorate(final MergedResult mergedResult, final SQLStatementContext sqlStatementContext, final MaskRule rule) { - return new MaskMergedResult(metaData, mergedResult); + return new MaskMergedResult(maskRule, selectStatementContext, mergedResult); } } diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResult.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResult.java index 80b8c753c95..882294053bb 100644 --- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResult.java +++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResult.java @@ -18,7 +18,10 @@ package org.apache.shardingsphere.mask.merge.dql; import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection; +import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.infra.merge.result.MergedResult; +import org.apache.shardingsphere.mask.rule.MaskRule; import org.apache.shardingsphere.mask.spi.MaskAlgorithm; import java.io.InputStream; @@ -33,7 +36,9 @@ import java.util.Optional; @RequiredArgsConstructor public final class MaskMergedResult implements MergedResult { - private final MaskAlgorithmMetaData metaData; + private final MaskRule maskRule; + + private final SelectStatementContext selectStatementContext; private final MergedResult mergedResult; @@ -45,7 +50,11 @@ public final class MaskMergedResult implements MergedResult { @SuppressWarnings({"rawtypes", "unchecked"}) @Override public Object getValue(final int columnIndex, final Class<?> type) throws SQLException { - Optional<MaskAlgorithm> maskAlgorithm = metaData.findMaskAlgorithm(columnIndex); + Optional<ColumnProjection> columnProjection = selectStatementContext.getProjectionsContext().findColumnProjection(columnIndex); + if (!columnProjection.isPresent()) { + return mergedResult.getValue(columnIndex, type); + } + Optional<MaskAlgorithm> maskAlgorithm = maskRule.findAlgorithm(columnProjection.get().getOriginalTable().getValue(), columnProjection.get().getName().getValue()); if (!maskAlgorithm.isPresent()) { return mergedResult.getValue(columnIndex, type); } diff --git a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaDataTest.java b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaDataTest.java deleted file mode 100644 index e094d83c979..00000000000 --- a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskAlgorithmMetaDataTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mask.merge.dql; - -import org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection; -import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mask.rule.MaskRule; -import org.apache.shardingsphere.mask.spi.MaskAlgorithm; -import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Answers; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.util.Collections; -import java.util.Optional; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -class MaskAlgorithmMetaDataTest { - - @Mock - private MaskRule maskRule; - - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private SelectStatementContext selectStatementContext; - - @SuppressWarnings("rawtypes") - @Test - void assertFindAlgorithmByColumnIndex() { - when(maskRule.findAlgorithm("t_order", "order_id")).thenReturn(Optional.of(TypedSPILoader.getService(MaskAlgorithm.class, "MD5"))); - ColumnProjection columnProjection = new ColumnProjection(null, "order_id", null, mock(DatabaseType.class)); - columnProjection.setOriginalColumn(new IdentifierValue("order_id")); - columnProjection.setOriginalTable(new IdentifierValue("t_order")); - when(selectStatementContext.getProjectionsContext().getExpandProjections()).thenReturn(Collections.singletonList(columnProjection)); - when(selectStatementContext.getTablesContext().getTableNames()).thenReturn(Collections.singleton("t_order")); - Optional<MaskAlgorithm> actual = new MaskAlgorithmMetaData(maskRule, selectStatementContext).findMaskAlgorithm(1); - assertTrue(actual.isPresent()); - assertThat(actual.get().getType(), is("MD5")); - } -} diff --git a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecoratorTest.java b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecoratorTest.java index c7de0b87622..943f15db615 100644 --- a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecoratorTest.java +++ b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecoratorTest.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.mask.merge.dql; +import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.mask.rule.MaskRule; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult; @@ -35,7 +36,7 @@ class MaskDQLResultDecoratorTest { void assertDecorateQueryResult() throws SQLException { QueryResult queryResult = mock(QueryResult.class); when(queryResult.next()).thenReturn(true); - MaskDQLResultDecorator decorator = new MaskDQLResultDecorator(mock(MaskAlgorithmMetaData.class)); + MaskDQLResultDecorator decorator = new MaskDQLResultDecorator(mock(MaskRule.class), mock(SelectStatementContext.class)); MergedResult actual = decorator.decorate(queryResult, mock(SQLStatementContext.class), mock(MaskRule.class)); assertTrue(actual.next()); } @@ -44,7 +45,7 @@ class MaskDQLResultDecoratorTest { void assertDecorateMergedResult() throws SQLException { MergedResult mergedResult = mock(MergedResult.class); when(mergedResult.next()).thenReturn(true); - MaskDQLResultDecorator decorator = new MaskDQLResultDecorator(mock(MaskAlgorithmMetaData.class)); + MaskDQLResultDecorator decorator = new MaskDQLResultDecorator(mock(MaskRule.class), mock(SelectStatementContext.class)); MergedResult actual = decorator.decorate(mergedResult, mock(SQLStatementContext.class), mock(MaskRule.class)); assertTrue(actual.next()); } diff --git a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResultTest.java b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResultTest.java index 3b62020b27e..a891b2c9f0c 100644 --- a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResultTest.java +++ b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResultTest.java @@ -17,7 +17,10 @@ package org.apache.shardingsphere.mask.merge.dql; +import org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection; +import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.infra.merge.result.MergedResult; +import org.apache.shardingsphere.mask.rule.MaskRule; import org.apache.shardingsphere.mask.spi.MaskAlgorithm; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -34,55 +37,68 @@ import java.util.Optional; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class MaskMergedResultTest { - @Mock - private MaskAlgorithmMetaData metaData; - @Mock private MergedResult mergedResult; @Test void assertNext() throws SQLException { - assertFalse(new MaskMergedResult(metaData, mergedResult).next()); + assertFalse(new MaskMergedResult(mock(MaskRule.class), mock(SelectStatementContext.class), mergedResult).next()); } @Test void assertGetValue() throws SQLException { when(mergedResult.getValue(1, Object.class)).thenReturn("VALUE"); + assertThat(new MaskMergedResult(mockMaskRule(), mockSelectStatementContext(), mergedResult).getValue(1, String.class), is("MASK_VALUE")); + } + + @SuppressWarnings("unchecked") + private MaskRule mockMaskRule() { MaskAlgorithm<String, String> maskAlgorithm = mock(MaskAlgorithm.class); when(maskAlgorithm.mask("VALUE")).thenReturn("MASK_VALUE"); - when(metaData.findMaskAlgorithm(1)).thenReturn(Optional.of(maskAlgorithm)); - assertThat(new MaskMergedResult(metaData, mergedResult).getValue(1, String.class), is("MASK_VALUE")); + MaskRule result = mock(MaskRule.class); + when(result.findAlgorithm("tbl", "col")).thenReturn(Optional.of(maskAlgorithm)); + return result; + } + + private SelectStatementContext mockSelectStatementContext() { + ColumnProjection columnProjection = mock(ColumnProjection.class, RETURNS_DEEP_STUBS); + when(columnProjection.getOriginalTable().getValue()).thenReturn("tbl"); + when(columnProjection.getName().getValue()).thenReturn("col"); + SelectStatementContext result = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); + when(result.getProjectionsContext().findColumnProjection(1)).thenReturn(Optional.of(columnProjection)); + return result; } @Test void assertGetCalendarValue() throws SQLException { Calendar calendar = Calendar.getInstance(); when(mergedResult.getCalendarValue(1, Date.class, calendar)).thenReturn(new Date(0L)); - assertThat(new MaskMergedResult(metaData, mergedResult).getCalendarValue(1, Date.class, calendar), is(new Date(0L))); + assertThat(new MaskMergedResult(mock(MaskRule.class), mock(SelectStatementContext.class), mergedResult).getCalendarValue(1, Date.class, calendar), is(new Date(0L))); } @Test void assertGetInputStream() throws SQLException { InputStream inputStream = mock(InputStream.class); when(mergedResult.getInputStream(1, "asc")).thenReturn(inputStream); - assertThat(new MaskMergedResult(metaData, mergedResult).getInputStream(1, "asc"), is(inputStream)); + assertThat(new MaskMergedResult(mock(MaskRule.class), mock(SelectStatementContext.class), mergedResult).getInputStream(1, "asc"), is(inputStream)); } @Test void assertGetCharacterStream() throws SQLException { Reader reader = mock(Reader.class); when(mergedResult.getCharacterStream(1)).thenReturn(reader); - assertThat(new MaskMergedResult(metaData, mergedResult).getCharacterStream(1), is(reader)); + assertThat(new MaskMergedResult(mock(MaskRule.class), mock(SelectStatementContext.class), mergedResult).getCharacterStream(1), is(reader)); } @Test void assertWasNull() throws SQLException { - assertFalse(new MaskMergedResult(metaData, mergedResult).wasNull()); + assertFalse(new MaskMergedResult(mock(MaskRule.class), mock(SelectStatementContext.class), mergedResult).wasNull()); } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/ProjectionsContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/ProjectionsContext.java index 63594e4d669..c630bbf7624 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/ProjectionsContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/ProjectionsContext.java @@ -169,4 +169,18 @@ public final class ProjectionsContext { } return false; } + + /** + * Find column projection. + * + * @param columnIndex column index + * @return found column projection + */ + public Optional<ColumnProjection> findColumnProjection(final int columnIndex) { + if (expandProjections.size() < columnIndex) { + return Optional.empty(); + } + Projection projection = expandProjections.get(columnIndex - 1); + return projection instanceof ColumnProjection ? Optional.of((ColumnProjection) projection) : Optional.empty(); + } }