From 7dc7e02abbfd397b13d9ae3291a7724fac8829e0 Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Wed, 11 Sep 2024 09:22:40 +0200 Subject: [PATCH] feat: default no-op indexer and searcher added, no enforcement to download a search plugin #4459 --- .../micaConfig/service/PluginsService.java | 39 ++++--- .../obiba/mica/search/SearchEngineClient.java | 10 +- .../mica/search/SearchEngineIndexer.java | 10 +- .../mica/search/basic/DefaultIndexer.java | 106 +++++++++++++++++ .../mica/search/basic/DefaultSearcher.java | 107 ++++++++++++++++++ .../search/basic/EmptyDocumentResults.java | 38 +++++++ mica-webapp/src/main/conf/application-dev.yml | 2 +- 7 files changed, 291 insertions(+), 21 deletions(-) create mode 100644 mica-search/src/main/java/org/obiba/mica/search/basic/DefaultIndexer.java create mode 100644 mica-search/src/main/java/org/obiba/mica/search/basic/DefaultSearcher.java create mode 100644 mica-search/src/main/java/org/obiba/mica/search/basic/EmptyDocumentResults.java diff --git a/mica-core/src/main/java/org/obiba/mica/micaConfig/service/PluginsService.java b/mica-core/src/main/java/org/obiba/mica/micaConfig/service/PluginsService.java index 46f35a77e5..a594fec7c2 100644 --- a/mica-core/src/main/java/org/obiba/mica/micaConfig/service/PluginsService.java +++ b/mica-core/src/main/java/org/obiba/mica/micaConfig/service/PluginsService.java @@ -52,12 +52,8 @@ public class PluginsService implements EnvironmentAware, InitializingBean { private static final String MICA_TAXONOMIES_PLUGIN_TYPE = "mica-taxonomies"; - - private static final String MICA_SEARCH_PLUGIN_NAME = "plugins.micaSearchPlugin"; - private static final String DEFAULT_MICA_SEARCH_PLUGIN_NAME = "mica-search-es8"; - private static final String DEFAULT_PLUGINS_UPDATE_SITE = "https://plugins.obiba.org"; private static final String[] ES_CONFIGURATION = new String[]{"elasticsearch.dataNode", "elasticsearch.clusterName", "elasticsearch.shards", "elasticsearch.replicas", @@ -87,6 +83,10 @@ public void setEnvironment(Environment environment) { this.environment = environment; } + public boolean hasSearchEngineService() { + return !getServicePlugins(SearchEngineService.class).isEmpty(); + } + public SearchEngineService getSearchEngineService() { return (SearchEngineService) getServicePlugins(SearchEngineService.class).iterator().next(); } @@ -305,7 +305,7 @@ public void afterPropertiesSet() throws Exception { } public String getSearchPluginName() { - return environment.getProperty(MICA_SEARCH_PLUGIN_NAME, DEFAULT_MICA_SEARCH_PLUGIN_NAME); + return environment.getProperty(MICA_SEARCH_PLUGIN_NAME); } /** @@ -315,19 +315,22 @@ private void initPlugins() { Collection plugins = getPlugins(true); String searchPluginName = getSearchPluginName(); - try { - String pluginLatestVersion = getPluginRepositoryCache().getPluginLatestVersion(searchPluginName); - // ensure there is a mica-search plugin installed - if (plugins.stream().noneMatch(p -> MICA_SEARCH_PLUGIN_TYPE.equals(p.getType())) - || plugins.stream() - .filter(plugin -> searchPluginName.equals(plugin.getName())) - .filter(plugin -> plugin.getVersion().compareTo(new Version(pluginLatestVersion)) >= 0).count() == 0) { - installPlugin(searchPluginName, null); - // rescan plugins - plugins = getPlugins(true); + // will use embedded default + if (!Strings.isNullOrEmpty(searchPluginName)) { + try { + String pluginLatestVersion = getPluginRepositoryCache().getPluginLatestVersion(searchPluginName); + // ensure there is a mica-search plugin installed + if (plugins.stream().noneMatch(p -> MICA_SEARCH_PLUGIN_TYPE.equals(p.getType())) + || plugins.stream() + .filter(plugin -> searchPluginName.equals(plugin.getName())) + .filter(plugin -> plugin.getVersion().compareTo(new Version(pluginLatestVersion)) >= 0).count() == 0) { + installPlugin(searchPluginName, null); + // rescan plugins + plugins = getPlugins(true); + } + } catch (PluginRepositoryException e) { + log.error("Cannot initialize plugins properly", e); } - } catch (PluginRepositoryException e) { - log.error("Cannot initialize plugins properly", e); } boolean micaSearchFound = false; // mica-search plugin is a singleton @@ -336,7 +339,7 @@ private void initPlugins() { || MICA_TABLES_PLUGIN_TYPE.equals(plugin.getType()) || MICA_TAXONOMIES_PLUGIN_TYPE.equals(plugin.getType())) .sorted(Comparator.comparing(PluginResources::getVersion)) - .collect(Collectors.toList()); + .toList(); for (PluginResources plugin : filteredPlugins) { if (MICA_SEARCH_PLUGIN_TYPE.equals(plugin.getType()) && !micaSearchFound) { diff --git a/mica-search/src/main/java/org/obiba/mica/search/SearchEngineClient.java b/mica-search/src/main/java/org/obiba/mica/search/SearchEngineClient.java index 8e60a52047..c1807be5fe 100644 --- a/mica-search/src/main/java/org/obiba/mica/search/SearchEngineClient.java +++ b/mica-search/src/main/java/org/obiba/mica/search/SearchEngineClient.java @@ -11,6 +11,7 @@ package org.obiba.mica.search; import org.obiba.mica.micaConfig.service.PluginsService; +import org.obiba.mica.search.basic.DefaultSearcher; import org.obiba.mica.spi.search.QueryScope; import org.obiba.mica.spi.search.Searcher; import org.obiba.mica.spi.search.support.JoinQuery; @@ -31,8 +32,15 @@ public class SearchEngineClient implements Searcher { @Inject private PluginsService pluginsService; + private Searcher defaultSearcher; + private Searcher getSearcher() { - return pluginsService.getSearchEngineService().getSearcher(); + if (pluginsService.hasSearchEngineService()) + return pluginsService.getSearchEngineService().getSearcher(); + if (defaultSearcher == null) { + defaultSearcher = new DefaultSearcher(); + } + return defaultSearcher; } @Override diff --git a/mica-search/src/main/java/org/obiba/mica/search/SearchEngineIndexer.java b/mica-search/src/main/java/org/obiba/mica/search/SearchEngineIndexer.java index 01a25955cb..60b7e01d7c 100644 --- a/mica-search/src/main/java/org/obiba/mica/search/SearchEngineIndexer.java +++ b/mica-search/src/main/java/org/obiba/mica/search/SearchEngineIndexer.java @@ -11,6 +11,7 @@ package org.obiba.mica.search; import org.obiba.mica.micaConfig.service.PluginsService; +import org.obiba.mica.search.basic.DefaultIndexer; import org.obiba.mica.spi.search.IndexFieldMapping; import org.obiba.mica.spi.search.Indexable; import org.obiba.mica.spi.search.Indexer; @@ -27,8 +28,15 @@ public class SearchEngineIndexer implements Indexer { @Inject private PluginsService pluginsService; + private Indexer defaultIndexer; + private Indexer getIndexer() { - return pluginsService.getSearchEngineService().getIndexer(); + if (pluginsService.hasSearchEngineService()) + return pluginsService.getSearchEngineService().getIndexer(); + if (defaultIndexer == null) { + defaultIndexer = new DefaultIndexer(); + } + return defaultIndexer; } @Override diff --git a/mica-search/src/main/java/org/obiba/mica/search/basic/DefaultIndexer.java b/mica-search/src/main/java/org/obiba/mica/search/basic/DefaultIndexer.java new file mode 100644 index 0000000000..f0fdcdb031 --- /dev/null +++ b/mica-search/src/main/java/org/obiba/mica/search/basic/DefaultIndexer.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2024 OBiBa. All rights reserved. + * + * This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.obiba.mica.search.basic; + +import org.jetbrains.annotations.Nullable; +import org.obiba.mica.spi.search.IndexFieldMapping; +import org.obiba.mica.spi.search.Indexable; +import org.obiba.mica.spi.search.Indexer; +import org.springframework.data.domain.Persistable; + +import java.util.Map; + +public class DefaultIndexer implements Indexer { + @Override + public void index(String indexName, Persistable persistable) { + + } + + @Override + public void index(String indexName, Persistable persistable, Persistable parent) { + + } + + @Override + public void index(String indexName, Indexable indexable) { + + } + + @Override + public void index(String indexName, Indexable indexable, Indexable parent) { + + } + + @Override + public void reIndexAllIndexables(String indexName, Iterable persistables) { + + } + + @Override + public void reindexAll(String indexName, Iterable> persistables) { + + } + + @Override + public void indexAll(String indexName, Iterable> persistables) { + + } + + @Override + public void indexAll(String indexName, Iterable> persistables, Persistable parent) { + + } + + @Override + public void indexAllIndexables(String indexName, Iterable indexables) { + + } + + @Override + public void indexAllIndexables(String indexName, Iterable indexables, @Nullable String parentId) { + + } + + @Override + public void delete(String indexName, Persistable persistable) { + + } + + @Override + public void delete(String indexName, Indexable indexable) { + + } + + @Override + public void delete(String indexName, String[] types, Map.Entry termQuery) { + + } + + @Override + public void delete(String indexName, String type, Map.Entry termQuery) { + + } + + @Override + public boolean hasIndex(String indexName) { + return false; + } + + @Override + public void dropIndex(String indexName) { + + } + + @Override + public IndexFieldMapping getIndexfieldMapping(String indexName, String type) { + return null; + } +} diff --git a/mica-search/src/main/java/org/obiba/mica/search/basic/DefaultSearcher.java b/mica-search/src/main/java/org/obiba/mica/search/basic/DefaultSearcher.java new file mode 100644 index 0000000000..cb26dce9ae --- /dev/null +++ b/mica-search/src/main/java/org/obiba/mica/search/basic/DefaultSearcher.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2024 OBiBa. All rights reserved. + * + * This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.obiba.mica.search.basic; + +import org.jetbrains.annotations.Nullable; +import org.obiba.mica.spi.search.QueryScope; +import org.obiba.mica.spi.search.Searcher; +import org.obiba.mica.spi.search.support.JoinQuery; +import org.obiba.mica.spi.search.support.Query; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Map; +import java.util.Properties; + + +public class DefaultSearcher implements Searcher { + + @Override + public JoinQuery makeJoinQuery(String rql) { + return null; + } + + @Override + public Query makeQuery(String rql) { + return null; + } + + @Override + public Query andQuery(Query... queries) { + return null; + } + + @Override + public DocumentResults find(String indexName, String type, String rql, IdFilter idFilter) { + return new EmptyDocumentResults(); + } + + @Override + public DocumentResults count(String indexName, String type, String rql, IdFilter idFilter) { + return new EmptyDocumentResults(); + } + + @Override + public List suggest(String indexName, String type, int limit, String locale, String queryString, String defaultFieldName) { + return List.of(); + } + + @Override + public InputStream getDocumentById(String indexName, String type, String id) { + return null; + } + + @Override + public InputStream getDocumentByClassName(String indexName, String type, Class clazz, String id) { + return null; + } + + @Override + public DocumentResults getDocumentsByClassName(String indexName, String type, Class clazz, int from, int limit, @Nullable String sort, @Nullable String order, @Nullable String queryString, @Nullable TermFilter termFilter, @Nullable IdFilter idFilter) { + return new EmptyDocumentResults(); + } + + @Override + public DocumentResults getDocuments(String indexName, String type, int from, int limit, @Nullable String sort, @Nullable String order, @Nullable String queryString, @Nullable TermFilter termFilter, @Nullable IdFilter idFilter, @Nullable List fields, @Nullable List excludedFields) { + return new EmptyDocumentResults(); + } + + @Override + public long countDocumentsWithField(String indexName, String type, String field) { + return 0; + } + + @Override + public DocumentResults query(String indexName, String type, Query query, QueryScope scope, List mandatorySourceFields, Properties aggregationProperties, @Nullable IdFilter idFilter) throws IOException { + return new EmptyDocumentResults(); + } + + @Override + public DocumentResults aggregate(String indexName, String type, Query query, Properties aggregationProperties, IdFilter idFilter) { + return new EmptyDocumentResults(); + } + + @Override + public DocumentResults cover(String indexName, String type, Query query, Properties aggregationProperties, @Nullable IdFilter idFilter) { + return new EmptyDocumentResults(); + } + + @Override + public DocumentResults cover(String indexName, String type, Query query, Properties aggregationProperties, Map subAggregationProperties, @Nullable IdFilter idFilter) { + return new EmptyDocumentResults(); + } + + @Override + public Map harmonizationStatusAggregation(String datasetId, int size, String aggregationFieldName, String statusFieldName) { + return Map.of(); + } +} diff --git a/mica-search/src/main/java/org/obiba/mica/search/basic/EmptyDocumentResults.java b/mica-search/src/main/java/org/obiba/mica/search/basic/EmptyDocumentResults.java new file mode 100644 index 0000000000..70c5a3763e --- /dev/null +++ b/mica-search/src/main/java/org/obiba/mica/search/basic/EmptyDocumentResults.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 OBiBa. All rights reserved. + * + * This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.obiba.mica.search.basic; + +import org.obiba.mica.spi.search.Searcher; + +import java.util.List; +import java.util.Map; + +public class EmptyDocumentResults implements Searcher.DocumentResults { + @Override + public long getTotal() { + return 0; + } + + @Override + public List getDocuments() { + return List.of(); + } + + @Override + public Map getAggregation(String field) { + return Map.of(); + } + + @Override + public List getAggregations() { + return List.of(); + } +} diff --git a/mica-webapp/src/main/conf/application-dev.yml b/mica-webapp/src/main/conf/application-dev.yml index 7dddd16db7..3fa02c1859 100644 --- a/mica-webapp/src/main/conf/application-dev.yml +++ b/mica-webapp/src/main/conf/application-dev.yml @@ -38,7 +38,7 @@ shiro: # plugins: - micaSearchPlugin: mica-search-es8 + micaSearchPlugin: updateSite: https://plugins.obiba.org opalTaxonomies: