init datamate

This commit is contained in:
Dallas98
2025-10-21 23:00:48 +08:00
commit 1c97afed7d
692 changed files with 135442 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.datamate</groupId>
<artifactId>data-mate-platform</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>operator-market-service</artifactId>
<name>Operator Market Service</name>
<description>算子市场服务</description>
<dependencies>
<dependency>
<groupId>com.datamate</groupId>
<artifactId>domain-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.26.1</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope> <!-- 编译时需要,运行时不需要 -->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,24 @@
package com.datamate.operator;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* Operator Market Service Configuration
* 算子市场服务配置类 - 版本、安装、评分、仓库
*/
@Configuration
@EnableAsync
@EnableScheduling
@EntityScan(basePackages = "com.datamate.operator.domain.modal")
@ComponentScan(basePackages = {
"com.datamate.operator",
"com.datamate.shared"
})
public class OperatorMarketServiceConfiguration {
// Service configuration class for JAR packaging
// 作为jar包形式提供服务的配置类
}

View File

@@ -0,0 +1,62 @@
package com.datamate.operator.application;
import com.datamate.operator.domain.modal.Category;
import com.datamate.operator.domain.modal.CategoryRelation;
import com.datamate.operator.infrastructure.persistence.mapper.CategoryMapper;
import com.datamate.operator.infrastructure.persistence.mapper.CategoryRelationMapper;
import com.datamate.operator.interfaces.dto.CategoryTreeResponse;
import com.datamate.operator.interfaces.dto.SubCategory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class CategoryService {
private final CategoryMapper categoryMapper;
private final CategoryRelationMapper categoryRelationMapper;
public List<CategoryTreeResponse> getAllCategories() {
List<Category> allCategories = categoryMapper.findAllCategories();
List<CategoryRelation> allRelations = categoryRelationMapper.findAllRelation();
Map<Integer, Integer> relationMap = allRelations.stream()
.collect(Collectors.groupingBy(
CategoryRelation::getCategoryId,
Collectors.collectingAndThen(Collectors.counting(), Math::toIntExact)));
Map<Integer, String> nameMap = allCategories.stream()
.collect(Collectors.toMap(Category::getId, Category::getName));
Map<Integer, List<Category>> groupedByParentId = allCategories.stream()
.filter(relation -> relation.getParentId() > 0)
.collect(Collectors.groupingBy(Category::getParentId));
return groupedByParentId.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.map(entry -> {
Integer parentId = entry.getKey();
List<Category> group = entry.getValue();
CategoryTreeResponse response = new CategoryTreeResponse();
response.setId(parentId);
response.setName(nameMap.get(parentId));
AtomicInteger totalCount = new AtomicInteger();
response.setCategories(group.stream().map(category -> {
SubCategory subCategory = new SubCategory();
subCategory.setId(category.getId());
subCategory.setName(category.getName());
subCategory.setCount(relationMap.getOrDefault(category.getId(), 0));
totalCount.getAndAdd(relationMap.getOrDefault(category.getId(), 0));
subCategory.setParentId(parentId);
return subCategory;
}).toList());
response.setCount(totalCount.get());
return response;
}).toList();
}
}

View File

@@ -0,0 +1,22 @@
package com.datamate.operator.application;
import com.datamate.operator.interfaces.dto.Label;
import com.datamate.operator.interfaces.dto.*;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Collections;
@Service
public class LabelService {
public List<Label> getLabels(Integer page, Integer size, String keyword) {
// TODO: 查询标签列表
return Collections.emptyList();
}
public void updateLabel(String id, List<Label> updateLabelRequest) {
// TODO: 更新标签
}
public void createLabels(Label labelsPostRequest) {
// TODO: 批量创建标签
}
}

View File

