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 <[email protected]>
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();
+ }
}