diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java index 3836dbd9..2b5dbb64 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java @@ -60,6 +60,18 @@ public interface BaseDao { @UpdateProvider(type = BaseSqlProvider.class, method = "updateById") int updateById(Entity entity); + /** + * Partially update the entity by primary key. + */ + @UpdateProvider(type = BaseSqlProvider.class, method = "partialUpdateByIds") + int partialUpdateByIds(List entities); + // + // /** + // * Fully update the entity by primary key. + // */ + // @UpdateProvider(type = BaseSqlProvider.class, method = "updateByIds") + // int updateByIds(List entities); + /** * Query the entity by primary key. */ diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java index 335a5e56..be95624b 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java @@ -28,8 +28,6 @@ public interface HostDao extends BaseDao { - int saveAll(@Param("hosts") List hosts); - HostPO findByHostname(@Param("hostname") String hostname); List findAllByHostnameIn(@Param("hostnames") Collection hostnames); diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java index c951dfb3..3c8d3021 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java @@ -30,7 +30,5 @@ public interface RepoDao extends BaseDao { Optional findByRepoName(@Param("repoName") String clusterName); - int saveAll(@Param("clusters") List repos); - List findAllByClusterId(@Param("clusterId") Long clusterId); } diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java index e84a769c..5f074af7 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java @@ -71,6 +71,19 @@ public String partialUpdateById(Entity entity, ProviderContext context) return SQLBuilder.partialUpdate(tableMetaData, entity, databaseId); } + public String partialUpdateByIds(List entities, ProviderContext context) { + Assert.notNull(entities, "entities must not be null"); + Assert.notEmpty(entities, "entities list must not be empty"); + + String databaseId = context.getDatabaseId(); + + Class entityClass = entities.get(0).getClass(); + + TableMetaData tableMetaData = TableMetaData.forClass(entityClass); + + return SQLBuilder.partialUpdateList(tableMetaData, entities, databaseId); + } + public String updateById(Entity entity, ProviderContext context) { Assert.notNull(entity, "entity must not null"); diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java index e2911730..7f29b19b 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java @@ -37,6 +37,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -308,6 +309,96 @@ public static String update(TableMetaData tableMetaData, Entity entity, return sql.toString(); } + public static String escapeSingleQuote(String input) { + if (input != null) { + return input.replace("'", "''"); + } + return null; + } + + public static String partialUpdateList( + TableMetaData tableMetaData, List entities, String databaseId) { + if (entities == null || entities.isEmpty()) { + throw new IllegalArgumentException("Entities list must not be null or empty"); + } + + Class entityClass = entities.get(0).getClass(); + Map fieldColumnMap = tableMetaData.getFieldColumnMap(); + + SQL sql = new SQL(); + switch (DBType.toType(databaseId)) { + case MYSQL: { + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder + .append("UPDATE ") + .append(tableMetaData.getTableName()) + .append(" SET "); + Map setClauses = new LinkedHashMap<>(); + String primaryKey = "id"; + for (Map.Entry entry : fieldColumnMap.entrySet()) { + log.info("entry: {}", entry); + log.info("primaryKey: {}", tableMetaData.getPkProperty()); + // Ignore primary key + if (Objects.equals(entry.getKey(), tableMetaData.getPkProperty())) { + primaryKey = entry.getValue(); + continue; + } + + StringBuilder caseClause = new StringBuilder(); + caseClause.append(entry.getValue()).append(" = CASE "); + log.info(caseClause.toString()); + for (Entity entity : entities) { + PropertyDescriptor ps = BeanUtils.getPropertyDescriptor(entityClass, entry.getKey()); + if (ps == null || ps.getReadMethod() == null) { + continue; + } + + Object value = ReflectionUtils.invokeMethod(ps.getReadMethod(), entity); + if (!ObjectUtils.isEmpty(value)) { + PropertyDescriptor pkPs = + BeanUtils.getPropertyDescriptor(entityClass, tableMetaData.getPkProperty()); + Object pkValue = ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity); + + caseClause + .append("WHEN ") + .append(primaryKey) + .append(" = '") + .append(pkValue.toString()) + .append("' THEN '") + .append(escapeSingleQuote(value.toString())) + .append("' "); + } + } + + caseClause.append("END"); + setClauses.put(entry.getValue(), caseClause); + } + sqlBuilder.append(String.join(", ", setClauses.values())); + + sqlBuilder.append(" WHERE ").append(primaryKey).append(" IN ("); + String pkValues = entities.stream() + .map(entity -> { + PropertyDescriptor pkPs = + BeanUtils.getPropertyDescriptor(entityClass, tableMetaData.getPkProperty()); + Object pkValue = ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity); + return "'" + pkValue.toString() + "'"; + }) + .collect(Collectors.joining(", ")); + + sqlBuilder.append(pkValues).append(")"); + return sqlBuilder.toString(); + } + case POSTGRESQL: { + break; + } + default: { + log.error("Unsupported data source"); + } + } + + return sql.toString(); + } + public static String selectById(TableMetaData tableMetaData, String databaseId, Serializable id) { SQL sql = new SQL(); diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml index 4c475a71..ea168aff 100644 --- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml +++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml @@ -100,12 +100,4 @@ - - insert into host (hostname, ipv4, ipv6, os, arch, available_processors, free_memory_size, total_memory_size, free_disk, total_disk, state, cluster_id, create_by, update_by, create_time, update_time) - values - - (#{host.hostname}, #{host.ipv4}, #{host.ipv6}, #{host.os}, #{host.arch}, #{host.availableProcessors}, #{host.freeMemorySize}, #{host.totalMemorySize}, #{host.freeDisk}, #{host.totalDisk}, #{host.state}, #{host.clusterId} ,#{host.createBy},#{host.updateBy},#{host.createTime},#{host.updateTime}) - - - \ No newline at end of file diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml b/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml index cee5e868..d1f0d358 100644 --- a/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml +++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml @@ -40,14 +40,6 @@ limit 1 - - insert into repo (base_url, os, arch, repo_id, repo_name, repo_type, cluster_id, create_by, update_by, create_time, update_time) - values - - (#{cluster.baseUrl},#{cluster.os},#{cluster.arch},#{cluster.repoId},#{cluster.repoName},#{cluster.repoType},#{cluster.clusterId},#{cluster.createBy},#{cluster.updateBy},#{cluster.createTime},#{cluster.updateTime}) - - - - - insert into host (hostname, ipv4, ipv6, os, arch, available_processors, free_memory_size, total_memory_size, free_disk, total_disk, state, cluster_id, create_by, update_by, create_time, update_time) - values - - (#{host.hostname}, #{host.ipv4}, #{host.ipv6}, #{host.os}, #{host.arch}, #{host.availableProcessors}, #{host.freeMemorySize}, #{host.totalMemorySize}, #{host.freeDisk}, #{host.totalDisk}, #{host.state}, #{host.clusterId} ,#{host.createBy},#{host.updateBy},#{host.createTime},#{host.updateTime}) - - - \ No newline at end of file diff --git a/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml b/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml index cee5e868..d1f0d358 100644 --- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml +++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml @@ -40,14 +40,6 @@ limit 1 - - insert into repo (base_url, os, arch, repo_id, repo_name, repo_type, cluster_id, create_by, update_by, create_time, update_time) - values - - (#{cluster.baseUrl},#{cluster.os},#{cluster.arch},#{cluster.repoId},#{cluster.repoName},#{cluster.repoType},#{cluster.clusterId},#{cluster.createBy},#{cluster.updateBy},#{cluster.createTime},#{cluster.updateTime}) - - -