@@ -0,0 +1,76 @@
package com.datamate.operator.application;
import com.datamate.operator.domain.converter.OperatorConverter;
import com.datamate.operator.infrastructure.persistence.mapper.CategoryRelationMapper;
import com.datamate.operator.infrastructure.persistence.mapper.OperatorMapper;
import com.datamate.operator.interfaces.dto.CreateOperatorRequest;
import com.datamate.operator.interfaces.dto.OperatorResponse;
import com.datamate.operator.interfaces.dto.UpdateOperatorRequest;
import com.datamate.operator.interfaces.dto.*;
import com.datamate.operator.domain.modal.Operator;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Service
@RequiredArgsConstructor
public class OperatorService {
private final OperatorMapper operatorMapper;
private final CategoryRelationMapper relationMapper;
public List<OperatorResponse> getOperators(Integer page, Integer size, List<Integer> categories,
String operatorName, Boolean isStar) {
Integer offset = page * size;
List<Operator> filteredOperators = operatorMapper.findOperatorsByCriteria(size, offset, operatorName,
categories, isStar);
return filteredOperators.stream()
.map(OperatorConverter.INSTANCE::operatorToResponse).toList();
}
public int getOperatorsCount(List<Integer> categories, String operatorName, Boolean isStar) {
return operatorMapper.countOperatorsByCriteria(operatorName, categories, isStar);
}
public OperatorResponse getOperatorById(String id) {
Operator operator = operatorMapper.findOperatorById(id);
return OperatorConverter.INSTANCE.operatorToResponse(operator);
}
public OperatorResponse createOperator(CreateOperatorRequest req) {
Operator operator = new Operator();
operator.setId(req.getId());
operator.setName(req.getName());
operator.setDescription(req.getDescription());
operator.setVersion(req.getVersion());
operator.setInputs(req.getInputs());
operator.setOutputs(req.getOutputs());
operator.setRuntime(req.getRuntime());
operator.setSettings(req.getSettings());
operatorMapper.insertOperator(operator);
relationMapper.batchInsert(req.getId(), req.getCategories());
return OperatorConverter.INSTANCE.operatorToResponse(operator);
}
public OperatorResponse updateOperator(String id, UpdateOperatorRequest req) {
Operator operator = new Operator();
operator.setId(id);
operator.setName(req.getName());
operator.setDescription(req.getDescription());
operator.setVersion(req.getVersion());
operator.setInputs(req.getInputs());
operator.setOutputs(req.getOutputs());
operator.setRuntime(req.getRuntime());
operator.setSettings(req.getSettings());
operatorMapper.updateOperator(operator);
relationMapper.batchInsert(id, req.getCategories());
return getOperatorById(id);
}
public OperatorResponse uploadOperator(MultipartFile file, String description) {
// TODO: 文件上传与解析
return new OperatorResponse();
}
}

View File

@@ -0,0 +1,28 @@
package com.datamate.operator.domain.converter;
import com.datamate.operator.domain.modal.Operator;
import com.datamate.operator.interfaces.dto.OperatorResponse;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.mapstruct.factory.Mappers;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@Mapper
public interface OperatorConverter {
OperatorConverter INSTANCE = Mappers.getMapper(OperatorConverter.class);
@Mapping(target = "categories", source = "categories", qualifiedByName = "stringToList")
OperatorResponse operatorToResponse(Operator operator);
@Named("stringToList")
static List<Integer> stringToList(String input) {
if (input == null || input.isEmpty()) {
return Collections.emptyList();
}
return Arrays.stream(input.split(",")).map(Integer::valueOf).toList();
}
}

View File

@@ -0,0 +1,14 @@
package com.datamate.operator.domain.modal;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Category {
private Integer id;
private String name;
private Integer parentId;
}

View File

@@ -0,0 +1,12 @@
package com.datamate.operator.domain.modal;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class CategoryRelation {
private Integer categoryId;
private String operatorId;
}

View File

@@ -0,0 +1,35 @@
package com.datamate.operator.domain.modal;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
@Getter
@Setter
public class Operator {
private String id;
private String name;
private String description;
private String version;
private String inputs;
private String outputs;
private String categories;
private String runtime;
private String settings;
private Boolean isStar;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}

View File

