feat: add global search api

This commit is contained in:
vran 2022-05-15 23:31:31 +08:00
parent 59570a9ee6
commit e416006793
8 changed files with 186 additions and 2 deletions

View File

@ -182,4 +182,8 @@ public interface Routes {
String GET_SQL_MOCK_DATA = BASE + "/groups/{groupId}/projects/{projectId}/mock_data/sql";
}
interface Search {
String SEARCH = BASE + "/search";
}
}

View File

@ -0,0 +1,27 @@
package com.databasir.api;
import com.databasir.common.JsonData;
import com.databasir.core.domain.search.SearchService;
import com.databasir.core.domain.search.data.SearchResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@Validated
@Tag(name = "SearchController", description = "全局搜索 API")
public class SearchController {
private final SearchService searchService;
@GetMapping(Routes.Search.SEARCH)
@Operation(summary = "搜索")
public JsonData<SearchResponse> search(@RequestParam(name = "query") String keyword) {
return JsonData.ok(searchService.search(keyword));
}
}

View File

@ -0,0 +1,33 @@
package com.databasir.core.domain.search;
import com.databasir.core.domain.search.converter.SearchResponseConverter;
import com.databasir.core.domain.search.data.SearchResponse;
import com.databasir.dao.impl.GroupDao;
import com.databasir.dao.impl.ProjectDao;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class SearchService {
private final ProjectDao projectDao;
private final GroupDao groupDao;
private final SearchResponseConverter searchResponseConverter;
public SearchResponse search(String query) {
var groupPojoList = groupDao.selectByName(query);
var groupResults = searchResponseConverter.toGroupResults(groupPojoList);
var projectList = projectDao.selectByProjectNameOrDatabaseOrSchemaOrGroup(query);
var projectResults = searchResponseConverter.toProjectResults(projectList);
// build response
SearchResponse response = new SearchResponse();
response.setGroups(groupResults);
response.setProjects(projectResults);
// TODO support Table search
return response;
}
}

View File

@ -0,0 +1,16 @@
package com.databasir.core.domain.search.converter;
import com.databasir.core.domain.search.data.SearchResponse;
import com.databasir.dao.tables.pojos.GroupPojo;
import com.databasir.dao.value.ProjectQueryPojo;
import org.mapstruct.Mapper;
import java.util.List;
@Mapper(componentModel = "spring")
public interface SearchResponseConverter {
List<SearchResponse.GroupSearchResult> toGroupResults(List<GroupPojo> groups);
List<SearchResponse.ProjectSearchResult> toProjectResults(List<ProjectQueryPojo> projects);
}

View File

@ -0,0 +1,51 @@
package com.databasir.core.domain.search.data;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Collections;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SearchResponse {
@Builder.Default
private List<GroupSearchResult> groups = Collections.emptyList();
@Builder.Default
private List<ProjectSearchResult> projects = Collections.emptyList();
@Data
public static class GroupSearchResult {
private Integer id;
private String name;
private String description;
}
@Data
public static class ProjectSearchResult {
private Integer projectId;
private Integer groupId;
private String groupName;
private String projectName;
private String projectDescription;
private String databaseName;
private String schemaName;
}
}

View File

@ -69,4 +69,12 @@ public class GroupDao extends BaseDao<GroupPojo> {
.where(GROUP.ID.in(ids))
.fetchInto(GroupPojo.class);
}
public List<GroupPojo> selectByName(String nameContains) {
return getDslContext()
.select(GROUP.fields()).from(GROUP)
.where(GROUP.NAME.contains(nameContains))
.and(GROUP.DELETED.eq(false))
.fetchInto(GroupPojo.class);
}
}

View File

@ -2,6 +2,7 @@ package com.databasir.dao.impl;
import com.databasir.dao.tables.pojos.ProjectPojo;
import com.databasir.dao.value.GroupProjectCountPojo;
import com.databasir.dao.value.ProjectQueryPojo;
import lombok.Getter;
import org.jooq.Condition;
import org.jooq.DSLContext;
@ -19,8 +20,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import static com.databasir.dao.Tables.DATA_SOURCE;
import static com.databasir.dao.Tables.PROJECT;
import static com.databasir.dao.Tables.*;
@Repository
public class ProjectDao extends BaseDao<ProjectPojo> {
@ -126,4 +126,28 @@ public class ProjectDao extends BaseDao<ProjectPojo> {
.where(PROJECT.ID.in(projectIds))
.fetchMap(PROJECT.ID, PROJECT.GROUP_ID);
}
public List<ProjectQueryPojo> selectByProjectNameOrDatabaseOrSchemaOrGroup(String query) {
return getDslContext()
.select(
PROJECT.ID.as("project_id"),
PROJECT.NAME.as("project_name"),
PROJECT.DESCRIPTION.as("project_description"),
DATA_SOURCE.DATABASE_NAME,
DATA_SOURCE.SCHEMA_NAME,
GROUP.NAME.as("group_name"),
GROUP.ID.as("group_id")
)
.from(PROJECT)
.leftJoin(DATA_SOURCE).on(DATA_SOURCE.PROJECT_ID.eq(PROJECT.ID))
.leftJoin(GROUP).on(GROUP.ID.eq(PROJECT.GROUP_ID))
.where(PROJECT.DELETED.eq(false)
.and(GROUP.DELETED.eq(false))
.and(PROJECT.NAME.contains(query)
.or(DATA_SOURCE.DATABASE_NAME.contains(query))
.or(DATA_SOURCE.SCHEMA_NAME.contains(query))
.or(GROUP.NAME.contains(query)))
)
.fetchInto(ProjectQueryPojo.class);
}
}

View File

@ -0,0 +1,21 @@
package com.databasir.dao.value;
import lombok.Data;
@Data
public class ProjectQueryPojo {
private Integer projectId;
private Integer groupId;
private String groupName;
private String projectName;
private String projectDescription;
private String databaseName;
private String schemaName;
}