Skip to content

Commit

Permalink
TableMetadata and MappingColumn cache includes schema
Browse files Browse the repository at this point in the history
  • Loading branch information
HidekiSugimoto189 committed Aug 14, 2022
1 parent 1742075 commit 689f56b
Show file tree
Hide file tree
Showing 9 changed files with 255 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ abstract class AbstractExtractionCondition<T extends SqlFluent<T>> extends Abstr
AbstractExtractionCondition(final SqlAgent agent, final TableMetadata tableMetadata, final SqlContext context) {
super(agent, context);
this.tableMetadata = tableMetadata;
context.setSchema(tableMetadata.getSchema());
this.rawStrings = new ArrayList<>();
this.useOperator = false;
}
Expand Down
19 changes: 11 additions & 8 deletions src/main/java/jp/co/future/uroborosql/SqlAgentImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,7 @@ public <E> int insert(final E entity) {
context.setSqlKind(SqlKind.INSERT);

// 自動採番カラムの取得とcontextへの設定を行う
MappingColumn[] mappingColumns = MappingUtils.getMappingColumns(entityType);
MappingColumn[] mappingColumns = MappingUtils.getMappingColumns(metadata.getSchema(), entityType);
List<MappingColumn> autoGeneratedColumns = getAutoGeneratedColumns(context, mappingColumns, metadata,
entity);

Expand Down Expand Up @@ -955,11 +955,12 @@ public <E> int update(final E entity) {
handler.setUpdateParams(context, entity);
int count = handler.doUpdate(this, context, entity);

MappingUtils.getVersionMappingColumn(type).ifPresent(versionColumn -> {
MappingUtils.getVersionMappingColumn(metadata.getSchema(), type).ifPresent(versionColumn -> {
if (count == 0) {
throw new OptimisticLockException(context);
} else {
Map<String, MappingColumn> columnMap = MappingUtils.getMappingColumnMap(type, SqlKind.NONE);
Map<String, MappingColumn> columnMap = MappingUtils.getMappingColumnMap(metadata.getSchema(), type,
SqlKind.NONE);
Object[] keys = metadata.getColumns().stream()
.filter(TableMetadata.Column::isKey)
.sorted(Comparator.comparingInt(TableMetadata.Column::getKeySeq))
Expand Down Expand Up @@ -1086,7 +1087,8 @@ private <E> E mergeAndReturn(final E entity, final boolean locking) {
throw new IllegalArgumentException("Entity has no keys.");
}

Map<String, MappingColumn> mappingColumns = MappingUtils.getMappingColumnMap(type, SqlKind.UPDATE);
Map<String, MappingColumn> mappingColumns = MappingUtils.getMappingColumnMap(metadata.getSchema(), type,
SqlKind.UPDATE);

SqlEntityQuery<E> query = (SqlEntityQuery<E>) query(type);
for (TableMetadata.Column column : keyColumns) {
Expand Down Expand Up @@ -1269,7 +1271,7 @@ protected <E> int batchInsert(final Class<E> entityType, final Stream<E> entitie

if (isFirst) {
isFirst = false;
MappingColumn[] mappingColumns = MappingUtils.getMappingColumns(entityType);
MappingColumn[] mappingColumns = MappingUtils.getMappingColumns(metadata.getSchema(), entityType);
autoGeneratedColumns = getAutoGeneratedColumns(context, mappingColumns, metadata, entity);

// SQLのID項目IF分岐判定をtrueにするために値が設定されているID項目を保持しておく
Expand Down Expand Up @@ -1356,7 +1358,7 @@ protected <E> int bulkInsert(final Class<E> entityType, final Stream<E> entities

if (isFirst) {
isFirst = false;
MappingColumn[] mappingColumns = MappingUtils.getMappingColumns(entityType);
MappingColumn[] mappingColumns = MappingUtils.getMappingColumns(metadata.getSchema(), entityType);
autoGeneratedColumns = getAutoGeneratedColumns(context, mappingColumns, metadata, entity);

// SQLのID項目IF分岐判定をtrueにするために値が設定されているID項目を保持しておく
Expand Down Expand Up @@ -1442,7 +1444,8 @@ protected <E> int batchUpdate(final Class<E> entityType, final Stream<E> entitie
SqlContext context = handler.createBatchUpdateContext(this, metadata, entityType);
context.setSqlKind(SqlKind.BATCH_UPDATE);

Optional<MappingColumn> versionColumn = MappingUtils.getVersionMappingColumn(entityType);
Optional<MappingColumn> versionColumn = MappingUtils.getVersionMappingColumn(metadata.getSchema(),
entityType);
int entityCount = 0;
int updateCount = 0;
List<E> entityList = new ArrayList<>();
Expand Down Expand Up @@ -1476,7 +1479,7 @@ protected <E> int batchUpdate(final Class<E> entityType, final Stream<E> entitie
List<MappingColumn> keyColumns = metadata.getColumns().stream()
.filter(TableMetadata.Column::isKey)
.sorted(Comparator.comparingInt(TableMetadata.Column::getKeySeq))
.map(c -> MappingUtils.getMappingColumnMap(entityType, SqlKind.NONE)
.map(c -> MappingUtils.getMappingColumnMap(metadata.getSchema(), entityType, SqlKind.NONE)
.get(c.getCamelColumnName()))
.collect(Collectors.toList());

Expand Down
7 changes: 3 additions & 4 deletions src/main/java/jp/co/future/uroborosql/SqlEntityQueryImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ final class SqlEntityQueryImpl<E> extends AbstractExtractionCondition<SqlEntityQ
private ForUpdateType forUpdateType;
private int waitSeconds;

private List<? extends Column> list;
private final List<String> includeColumns;
private final List<String> excludeColumns;

Expand Down Expand Up @@ -256,7 +255,7 @@ public long count(final String col) {
@Override
public <T> T sum(final String col) {
String camelColumnName = CaseFormat.CAMEL_CASE.convert(col);
MappingColumn mappingColumn = MappingUtils.getMappingColumn(entityType, camelColumnName);
MappingColumn mappingColumn = MappingUtils.getMappingColumn(context().getSchema(), entityType, camelColumnName);
Class<?> rawType = mappingColumn.getJavaType().getRawType();
if (!(short.class.equals(rawType) ||
int.class.equals(rawType) ||
Expand Down Expand Up @@ -291,7 +290,7 @@ public <T> T sum(final String col) {
@Override
public <T> T min(final String col) {
String camelColumnName = CaseFormat.CAMEL_CASE.convert(col);
MappingColumn mappingColumn = MappingUtils.getMappingColumn(entityType, camelColumnName);
MappingColumn mappingColumn = MappingUtils.getMappingColumn(context().getSchema(), entityType, camelColumnName);
TableMetadata.Column column = tableMetadata.getColumn(camelColumnName);
StringBuilder sql = new StringBuilder("select min(t_.").append(column.getColumnIdentifier()).append(") as ")
.append(column.getColumnIdentifier()).append(" from (")
Expand All @@ -317,7 +316,7 @@ public <T> T min(final String col) {
@Override
public <T> T max(final String col) {
String camelColumnName = CaseFormat.CAMEL_CASE.convert(col);
MappingColumn mappingColumn = MappingUtils.getMappingColumn(entityType, camelColumnName);
MappingColumn mappingColumn = MappingUtils.getMappingColumn(context().getSchema(), entityType, camelColumnName);
TableMetadata.Column column = tableMetadata.getColumn(camelColumnName);
StringBuilder sql = new StringBuilder("select max(t_.").append(column.getColumnIdentifier()).append(") as ")
.append(column.getColumnIdentifier()).append(" from (")
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/jp/co/future/uroborosql/SqlQueryImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -258,8 +258,8 @@ public Stream<Map<String, Object>> stream(final CaseFormat caseFormat) {
*/
@Override
public <T> Stream<T> stream(final Class<T> type) {
return stream(
new EntityResultSetConverter<>(type, new PropertyMapperManager(this.agent.getSqlConfig().getClock())));
return stream(new EntityResultSetConverter<>(context().getSchema(), type,
new PropertyMapperManager(this.agent.getSqlConfig().getClock())));
}

}
15 changes: 15 additions & 0 deletions src/main/java/jp/co/future/uroborosql/context/SqlContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,21 @@ public interface SqlContext extends TransformContext, SqlFluent<SqlContext>, Pro
*/
SqlContext setSqlId(String sqlId);

/**
* SQLを実行するスキーマを取得
*
* @return スキーマ
*/
String getSchema();

/**
* SQLを実行するスキーマを設定
*
* @param schema スキーマ
* @return 自身のSqlContext
*/
SqlContext setSchema(String schema);

/**
* 最大リトライ回数 を取得する
*
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/jp/co/future/uroborosql/context/SqlContextImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ public boolean contains(final Object o) {
/** SQL文の識別子 */
private String sqlId;

/** SQLを実行するスキーマ */
private String schema;

/** SQL実行の最大リトライ数 */
private int maxRetryCount = 0;

Expand Down Expand Up @@ -303,6 +306,27 @@ public SqlContext setSqlId(final String sqlId) {
return this;
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.context.SqlContext#getSchema()
*/
@Override
public String getSchema() {
return this.schema;
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.context.SqlContext#setSchema(java.lang.String)
*/
@Override
public SqlContext setSchema(String schema) {
this.schema = schema;
return this;
}

/**
* {@inheritDoc}
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,21 @@ public class EntityResultSetConverter<E> implements ResultSetConverter<E> {
/**
* コンストラクタ
*
* @param schema スキーマ
* @param entityType エンティティタイプ
* @param mapperManager PropertyMapperManager
*/
@SuppressWarnings({ "unchecked" })
public EntityResultSetConverter(final Class<? extends E> entityType, final PropertyMapperManager mapperManager) {
public EntityResultSetConverter(String schema, final Class<? extends E> entityType,
final PropertyMapperManager mapperManager) {
this.mapperManager = mapperManager;
try {
this.constructor = (Constructor<E>) entityType.getConstructor();
} catch (NoSuchMethodException e) {
throw new UroborosqlRuntimeException(e);
}

this.mappingColumnMap = Arrays.stream(MappingUtils.getMappingColumns(entityType))
this.mappingColumnMap = Arrays.stream(MappingUtils.getMappingColumns(schema, entityType))
.collect(Collectors.toMap(c -> CaseFormat.UPPER_SNAKE_CASE.convert(c.getName()), Function.identity()));
}

Expand Down
Loading

0 comments on commit 689f56b

Please sign in to comment.