@@ -0,0 +1,15 @@
package com.datamate.operator.domain.modal;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@AllArgsConstructor
public class RelationCategoryDTO {
private Integer categoryId;
private String operatorId;
private String name;
private Integer parentId;
}

View File

@@ -0,0 +1,12 @@
package com.datamate.operator.infrastructure.persistence.mapper;
import com.datamate.operator.domain.modal.Category;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface CategoryMapper {
List<Category> findAllCategories();
}

View File

@@ -0,0 +1,18 @@
package com.datamate.operator.infrastructure.persistence.mapper;
import com.datamate.operator.domain.modal.CategoryRelation;
import com.datamate.operator.domain.modal.RelationCategoryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface CategoryRelationMapper {
List<RelationCategoryDTO> findAllRelationWithCategory();
List<CategoryRelation> findAllRelation();
void batchInsert(@Param("operatorId") String operatorId, @Param("categories") List<Integer> categories);
}

View File

@@ -0,0 +1,27 @@
package com.datamate.operator.infrastructure.persistence.mapper;
import com.datamate.operator.domain.modal.Operator;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface OperatorMapper {
List<Operator> findAllOperators();
List<Operator> findOperatorsByCriteria(@Param("size") Integer size, @Param("offset") Integer offset,
@Param("operatorName") String operatorName,
@Param("categories") List<Integer> categories,
@Param("isStar") Boolean isStar);
Integer countOperatorsByCriteria(@Param("operatorName") String operatorName,
@Param("categories") List<Integer> categories,
@Param("isStar") Boolean isStar);
Operator findOperatorById(@Param("id") String id);
void updateOperator(Operator operator);
void insertOperator(Operator operator);
}

View File

@@ -0,0 +1,27 @@
package com.datamate.operator.interfaces.api;
import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse;
import com.datamate.operator.application.CategoryService;
import com.datamate.operator.interfaces.dto.CategoryTreeResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/categories")
@RequiredArgsConstructor
public class CategoryController {
private final CategoryService categoryService;
@GetMapping("/tree")
public ResponseEntity<Response<PagedResponse<CategoryTreeResponse>>> categoryTreeGet() {
List<CategoryTreeResponse> allCategories = categoryService.getAllCategories();
return ResponseEntity.ok(Response.ok(PagedResponse.of(allCategories)));
}
}

View File

@@ -0,0 +1,40 @@
package com.datamate.operator.interfaces.api;
import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse;
import com.datamate.operator.application.LabelService;
import com.datamate.operator.interfaces.dto.Label;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/labels")
@RequiredArgsConstructor
public class LabelController {
private final LabelService labelService;
@GetMapping
public ResponseEntity<Response<PagedResponse<Label>>> labelsGet(@RequestParam("page") Integer page,
@RequestParam("size") Integer size,
@RequestParam("keyword") String keyword) {
return ResponseEntity.ok(Response.ok(PagedResponse.of(labelService.getLabels(page, size, keyword))));
}
@PutMapping("/{id}")
public ResponseEntity<Response<Object>> labelsIdPut(@PathVariable("id") String id,
@RequestBody List<Label> updateLabelRequest) {
labelService.updateLabel(id, updateLabelRequest);
return ResponseEntity.ok(Response.ok(null));
}
@PostMapping
public ResponseEntity<Response<Object>> labelsPost(@RequestBody Label labelsPostRequest) {
labelService.createLabels(labelsPostRequest);
return ResponseEntity.ok(Response.ok(null));
}
}

View File

