ContainerSearcher.java

package de.dlr.shepard.search.container;

import java.util.ArrayList;
import java.util.List;

import de.dlr.shepard.neo4Core.dao.SearchDAO;
import de.dlr.shepard.neo4Core.entities.FileContainer;
import de.dlr.shepard.neo4Core.entities.StructuredDataContainer;
import de.dlr.shepard.neo4Core.entities.TimeseriesContainer;
import de.dlr.shepard.neo4Core.io.BasicContainerIO;
import de.dlr.shepard.search.Neo4jEmitter;
import de.dlr.shepard.search.QueryValidator;
import de.dlr.shepard.util.Constants;

public class ContainerSearcher {

	private SearchDAO searchDAO = new SearchDAO();

	public ContainerSearchResult search(ContainerSearchBody containerSearchBody, String userName) {
		ContainerSearchParams containerSearchParams = containerSearchBody.getSearchParams();
		ContainerQueryType containerQueryType = containerSearchParams.getQueryType();
		QueryValidator.checkQuery(containerSearchBody.getSearchParams().getQuery());
		List<BasicContainerIO> resultList = switch (containerQueryType) {
		case FILE -> findFileContainerList(containerSearchParams, userName);
		case TIMESERIES -> findTimeseriesContainerList(containerSearchParams, userName);
		case STRUCTUREDDATA -> findStructuredDataContainerList(containerSearchParams, userName);
		default -> new ArrayList<>();
		};
		BasicContainerIO[] resultArray = resultList.toArray(new BasicContainerIO[0]);
		ContainerSearchResult containerSearchResult = new ContainerSearchResult(resultArray,
				containerSearchBody.getSearchParams());
		return containerSearchResult;
	}

	private List<BasicContainerIO> findFileContainerList(ContainerSearchParams params, String userName) {
		String neo4jSelectionQuery = Neo4jEmitter.emitFileContainerSelectionQuery(params.getQuery(), userName);
		List<FileContainer> resultContainers = searchDAO.findFileContainers(neo4jSelectionQuery,
				Constants.FILECONTAINER_IN_QUERY);
		List<BasicContainerIO> ret = resultContainers.stream().map(BasicContainerIO::new).toList();
		return ret;
	}

	private List<BasicContainerIO> findTimeseriesContainerList(ContainerSearchParams params, String userName) {
		String neo4jSelectionQuery = Neo4jEmitter.emitTimeseriesContainerSelectionQuery(params.getQuery(), userName);
		List<TimeseriesContainer> resultContainers = searchDAO.findTimeseriesContainers(neo4jSelectionQuery,
				Constants.TIMESERIESCONTAINER_IN_QUERY);
		List<BasicContainerIO> ret = resultContainers.stream().map(BasicContainerIO::new).toList();
		return ret;
	}

	private List<BasicContainerIO> findStructuredDataContainerList(ContainerSearchParams params, String userName) {
		String neo4jSelectionQuery = Neo4jEmitter.emitStructuredDataContainerSelectionQuery(params.getQuery(),
				userName);
		List<StructuredDataContainer> resultContainers = searchDAO.findStructuredDataContainers(neo4jSelectionQuery,
				Constants.STRUCTUREDDATACONTAINER_IN_QUERY);
		List<BasicContainerIO> ret = resultContainers.stream().map(BasicContainerIO::new).toList();
		return ret;
	}

}