This is an automated email from the ASF dual-hosted git repository.
panjuan 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 8220f02 optimize the logic of findTableName to batch (#12016)
8220f02 is described below
commit 8220f02f56c6c990eab5e920b90bddc8071e2488
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Aug 26 18:08:28 2021 +0800
optimize the logic of findTableName to batch (#12016)
* optimize the logic of findTableName to batch
* rename variable
* optimize code
* fix test case
* fix test case
* fix test case
---
.../rewrite/condition/EncryptConditionEngine.java | 27 +++++++---
.../impl/EncryptPredicateColumnTokenGenerator.java | 25 +++++++---
.../impl/WhereClauseShardingConditionEngine.java | 26 +++++++---
.../infra/binder/segment/table/TablesContext.java | 57 +++++++++++++++++++---
.../binder/segment/table/TablesContextTest.java | 26 +++++-----
.../ShardingSQLRewriterParameterizedTest.java | 3 +-
6 files changed, 119 insertions(+), 45 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
index 2915db8..b47afdc 100644
---
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
+++
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
@@ -41,7 +41,10 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
+import java.util.stream.Collectors;
/**
* Encrypt condition engine.
@@ -68,8 +71,10 @@ public final class EncryptConditionEngine {
return Collections.emptyList();
}
List<EncryptCondition> result = new LinkedList<>();
- for (AndPredicate each :
ExpressionExtractUtil.getAndPredicates(whereSegment.get().getExpr())) {
- result.addAll(createEncryptConditions(sqlStatementContext, each));
+ Collection<AndPredicate> andPredicates =
ExpressionExtractUtil.getAndPredicates(whereSegment.get().getExpr());
+ Map<String, String> columnTableNames =
getColumnTableNames(sqlStatementContext, andPredicates);
+ for (AndPredicate each : andPredicates) {
+ result.addAll(createEncryptConditions(each.getPredicates(),
columnTableNames));
}
// FIXME process subquery
// for (SubqueryPredicateSegment each :
sqlStatementContext.getSqlStatement().findSQLSegments(SubqueryPredicateSegment.class))
{
@@ -80,23 +85,29 @@ public final class EncryptConditionEngine {
return result;
}
- private Collection<EncryptCondition> createEncryptConditions(final
SQLStatementContext sqlStatementContext, final AndPredicate andPredicate) {
+ private Collection<EncryptCondition> createEncryptConditions(final
Collection<ExpressionSegment> predicates, final Map<String, String>
columnTableNames) {
Collection<EncryptCondition> result = new LinkedList<>();
Collection<Integer> stopIndexes = new HashSet<>();
- for (ExpressionSegment predicate : andPredicate.getPredicates()) {
- if (stopIndexes.add(predicate.getStopIndex())) {
- createEncryptCondition(sqlStatementContext,
predicate).ifPresent(result::add);
+ for (ExpressionSegment each : predicates) {
+ if (stopIndexes.add(each.getStopIndex())) {
+ createEncryptCondition(each,
columnTableNames).ifPresent(result::add);
}
}
return result;
}
- private Optional<EncryptCondition> createEncryptCondition(final
SQLStatementContext sqlStatementContext, final ExpressionSegment expression) {
+ private Map<String, String> getColumnTableNames(final SQLStatementContext
sqlStatementContext, final Collection<AndPredicate> andPredicates) {
+ Collection<ColumnSegment> columns =
andPredicates.stream().flatMap(each -> each.getPredicates().stream())
+ .map(each ->
ColumnExtractor.extract(each).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
+ return sqlStatementContext.getTablesContext().findTableName(columns,
schema);
+ }
+
+ private Optional<EncryptCondition> createEncryptCondition(final
ExpressionSegment expression, final Map<String, String> columnTableNames) {
Optional<ColumnSegment> column = ColumnExtractor.extract(expression);
if (!column.isPresent()) {
return Optional.empty();
}
- Optional<String> tableName =
sqlStatementContext.getTablesContext().findTableName(column.get(), schema);
+ Optional<String> tableName =
Optional.ofNullable(columnTableNames.get(column.get().getQualifiedName()));
return tableName.isPresent() &&
encryptRule.findEncryptor(tableName.get(),
column.get().getIdentifier().getValue()).isPresent()
? createEncryptCondition(expression, tableName.get()) :
Optional.empty();
}
diff --git
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
index 1333d16..c2b705c 100644
---
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
+++
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
@@ -39,7 +39,10 @@ import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.LinkedList;
+import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
+import java.util.stream.Collectors;
/**
* Predicate column token generator for encrypt.
@@ -61,20 +64,22 @@ public final class EncryptPredicateColumnTokenGenerator
extends BaseEncryptSQLTo
Preconditions.checkState(((WhereAvailable)
sqlStatementContext).getWhere().isPresent());
Collection<SubstitutableColumnNameToken> result = new
LinkedHashSet<>();
ExpressionSegment expression = ((WhereAvailable)
sqlStatementContext).getWhere().get().getExpr();
- for (AndPredicate each :
ExpressionExtractUtil.getAndPredicates(expression)) {
- result.addAll(generateSQLTokens(sqlStatementContext, each));
+ Collection<AndPredicate> andPredicates =
ExpressionExtractUtil.getAndPredicates(expression);
+ Map<String, String> columnTableNames =
getColumnTableNames(sqlStatementContext, andPredicates);
+ for (AndPredicate each : andPredicates) {
+ result.addAll(generateSQLTokens(each.getPredicates(),
columnTableNames));
}
return result;
}
- private Collection<SubstitutableColumnNameToken> generateSQLTokens(final
SQLStatementContext sqlStatementContext, final AndPredicate andPredicate) {
+ private Collection<SubstitutableColumnNameToken> generateSQLTokens(final
Collection<ExpressionSegment> predicates, final Map<String, String>
columnTableNames) {
Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
- for (ExpressionSegment each : andPredicate.getPredicates()) {
+ for (ExpressionSegment each : predicates) {
Optional<ColumnSegment> column = ColumnExtractor.extract(each);
if (!column.isPresent()) {
continue;
}
- Optional<EncryptTable> encryptTable =
findEncryptTable(sqlStatementContext, column.get());
+ Optional<EncryptTable> encryptTable =
findEncryptTable(columnTableNames, column.get());
if (!encryptTable.isPresent() ||
!encryptTable.get().findEncryptorName(column.get().getIdentifier().getValue()).isPresent())
{
continue;
}
@@ -96,8 +101,14 @@ public final class EncryptPredicateColumnTokenGenerator
extends BaseEncryptSQLTo
return result;
}
- private Optional<EncryptTable> findEncryptTable(final SQLStatementContext
sqlStatementContext, final ColumnSegment column) {
- return sqlStatementContext.getTablesContext().findTableName(column,
schema).flatMap(tableName -> getEncryptRule().findEncryptTable(tableName));
+ private Map<String, String> getColumnTableNames(final SQLStatementContext
sqlStatementContext, final Collection<AndPredicate> andPredicates) {
+ Collection<ColumnSegment> columns =
andPredicates.stream().flatMap(each -> each.getPredicates().stream())
+ .map(each ->
ColumnExtractor.extract(each).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
+ return sqlStatementContext.getTablesContext().findTableName(columns,
schema);
+ }
+
+ private Optional<EncryptTable> findEncryptTable(final Map<String, String>
columnTableNames, final ColumnSegment column) {
+ return
Optional.ofNullable(columnTableNames.get(column.getQualifiedName())).flatMap(tableName
-> getEncryptRule().findEncryptTable(tableName));
}
private Collection<ColumnProjection> getColumnProjections(final String
columnName) {
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
index 2e0eb2d..7491d22 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
@@ -51,7 +51,9 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Objects;
import java.util.Optional;
+import java.util.stream.Collectors;
/**
* Sharding condition engine for where clause.
@@ -76,9 +78,11 @@ public final class WhereClauseShardingConditionEngine
implements ShardingConditi
}
private Collection<ShardingCondition> createShardingConditions(final
SQLStatementContext<?> sqlStatementContext, final ExpressionSegment
expressionSegment, final List<Object> parameters) {
+ Collection<AndPredicate> andPredicates =
ExpressionExtractUtil.getAndPredicates(expressionSegment);
+ Map<String, String> columnTableNames =
getColumnTableNames(sqlStatementContext, andPredicates);
Collection<ShardingCondition> result = new LinkedList<>();
- for (AndPredicate each :
ExpressionExtractUtil.getAndPredicates(expressionSegment)) {
- Map<Column, Collection<ShardingConditionValue>>
shardingConditionValues = createShardingConditionValueMap(sqlStatementContext,
each, parameters);
+ for (AndPredicate each : andPredicates) {
+ Map<Column, Collection<ShardingConditionValue>>
shardingConditionValues = createShardingConditionValueMap(each.getPredicates(),
parameters, columnTableNames);
if (shardingConditionValues.isEmpty()) {
return Collections.emptyList();
}
@@ -87,6 +91,12 @@ public final class WhereClauseShardingConditionEngine
implements ShardingConditi
return result;
}
+ private Map<String, String> getColumnTableNames(final
SQLStatementContext<?> sqlStatementContext, final Collection<AndPredicate>
andPredicates) {
+ Collection<ColumnSegment> columns =
andPredicates.stream().flatMap(each -> each.getPredicates().stream())
+ .map(each ->
ColumnExtractor.extract(each).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
+ return sqlStatementContext.getTablesContext().findTableName(columns,
schema);
+ }
+
private Collection<WhereSegment> getWhereSegments(final
SQLStatementContext<?> sqlStatementContext) {
Collection<WhereSegment> result = new LinkedList<>();
((WhereAvailable)
sqlStatementContext).getWhere().ifPresent(result::add);
@@ -97,16 +107,16 @@ public final class WhereClauseShardingConditionEngine
implements ShardingConditi
return result;
}
- private Map<Column, Collection<ShardingConditionValue>>
createShardingConditionValueMap(final SQLStatementContext<?>
sqlStatementContext,
-
final AndPredicate andPredicate, final List<Object> parameters) {
- Map<Column, Collection<ShardingConditionValue>> result = new
HashMap<>(andPredicate.getPredicates().size(), 1);
- for (ExpressionSegment each : andPredicate.getPredicates()) {
+ private Map<Column, Collection<ShardingConditionValue>>
createShardingConditionValueMap(final Collection<ExpressionSegment> predicates,
+
final List<Object> parameters, final Map<String, String>
columnTableNames) {
+ Map<Column, Collection<ShardingConditionValue>> result = new
HashMap<>(predicates.size(), 1);
+ for (ExpressionSegment each : predicates) {
Optional<ColumnSegment> columnSegment =
ColumnExtractor.extract(each);
if (!columnSegment.isPresent()) {
continue;
}
- Optional<String> tableName =
sqlStatementContext.getTablesContext().findTableName(columnSegment.get(),
schema);
- if (!(tableName.isPresent() &&
shardingRule.isShardingColumn(columnSegment.get().getIdentifier().getValue(),
tableName.get()))) {
+ Optional<String> tableName =
Optional.ofNullable(columnTableNames.get(columnSegment.get().getQualifiedName()));
+ if (!tableName.isPresent() ||
!shardingRule.isShardingColumn(columnSegment.get().getIdentifier().getValue(),
tableName.get())) {
continue;
}
Column column = new
Column(columnSegment.get().getIdentifier().getValue(), tableName.get());
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
index 13d3d7d..23b09d9 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
@@ -32,6 +32,8 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Optional;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
/**
* Tables context.
@@ -73,18 +75,22 @@ public final class TablesContext {
/**
* Find table name.
*
- * @param column column segment
+ * @param columns column segment collection
* @param schema schema meta data
- * @return table name
+ * @return table name map
*/
- public Optional<String> findTableName(final ColumnSegment column, final
ShardingSphereSchema schema) {
+ public Map<String, String> findTableName(final Collection<ColumnSegment>
columns, final ShardingSphereSchema schema) {
if (1 == uniqueTables.size()) {
- return Optional.of(uniqueTables.keySet().iterator().next());
- }
- if (column.getOwner().isPresent()) {
- return
findTableNameFromSQL(column.getOwner().get().getIdentifier().getValue());
+ String tableName = uniqueTables.keySet().iterator().next();
+ return
columns.stream().collect(Collectors.toMap(ColumnSegment::getQualifiedName, each
-> tableName, (oldValue, currentValue) -> oldValue));
}
- return findTableNameFromMetaData(column.getIdentifier().getValue(),
schema);
+ Map<String, String> result = new HashMap<>(columns.size(), 1);
+ Map<String, String> ownerColumnNames = columns.stream().filter(each ->
each.getOwner().isPresent()).collect(Collectors.toMap(each
+ -> each.getOwner().get().getIdentifier().getValue(),
ColumnSegment::getQualifiedName, (oldValue, currentValue) -> oldValue, () ->
new TreeMap<>(String.CASE_INSENSITIVE_ORDER)));
+ result.putAll(findTableNameFromSQL(ownerColumnNames));
+ Collection<String> columnNames = columns.stream().filter(each ->
!each.getOwner().isPresent()).map(each ->
each.getIdentifier().getValue()).collect(Collectors.toSet());
+ result.putAll(findTableNameFromMetaData(columnNames, schema));
+ return result;
}
/**
@@ -118,6 +124,41 @@ public final class TablesContext {
return Optional.empty();
}
+ private Map<String, String> findTableNameFromSQL(final Map<String, String>
ownerColumnNames) {
+ if (ownerColumnNames.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ Map<String, String> result = new HashMap<>(ownerColumnNames.size(), 1);
+ for (String each : uniqueTables.keySet()) {
+ if (ownerColumnNames.containsKey(each)) {
+ result.put(ownerColumnNames.get(each), each);
+ }
+ Optional<String> alias = uniqueTables.get(each).getAlias();
+ if (alias.isPresent() &&
ownerColumnNames.containsKey(alias.get())) {
+ result.put(ownerColumnNames.get(alias.get()), each);
+ }
+ }
+ return result;
+ }
+
+ private Map<String, String> findTableNameFromMetaData(final
Collection<String> columnNames, final ShardingSphereSchema schema) {
+ if (columnNames.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ Map<String, String> result = new HashMap<>();
+ for (String each : uniqueTables.keySet()) {
+ Collection<String> tableColumnNames =
schema.getAllColumnNames(each);
+ if (tableColumnNames.isEmpty()) {
+ continue;
+ }
+ tableColumnNames.retainAll(columnNames);
+ for (String columnName : tableColumnNames) {
+ result.put(columnName, each);
+ }
+ }
+ return result;
+ }
+
private Optional<String> findTableNameFromMetaData(final String
columnName, final ShardingSphereSchema schema) {
for (String each : uniqueTables.keySet()) {
if (schema.containsColumn(each, columnName)) {
diff --git
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContextTest.java
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContextTest.java
index cd87c3a..7da9e93 100644
---
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContextTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContextTest.java
@@ -29,13 +29,13 @@ import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Map;
import java.util.Optional;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -58,9 +58,9 @@ public final class TablesContextTest {
@Test
public void assertFindTableNameWhenSingleTable() {
SimpleTableSegment tableSegment = createTableSegment("table_1",
"tbl_1");
- Optional<String> actual = new
TablesContext(Collections.singletonList(tableSegment)).findTableName(createColumnSegment(),
mock(ShardingSphereSchema.class));
- assertTrue(actual.isPresent());
- assertThat(actual.get(), is("table_1"));
+ Map<String, String> actual = new
TablesContext(Collections.singletonList(tableSegment)).findTableName(Collections.singletonList(createColumnSegment()),
mock(ShardingSphereSchema.class));
+ assertFalse(actual.isEmpty());
+ assertThat(actual.get("col"), is("table_1"));
}
@Test
@@ -69,17 +69,17 @@ public final class TablesContextTest {
SimpleTableSegment tableSegment2 = createTableSegment("table_2",
"tbl_2");
ColumnSegment columnSegment = createColumnSegment();
columnSegment.setOwner(new OwnerSegment(0, 10, new
IdentifierValue("table_1")));
- Optional<String> actual = new
TablesContext(Arrays.asList(tableSegment1,
tableSegment2)).findTableName(columnSegment, mock(ShardingSphereSchema.class));
- assertTrue(actual.isPresent());
- assertThat(actual.get(), is("table_1"));
+ Map<String, String> actual = new
TablesContext(Arrays.asList(tableSegment1,
tableSegment2)).findTableName(Collections.singletonList(columnSegment),
mock(ShardingSphereSchema.class));
+ assertFalse(actual.isEmpty());
+ assertThat(actual.get("table_1.col"), is("table_1"));
}
@Test
public void assertFindTableNameWhenColumnSegmentOwnerAbsent() {
SimpleTableSegment tableSegment1 = createTableSegment("table_1",
"tbl_1");
SimpleTableSegment tableSegment2 = createTableSegment("table_2",
"tbl_2");
- Optional<String> actual = new
TablesContext(Arrays.asList(tableSegment1,
tableSegment2)).findTableName(createColumnSegment(),
mock(ShardingSphereSchema.class));
- assertFalse(actual.isPresent());
+ Map<String, String> actual = new
TablesContext(Arrays.asList(tableSegment1,
tableSegment2)).findTableName(Collections.singletonList(createColumnSegment()),
mock(ShardingSphereSchema.class));
+ assertTrue(actual.isEmpty());
}
@Test
@@ -87,10 +87,10 @@ public final class TablesContextTest {
SimpleTableSegment tableSegment1 = createTableSegment("table_1",
"tbl_1");
SimpleTableSegment tableSegment2 = createTableSegment("table_2",
"tbl_2");
ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
- when(schema.containsColumn(anyString(), anyString())).thenReturn(true);
- Optional<String> actual = new
TablesContext(Arrays.asList(tableSegment1,
tableSegment2)).findTableName(createColumnSegment(), schema);
- assertTrue(actual.isPresent());
- assertThat(actual.get(), is("table_1"));
+
when(schema.getAllColumnNames("table_1")).thenReturn(Collections.singletonList("col"));
+ Map<String, String> actual = new
TablesContext(Arrays.asList(tableSegment1,
tableSegment2)).findTableName(Collections.singletonList(createColumnSegment()),
schema);
+ assertFalse(actual.isEmpty());
+ assertThat(actual.get("col"), is("table_1"));
}
@Test
diff --git
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
index fdbcf44..1bd8390 100644
---
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
+++
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
@@ -35,6 +35,7 @@ import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.sql.Types;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
@@ -91,7 +92,7 @@ public final class ShardingSQLRewriterParameterizedTest
extends AbstractSQLRewri
when(result.containsTable("t_account")).thenReturn(true);
when(result.get("t_account")).thenReturn(accountTableMetaData);
when(result.get("t_account_detail")).thenReturn(mock(TableMetaData.class));
-
when(result.getAllColumnNames("t_account")).thenReturn(Arrays.asList("account_id",
"amount", "status"));
+ when(result.getAllColumnNames("t_account")).thenReturn(new
ArrayList<>(Arrays.asList("account_id", "amount", "status")));
when(result.containsColumn("t_account",
"account_id")).thenReturn(true);
return result;
}