@@ -0,0 +1,54 @@
package com.datamate.operator.interfaces.api;
import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse;
import com.datamate.operator.application.OperatorService;
import com.datamate.operator.interfaces.dto.CreateOperatorRequest;
import com.datamate.operator.interfaces.dto.OperatorResponse;
import com.datamate.operator.interfaces.dto.OperatorsListPostRequest;
import com.datamate.operator.interfaces.dto.UpdateOperatorRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@RestController
@RequestMapping("/operators")
@RequiredArgsConstructor
public class OperatorController {
private final OperatorService operatorService;
@PostMapping("/list")
public ResponseEntity<Response<PagedResponse<OperatorResponse>>> operatorsListPost(@RequestBody OperatorsListPostRequest request) {
List<OperatorResponse> responses = operatorService.getOperators(request.getPage(), request.getSize(),
request.getCategories(), request.getOperatorName(), request.getIsStar());
int count = operatorService.getOperatorsCount(request.getCategories(), request.getOperatorName(),
request.getIsStar());
int totalPages = (count + request.getSize() + 1) / request.getSize();
return ResponseEntity.ok(Response.ok(PagedResponse.of(responses, request.getPage(), count, totalPages)));
}
@GetMapping("/{id}")
public ResponseEntity<Response<OperatorResponse>> operatorsIdGet(@PathVariable("id") String id) {
return ResponseEntity.ok(Response.ok(operatorService.getOperatorById(id)));
}
@PutMapping("/{id}")
public ResponseEntity<Response<OperatorResponse>> operatorsIdPut(@PathVariable("id") String id,
@RequestBody UpdateOperatorRequest updateOperatorRequest) {
return ResponseEntity.ok(Response.ok(operatorService.updateOperator(id, updateOperatorRequest)));
}
@PostMapping("/create")
public ResponseEntity<Response<OperatorResponse>> operatorsCreatePost(@RequestBody CreateOperatorRequest createOperatorRequest) {
return ResponseEntity.ok(Response.ok(operatorService.createOperator(createOperatorRequest)));
}
@PostMapping("/upload")
public ResponseEntity<Response<OperatorResponse>> operatorsUploadPost(@RequestPart(value = "file") MultipartFile file,
@RequestParam(value = "description") String description) {
return ResponseEntity.ok(Response.ok(operatorService.uploadOperator(file, description)));
}
}

View File

@@ -0,0 +1,22 @@
package com.datamate.operator.interfaces.dto;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
public class CategoryTreeResponse {
private Integer id;
private String name;
private Integer count;
private List<SubCategory> categories = new ArrayList<>();
}

View File

@@ -0,0 +1,36 @@
package com.datamate.operator.interfaces.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* CreateOperatorRequest
*/
@Getter
@Setter
public class CreateOperatorRequest {
private String id;
private String name;
private String description;
private String version;
private String inputs;
private String outputs;
private List<Integer> categories;
private String runtime;
private String settings;
private String fileName;
}

View File

@@ -0,0 +1,13 @@
package com.datamate.operator.interfaces.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Label {
private String id;
private String name;
}

View File

@@ -0,0 +1,43 @@
package com.datamate.operator.interfaces.dto;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
/**
* OperatorResponse
*/
@Getter
@Setter
public class OperatorResponse {
private String id;
private String name;
private String description;
private String version;
private String inputs;
private String outputs;
private List<Integer> categories;
private String runtime;
private String settings;
private Boolean isStar;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime createdAt;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime updatedAt;
}

View File

@@ -0,0 +1,30 @@
package com.datamate.operator.interfaces.dto;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
/**
* OperatorsListPostRequest
*/
@Getter
@Setter
public class OperatorsListPostRequest {
private Integer page;
private Integer size;
private List<Integer> categories = new ArrayList<>();
private String operatorName;
private String labelName;
private Boolean isStar;
}

View File

@@ -0,0 +1,18 @@
package com.datamate.operator.interfaces.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class SubCategory {
private long id;
private String name;
private long count;
private String type;
private long parentId;
}

View File

