package photato.core; import photato.helpers.SearchQueryHelper; import photato.core.entities.PhotatoFolder; import photato.core.entities.PhotatoMedia; import photato.helpers.PartialStringIndex; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class SearchManager { private final PartialStringIndex<PhotatoMedia> mediasIndex; private final boolean indexFolderName; public SearchManager(boolean prefixOnlyMode, boolean indexFolderName) { this.mediasIndex = new PartialStringIndex<>(prefixOnlyMode); this.indexFolderName = indexFolderName; } public List<PhotatoMedia> searchMediasInFolder(Path folder, String searchQuery, boolean isVirtualFolder) { List<String> searched = SearchQueryHelper.getSplittedTerms(searchQuery); if (searched.isEmpty()) { return new ArrayList<>(); } List<Set<PhotatoMedia>> resultsTmp = searched.parallelStream() .map((String searchedTerm) -> this.mediasIndex.findContains(searchedTerm)) .map((Collection<PhotatoMedia> medias) -> medias.stream().filter((PhotatoMedia media) -> isVirtualFolder ? media.virtualPaths.stream().anyMatch((Path virtualPath) -> virtualPath.startsWith(folder)) : media.fsPath.startsWith(folder)).collect(Collectors.toSet())).collect(Collectors.toList()); Set<PhotatoMedia> result = resultsTmp.get(0); for (int i = 1; i < resultsTmp.size(); i++) { result = result.parallelStream().filter(resultsTmp.get(i)::contains).collect(Collectors.toSet()); } return new ArrayList<>(result); } public void addMedia(PhotatoFolder rootFolder, PhotatoMedia media) { String pictureName = media.fsPath.getFileName().toString(); pictureName = pictureName.substring(0, pictureName.lastIndexOf(".")); List<String> all = new ArrayList<>(); if (media.persons != null) { all.addAll(Arrays.asList(media.persons)); } if (media.tags != null) { all.addAll(Arrays.asList(media.tags)); } if (media.title != null) { all.add(media.title); } if (this.indexFolderName) { all.addAll(Arrays.asList(rootFolder.fsPath.relativize(media.fsPath.getParent()).toString().replace("\\", "/").split("/"))); } all.add(pictureName); if (media.position != null && media.position.coordinatesDescription != null) { all.addAll(SearchQueryHelper.getSplittedTerms(media.position.coordinatesDescription)); } for (String word : all) { List<String> terms = SearchQueryHelper.getSplittedTerms(word); for (String term : terms) { this.mediasIndex.add(term, media); } } } public void removeMedia(PhotatoMedia media) { this.mediasIndex.remove(media); } }