Skip to content

Commit

Permalink
Add DatabaseRuleAwareRQLExecutor (#29794)
Browse files Browse the repository at this point in the history
* Add DatabaseRuleAwareRQLExecutor

* Add DatabaseRuleAwareRQLExecutor

* Add DatabaseRuleAwareRQLExecutor

* Add DatabaseRuleAwareRQLExecutor
  • Loading branch information
terrymanu authored Jan 21, 2024
1 parent 6506761 commit db35e1b
Show file tree
Hide file tree
Showing 49 changed files with 374 additions and 801 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@

package org.apache.shardingsphere.broadcast.distsql.handler.query;

import lombok.Setter;
import org.apache.shardingsphere.broadcast.distsql.statement.ShowBroadcastTableRulesStatement;
import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
import org.apache.shardingsphere.distsql.handler.type.rql.rule.RuleAwareRQLExecutor;
import org.apache.shardingsphere.distsql.handler.type.rql.aware.DatabaseRuleAwareRQLExecutor;
import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;

import java.util.Collection;
import java.util.Collections;
Expand All @@ -30,22 +30,26 @@
/**
* Show broadcast table rule executor.
*/
public final class ShowBroadcastTableRuleExecutor extends RuleAwareRQLExecutor<ShowBroadcastTableRulesStatement, BroadcastRule> {
@Setter
public final class ShowBroadcastTableRuleExecutor implements DatabaseRuleAwareRQLExecutor<ShowBroadcastTableRulesStatement, BroadcastRule> {

public ShowBroadcastTableRuleExecutor() {
super(BroadcastRule.class);
}
private BroadcastRule rule;

@Override
public Collection<String> getColumnNames() {
return Collections.singleton("broadcast_table");
}

@Override
public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereDatabase database, final ShowBroadcastTableRulesStatement sqlStatement, final BroadcastRule rule) {
public Collection<LocalDataQueryResultRow> getRows(final ShowBroadcastTableRulesStatement sqlStatement) {
return rule.getConfiguration().getTables().stream().map(LocalDataQueryResultRow::new).collect(Collectors.toList());
}

@Override
public Class<BroadcastRule> getRuleClass() {
return BroadcastRule.class;
}

@Override
public Class<ShowBroadcastTableRulesStatement> getType() {
return ShowBroadcastTableRulesStatement.class;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,15 @@
import org.apache.shardingsphere.broadcast.api.config.BroadcastRuleConfiguration;
import org.apache.shardingsphere.broadcast.distsql.statement.ShowBroadcastTableRulesStatement;
import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
import org.apache.shardingsphere.distsql.handler.type.rql.RQLExecutor;
import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.junit.jupiter.api.Test;

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
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.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Expand All @@ -43,40 +37,14 @@ class ShowBroadcastTableRuleExecutorTest {
@Test
void assertGetRowData() {
ShowBroadcastTableRuleExecutor executor = new ShowBroadcastTableRuleExecutor();
executor.setDatabase(mockDatabase());
executor.setRule(mockBroadcastRule());
Collection<LocalDataQueryResultRow> actual = executor.getRows(mock(ShowBroadcastTableRulesStatement.class));
assertThat(actual.size(), is(1));
Iterator<LocalDataQueryResultRow> iterator = actual.iterator();
LocalDataQueryResultRow row = iterator.next();
assertThat(row.getCell(1), is("t_address"));
}

@Test
void assertGetRowDataWithoutBroadcastRule() {
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
when(database.getRuleMetaData().findSingleRule(BroadcastRule.class)).thenReturn(Optional.empty());
ShowBroadcastTableRuleExecutor executor = new ShowBroadcastTableRuleExecutor();
executor.setDatabase(database);
Collection<LocalDataQueryResultRow> actual = executor.getRows(mock(ShowBroadcastTableRulesStatement.class));
assertTrue(actual.isEmpty());
}

@Test
void assertGetColumnNames() {
RQLExecutor<ShowBroadcastTableRulesStatement> executor = new ShowBroadcastTableRuleExecutor();
Collection<String> columns = executor.getColumnNames();
assertThat(columns.size(), is(1));
Iterator<String> iterator = columns.iterator();
assertThat(iterator.next(), is("broadcast_table"));
}

private ShardingSphereDatabase mockDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
RuleMetaData ruleMetaData = new RuleMetaData(Collections.singleton(mockBroadcastRule()));
when(result.getRuleMetaData()).thenReturn(ruleMetaData);
return result;
}

private BroadcastRule mockBroadcastRule() {
BroadcastRule result = mock(BroadcastRule.class);
BroadcastRuleConfiguration config = mock(BroadcastRuleConfiguration.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@

package org.apache.shardingsphere.encrypt.distsql.handler.query;

import org.apache.shardingsphere.distsql.handler.type.rql.rule.RuleAwareRQLExecutor;
import lombok.Setter;
import org.apache.shardingsphere.distsql.handler.type.rql.aware.DatabaseRuleAwareRQLExecutor;
import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnItemRuleConfiguration;
import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
Expand All @@ -26,7 +27,6 @@
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.props.PropertiesConverter;

import java.util.Arrays;
Expand All @@ -38,11 +38,10 @@
/**
* Show encrypt rule executor.
*/
public final class ShowEncryptRuleExecutor extends RuleAwareRQLExecutor<ShowEncryptRulesStatement, EncryptRule> {
@Setter
public final class ShowEncryptRuleExecutor implements DatabaseRuleAwareRQLExecutor<ShowEncryptRulesStatement, EncryptRule> {

public ShowEncryptRuleExecutor() {
super(EncryptRule.class);
}
private EncryptRule rule;

@Override
public Collection<String> getColumnNames() {
Expand All @@ -51,7 +50,7 @@ public Collection<String> getColumnNames() {
}

@Override
public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereDatabase database, final ShowEncryptRulesStatement sqlStatement, final EncryptRule rule) {
public Collection<LocalDataQueryResultRow> getRows(final ShowEncryptRulesStatement sqlStatement) {
EncryptRuleConfiguration ruleConfig = (EncryptRuleConfiguration) rule.getConfiguration();
return buildData(ruleConfig, sqlStatement);
}
Expand Down Expand Up @@ -88,6 +87,11 @@ private Object nullToEmptyString(final Object obj) {
return null == obj ? "" : obj;
}

@Override
public Class<EncryptRule> getRuleClass() {
return EncryptRule.class;
}

@Override
public Class<ShowEncryptRulesStatement> getType() {
return ShowEncryptRulesStatement.class;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.apache.shardingsphere.encrypt.distsql.handler.query;

import org.apache.shardingsphere.distsql.handler.type.rql.RQLExecutor;
import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnItemRuleConfiguration;
import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
Expand All @@ -27,8 +26,6 @@
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.junit.jupiter.api.Test;

import java.util.Collection;
Expand All @@ -38,7 +35,6 @@

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Expand All @@ -47,7 +43,9 @@ class ShowEncryptRuleExecutorTest {
@Test
void assertGetRowData() {
ShowEncryptRuleExecutor executor = new ShowEncryptRuleExecutor();
executor.setDatabase(mockDatabase());
EncryptRule rule = mock(EncryptRule.class);
when(rule.getConfiguration()).thenReturn(getRuleConfiguration());
executor.setRule(rule);
Collection<LocalDataQueryResultRow> actual = executor.getRows(mock(ShowEncryptRulesStatement.class));
assertThat(actual.size(), is(1));
Iterator<LocalDataQueryResultRow> iterator = actual.iterator();
Expand All @@ -65,33 +63,6 @@ void assertGetRowData() {
assertThat(row.getCell(11), is(""));
}

@Test
void assertGetColumnNames() {
RQLExecutor<ShowEncryptRulesStatement> executor = new ShowEncryptRuleExecutor();
Collection<String> columns = executor.getColumnNames();
assertThat(columns.size(), is(11));
Iterator<String> iterator = columns.iterator();
assertThat(iterator.next(), is("table"));
assertThat(iterator.next(), is("logic_column"));
assertThat(iterator.next(), is("cipher_column"));
assertThat(iterator.next(), is("assisted_query_column"));
assertThat(iterator.next(), is("like_query_column"));
assertThat(iterator.next(), is("encryptor_type"));
assertThat(iterator.next(), is("encryptor_props"));
assertThat(iterator.next(), is("assisted_query_type"));
assertThat(iterator.next(), is("assisted_query_props"));
assertThat(iterator.next(), is("like_query_type"));
assertThat(iterator.next(), is("like_query_props"));
}

private ShardingSphereDatabase mockDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
EncryptRule rule = mock(EncryptRule.class);
when(rule.getConfiguration()).thenReturn(getRuleConfiguration());
when(result.getRuleMetaData()).thenReturn(new RuleMetaData(Collections.singleton(rule)));
return result;
}

private RuleConfiguration getRuleConfiguration() {
EncryptColumnRuleConfiguration encryptColumnRuleConfig = new EncryptColumnRuleConfiguration("user_id", new EncryptColumnItemRuleConfiguration("user_cipher", "test"));
encryptColumnRuleConfig.setAssistedQuery(new EncryptColumnItemRuleConfiguration("user_assisted", "foo_assist_query_encryptor"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@

package org.apache.shardingsphere.mask.distsql.handler.query;

import org.apache.shardingsphere.distsql.handler.type.rql.rule.RuleAwareRQLExecutor;
import lombok.Setter;
import org.apache.shardingsphere.distsql.handler.type.rql.aware.DatabaseRuleAwareRQLExecutor;
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.props.PropertiesConverter;
import org.apache.shardingsphere.mask.api.config.rule.MaskTableRuleConfiguration;
import org.apache.shardingsphere.mask.distsql.statement.ShowMaskRulesStatement;
Expand All @@ -35,19 +35,18 @@
/**
* Show mask rule executor.
*/
public final class ShowMaskRuleExecutor extends RuleAwareRQLExecutor<ShowMaskRulesStatement, MaskRule> {
@Setter
public final class ShowMaskRuleExecutor implements DatabaseRuleAwareRQLExecutor<ShowMaskRulesStatement, MaskRule> {

public ShowMaskRuleExecutor() {
super(MaskRule.class);
}
private MaskRule rule;

@Override
public Collection<String> getColumnNames() {
return Arrays.asList("table", "column", "algorithm_type", "algorithm_props");
}

@Override
public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereDatabase database, final ShowMaskRulesStatement sqlStatement, final MaskRule rule) {
public Collection<LocalDataQueryResultRow> getRows(final ShowMaskRulesStatement sqlStatement) {
return rule.getConfiguration().getTables().stream().filter(each -> null == sqlStatement.getTableName() || each.getName().equals(sqlStatement.getTableName()))
.map(each -> buildColumnData(each, rule.getConfiguration().getMaskAlgorithms())).flatMap(Collection::stream).collect(Collectors.toList());
}
Expand All @@ -62,6 +61,11 @@ private Collection<LocalDataQueryResultRow> buildColumnData(final MaskTableRuleC
return result;
}

@Override
public Class<MaskRule> getRuleClass() {
return MaskRule.class;
}

@Override
public Class<ShowMaskRulesStatement> getType() {
return ShowMaskRulesStatement.class;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,8 @@

package org.apache.shardingsphere.mask.distsql.handler.query;

import org.apache.shardingsphere.distsql.handler.type.rql.RQLExecutor;
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.mask.api.config.MaskRuleConfiguration;
import org.apache.shardingsphere.mask.api.config.rule.MaskColumnRuleConfiguration;
import org.apache.shardingsphere.mask.api.config.rule.MaskTableRuleConfiguration;
Expand All @@ -32,13 +29,10 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Optional;
import java.util.Properties;

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.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Expand All @@ -47,7 +41,9 @@ class ShowMaskRuleExecutorTest {
@Test
void assertGetRowData() {
ShowMaskRuleExecutor executor = new ShowMaskRuleExecutor();
executor.setDatabase(mockDatabase());
MaskRule rule = mock(MaskRule.class);
when(rule.getConfiguration()).thenReturn(getRuleConfiguration());
executor.setRule(rule);
Collection<LocalDataQueryResultRow> actual = executor.getRows(mock(ShowMaskRulesStatement.class));
assertThat(actual.size(), is(1));
Iterator<LocalDataQueryResultRow> iterator = actual.iterator();
Expand All @@ -58,36 +54,6 @@ void assertGetRowData() {
assertThat(row.getCell(4), is(""));
}

@Test
void assertGetRowDataWithoutMaskRule() {
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
when(database.getRuleMetaData().findSingleRule(MaskRule.class)).thenReturn(Optional.empty());
ShowMaskRuleExecutor executor = new ShowMaskRuleExecutor();
executor.setDatabase(database);
Collection<LocalDataQueryResultRow> actual = executor.getRows(mock(ShowMaskRulesStatement.class));
assertTrue(actual.isEmpty());
}

@Test
void assertGetColumnNames() {
RQLExecutor<ShowMaskRulesStatement> executor = new ShowMaskRuleExecutor();
Collection<String> columns = executor.getColumnNames();
assertThat(columns.size(), is(4));
Iterator<String> iterator = columns.iterator();
assertThat(iterator.next(), is("table"));
assertThat(iterator.next(), is("column"));
assertThat(iterator.next(), is("algorithm_type"));
assertThat(iterator.next(), is("algorithm_props"));
}

private ShardingSphereDatabase mockDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
MaskRule rule = mock(MaskRule.class);
when(rule.getConfiguration()).thenReturn(getRuleConfiguration());
when(result.getRuleMetaData()).thenReturn(new RuleMetaData(Collections.singleton(rule)));
return result;
}

private MaskRuleConfiguration getRuleConfiguration() {
MaskColumnRuleConfiguration maskColumnRuleConfig = new MaskColumnRuleConfiguration("user_id", "t_mask_user_id_md5");
MaskTableRuleConfiguration maskTableRuleConfig = new MaskTableRuleConfiguration("t_mask", Collections.singleton(maskColumnRuleConfig));
Expand Down
Loading

0 comments on commit db35e1b

Please sign in to comment.