@@ -0,0 +1,32 @@
package com.datamate.operator.interfaces.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* UpdateOperatorRequest
*/
@Getter
@Setter
public class UpdateOperatorRequest {
private String name;
private String description;
private String version;
private String inputs;
private String outputs;
private List<Integer> categories;
private String runtime;
private String settings;
}

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.datamate.operator.infrastructure.persistence.mapper.CategoryMapper">
<select id="findAllCategories" resultType="com.datamate.operator.domain.modal.Category">
SELECT * FROM t_operator_category
</select>
</mapper>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.datamate.operator.infrastructure.persistence.mapper.CategoryRelationMapper">
<select id="findAllRelationWithCategory" resultType="com.datamate.operator.domain.modal.RelationCategoryDTO">
SELECT tc.id AS id, tcr.operator_id AS operatorId, tc.name AS name, tc.parent_id AS parentId
FROM t_operator_category_relation tcr
LEFT JOIN t_operator_category tc ON tcr.category_id = tc.id
</select>
<select id="findAllRelation" resultType="com.datamate.operator.domain.modal.CategoryRelation">
SELECT category_id, operator_id FROM t_operator_category_relation
</select>
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO t_operator_category_relation (operator_id, category_id)
VALUES
<foreach collection="categories" item="categoryId" separator=",">
(#{operatorId}, #{categoryId})
</foreach>
</insert>
</mapper>

View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.datamate.operator.infrastructure.persistence.mapper.OperatorMapper">
<select id="findAllOperators" resultType="com.datamate.operator.domain.modal.Operator">
SELECT id, name, description, version, inputs, outputs, runtime, settings, is_star, created_at, updated_at FROM
t_operator
</select>
<select id="findOperatorsByCriteria" parameterType="map" resultType="com.datamate.operator.domain.modal.Operator">
SELECT operator_id as id, operator_name as name, description, version, inputs, outputs, runtime, settings,
is_star, created_at, updated_at, GROUP_CONCAT(category_id ORDER BY created_at DESC SEPARATOR ',') AS categories
FROM v_operator
<where>
<if test="operatorName != null and operatorName != ''">
AND operator_name LIKE CONCAT('%', #{operatorName}, '%')
</if>
<if test="categories != null and !categories.isEmpty()">
AND category_id IN
<foreach collection="categories" item="category" open="(" separator="," close=")">
#{category}
</foreach>
</if>
<if test="isStar != null">
AND is_star = #{isStar}
</if>
</where>
GROUP BY operator_id
<if test="size != null and offset != null">
LIMIT ${size} OFFSET ${offset}
</if>
</select>
<select id="countOperatorsByCriteria" parameterType="map">
SELECT COUNT(DISTINCT operator_id) AS count
FROM v_operator
<where>
<if test="operatorName != null and operatorName != ''">
AND operator_name LIKE CONCAT('%', #{operatorName}, '%')
</if>
<if test="categories != null and !categories.isEmpty()">
AND category_id IN
<foreach collection="categories" item="category" open="(" separator="," close=")">
#{category}
</foreach>
</if>
<if test="isStar != null">
AND is_star = #{isStar}
</if>
</where>
</select>
<select id="findOperatorById" parameterType="string" resultType="com.datamate.operator.domain.modal.Operator">
SELECT operator_id as id, operator_name as name, description, version, inputs, outputs, runtime, settings,
is_star, created_at, updated_at, GROUP_CONCAT(category_id ORDER BY created_at DESC SEPARATOR ',') AS categories
FROM v_operator
WHERE operator_id = #{id}
</select>
<insert id="insertOperator" parameterType="com.datamate.operator.domain.modal.Operator">
INSERT INTO t_operator (id, name, description, version, inputs, outputs, runtime, settings, is_star, created_at, updated_at)
VALUES (#{id}, #{name}, #{description}, #{version}, #{inputs}, #{outputs}, #{runtime}, #{settings}, #{isStar}, NOW(), NOW())
</insert>
<update id="updateOperator" parameterType="com.datamate.operator.domain.modal.Operator">
UPDATE t_operator
<set>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="description != null and description != ''">
description = #{description},
</if>
<if test="version != null and version != ''">
version = #{version},
</if>
<if test="inputs != null and inputs != ''">
inputs = #{inputs},
</if>
<if test="outputs != null and outputs != ''">
outputs = #{outputs},
</if>
<if test="runtime != null and runtime != ''">
runtime = #{runtime},
</if>
<if test="settings != null and settings != ''">
settings = #{settings},
</if>
<if test="isStar != null">
is_star = #{isStar},
</if>
updated_at = NOW()
</set>
WHERE id = #{id}
</update>
</mapper>