Skip to content

Commit 747d47e

Browse files
authored
fix: fix the writing and query logic of dataset labels (#320)
1 parent 3541c05 commit 747d47e

File tree

6 files changed

+17
-49
lines changed

6 files changed

+17
-49
lines changed

backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ public PagedResponse<DatasetResponse> getDatasets(DatasetPagingQuery query) {
194194
/**
195195
* 处理标签名称,创建或获取标签
196196
*/
197-
private String processTagNames(List<String> tagNames) {
197+
private List<Tag> processTagNames(List<String> tagNames) {
198198
Set<Tag> tags = new HashSet<>();
199199
for (String tagName : tagNames) {
200200
Tag tag = tagMapper.findByName(tagName);
@@ -209,16 +209,7 @@ private String processTagNames(List<String> tagNames) {
209209
tagMapper.updateUsageCount(tag.getId(), tag.getUsageCount());
210210
tags.add(tag);
211211
}
212-
ObjectMapper mapper = new ObjectMapper();
213-
try {
214-
mapper.registerModule(new JavaTimeModule());
215-
// 可选:配置日期时间格式
216-
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
217-
return mapper.writeValueAsString(tags);
218-
} catch (JsonProcessingException e) {
219-
log.warn("Parse tags to json error.");
220-
return null;
221-
}
212+
return tags.stream().toList();
222213
}
223214

224215
/**

backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.baomidou.mybatisplus.annotation.TableField;
44
import com.baomidou.mybatisplus.annotation.TableName;
55
import com.datamate.common.domain.model.base.BaseEntity;
6+
import com.datamate.common.infrastructure.config.PgJsonTypeHandler;
67
import com.datamate.datamanagement.common.enums.DatasetStatusType;
78
import com.datamate.datamanagement.common.enums.DatasetType;
89
import lombok.Getter;
@@ -66,7 +67,8 @@ public class Dataset extends BaseEntity<String> {
6667
/**
6768
* 标签列表, JSON格式
6869
*/
69-
private String tags;
70+
@TableField(typeHandler = PgJsonTypeHandler.class)
71+
private List<Tag> tags;
7072
/**
7173
* 额外元数据,JSON格式
7274
*/

backend/services/data-management-service/src/main/java/com/datamate/datamanagement/infrastructure/persistence/repository/impl/DatasetRepositoryImpl.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,12 @@ public IPage<Dataset> findByCriteria(IPage<Dataset> page, DatasetPagingQuery que
6565
*/
6666
for (String tagName : query.getTags()) {
6767
wrapper.and(w ->
68-
w.apply("tags IS NOT NULL " +
69-
"AND JSON_VALID(tags) = 1 " +
70-
"AND JSON_LENGTH(tags) > 0 " +
71-
"AND JSON_SEARCH(tags, 'one', {0}, NULL, '$[*].name') IS NOT NULL", tagName)
68+
w.apply("EXISTS ( " +
69+
"SELECT 1 FROM jsonb_array_elements( " +
70+
"CASE WHEN jsonb_typeof(tags::jsonb) = 'array' THEN tags::jsonb ELSE '[]'::jsonb END " +
71+
") AS tag " +
72+
"WHERE tag->>'name' = {0} " +
73+
")", tagName)
7274
);
7375
}
7476
wrapper.orderByDesc(Dataset::getCreatedAt);

backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,8 @@
44
import com.datamate.datamanagement.domain.model.dataset.Dataset;
55
import com.datamate.datamanagement.domain.model.dataset.DatasetFile;
66
import com.datamate.datamanagement.domain.model.dataset.FileTag;
7-
import com.datamate.datamanagement.domain.model.dataset.Tag;
87
import com.datamate.datamanagement.interfaces.dto.*;
9-
import com.fasterxml.jackson.core.JsonProcessingException;
10-
import com.fasterxml.jackson.core.type.TypeReference;
11-
import com.fasterxml.jackson.databind.ObjectMapper;
12-
import com.fasterxml.jackson.databind.SerializationFeature;
13-
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
148
import org.apache.commons.collections4.CollectionUtils;
15-
import org.apache.commons.lang3.StringUtils;
169
import org.mapstruct.Mapper;
1710
import org.mapstruct.Mapping;
1811
import org.mapstruct.Named;
@@ -34,7 +27,6 @@ public interface DatasetConverter {
3427
@Mapping(source = "sizeBytes", target = "totalSize")
3528
@Mapping(source = "path", target = "targetLocation")
3629
@Mapping(source = "files", target = "distribution", qualifiedByName = "getDistribution")
37-
@Mapping(source = "tags", target = "tags", qualifiedByName = "getDatasetTags")
3830
DatasetResponse convertToResponse(Dataset dataset);
3931

4032
/**
@@ -91,28 +83,4 @@ default Map<String, Map<String, Long>> getDistribution(List<DatasetFile> dataset
9183
}
9284
return distribution;
9385
}
94-
95-
/**
96-
* 获取数据集标签
97-
*
98-
* @param datasetTag 数据集标签
99-
* @return 标签
100-
*/
101-
@Named("getDatasetTags")
102-
default List<TagResponse> getDatasetTags(String datasetTag) {
103-
List<TagResponse> tagResponses = new ArrayList<>();
104-
if (StringUtils.isBlank(datasetTag)) {
105-
return tagResponses;
106-
}
107-
ObjectMapper mapper = new ObjectMapper();
108-
try {
109-
mapper.registerModule(new JavaTimeModule());
110-
// 可选:配置日期时间格式
111-
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
112-
return mapper.readValue(datasetTag, new TypeReference<List<Tag>>() {
113-
}).stream().map(TagConverter.INSTANCE::convertToResponse).toList();
114-
} catch (Exception e) {
115-
return Collections.emptyList();
116-
}
117-
}
11886
}

backend/shared/domain-common/src/main/java/com/datamate/common/infrastructure/config/PgJsonTypeHandler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.apache.ibatis.type.MappedTypes;
77
import org.postgresql.util.PGobject;
88

9+
import java.lang.reflect.Field;
910
import java.sql.PreparedStatement;
1011
import java.sql.SQLException;
1112

@@ -18,6 +19,10 @@ public PgJsonTypeHandler(Class<?> type) {
1819
super(type);
1920
}
2021

22+
public PgJsonTypeHandler(Class<?> type, Field field) {
23+
super(type, field);
24+
}
25+
2126
@Override
2227
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
2328
// 1. 先借助父类转成 JSON 字符串

scripts/db/data-management-init.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS t_dm_datasets (
1414
file_count BIGINT DEFAULT 0,
1515
record_count BIGINT DEFAULT 0,
1616
retention_days INTEGER DEFAULT 0,
17-
tags TEXT,
17+
tags JSONB,
1818
metadata JSONB,
1919
status VARCHAR(50) DEFAULT 'DRAFT',
2020
is_public BOOLEAN DEFAULT FALSE,

0 commit comments

Comments
 (0)