Skip to content

Commit dad0a97

Browse files
authored
feat: index variables in lucene, execute search and display results (#3895)
* feat: use lucene to index variables, moved search interfaces from spi to search package as search plugin feature is deprecated * feat: added variable search executor and ui
1 parent d121462 commit dad0a97

File tree

56 files changed

+647
-544
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+647
-544
lines changed

opal-spi/src/main/java/org/obiba/opal/spi/search/VariableSummaryHandler.java opal-core-api/src/main/java/org/obiba/opal/core/service/VariableSummaryHandler.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021 OBiBa. All rights reserved.
2+
* Copyright (c) 2024 OBiBa. All rights reserved.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the GNU Public License v3.0.
@@ -8,7 +8,7 @@
88
* along with this program. If not, see <http://www.gnu.org/licenses/>.
99
*/
1010

11-
package org.obiba.opal.spi.search;
11+
package org.obiba.opal.core.service;
1212

1313
import org.obiba.magma.Value;
1414
import org.obiba.magma.ValueTable;

opal-core-api/src/main/java/org/obiba/opal/core/service/VariableSummaryService.java

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
import org.obiba.magma.math.summary.VariableSummary;
1515
import org.obiba.magma.math.summary.VariableSummaryFactory;
16-
import org.obiba.opal.spi.search.VariableSummaryHandler;
1716

1817
/**
1918
*

opal-core-ws/src/main/java/org/obiba/opal/web/provider/SearchExceptionMapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
package org.obiba.opal.web.provider;
1212

1313
import org.obiba.opal.web.model.Ws;
14-
import org.obiba.opal.spi.search.SearchException;
14+
import org.obiba.opal.search.service.SearchException;
1515
import org.obiba.opal.web.magma.ClientErrorDtos;
1616
import org.springframework.stereotype.Component;
1717

opal-core/src/main/java/org/obiba/opal/core/runtime/PluginsManager.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public class PluginsManager {
3737

3838
private static final String PLUGIN_DIST_SUFFIX = "-dist.zip";
3939

40+
private static final String[] DEPRECATED_PLUGINS = new String[]{"opal-search-es"};
41+
4042
private final File pluginsDir = new File(OpalRuntime.PLUGINS_DIR);
4143

4244
private final File archiveDir = new File(OpalRuntime.PLUGINS_DIR, ".archive");
@@ -180,8 +182,11 @@ private void processPlugins(Map<String, PluginResources> pluginsMap, File plugin
180182
File[] children = pluginsDir.listFiles(pathname -> pathname.isDirectory() && !pathname.getName().startsWith("."));
181183
if (children == null || children.length == 0) return;
182184
for (File child : children) {
183-
PluginResources plugin = new OpalPlugin(child);
184-
PluginsManagerHelper.processPlugin(pluginsMap, plugin, archiveDir);
185+
boolean deprecated = Arrays.stream(DEPRECATED_PLUGINS).anyMatch((name) -> child.getName().startsWith(name));
186+
if (!deprecated) { // deprecated plugin
187+
PluginResources plugin = new OpalPlugin(child);
188+
PluginsManagerHelper.processPlugin(pluginsMap, plugin, archiveDir);
189+
}
185190
}
186191
}
187192

opal-search/pom.xml

+12-4
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@
3333
<groupId>org.obiba.opal</groupId>
3434
<artifactId>opal-core</artifactId>
3535
</dependency>
36-
<dependency>
37-
<groupId>org.obiba.opal</groupId>
38-
<artifactId>opal-spi</artifactId>
39-
</dependency>
4036
<dependency>
4137
<groupId>org.obiba.opal</groupId>
4238
<artifactId>opal-ws</artifactId>
@@ -61,6 +57,18 @@
6157
<groupId>org.json</groupId>
6258
<artifactId>json</artifactId>
6359
</dependency>
60+
<dependency>
61+
<groupId>org.apache.lucene</groupId>
62+
<artifactId>lucene-core</artifactId>
63+
</dependency>
64+
<dependency>
65+
<groupId>org.apache.lucene</groupId>
66+
<artifactId>lucene-analysis-common</artifactId>
67+
</dependency>
68+
<dependency>
69+
<groupId>org.apache.lucene</groupId>
70+
<artifactId>lucene-queryparser</artifactId>
71+
</dependency>
6472
<dependency>
6573
<groupId>net.jazdw</groupId>
6674
<artifactId>rql-parser</artifactId>

opal-search/src/main/java/org/obiba/opal/search/AbstractSearchUtility.java

+5-11
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import com.google.common.base.Strings;
1313
import com.google.common.collect.Lists;
1414
import org.obiba.opal.search.service.OpalSearchService;
15-
import org.obiba.opal.spi.search.QuerySettings;
15+
import org.obiba.opal.search.service.QuerySettings;
1616
import org.obiba.opal.web.ws.SortDir;
1717
import org.springframework.beans.factory.annotation.Autowired;
1818

@@ -26,8 +26,6 @@ public abstract class AbstractSearchUtility {
2626

2727
protected static final String DEFAULT_SORT_FIELD = "_score";
2828

29-
protected static final String INDEX_FIELD = "index";
30-
3129
@Autowired
3230
protected OpalSearchService opalSearchService;
3331

@@ -43,21 +41,17 @@ protected QuerySettings buildQuerySearch(String query, int offset, int limit, Co
4341
protected QuerySettings buildQuerySearch(String query, int offset, int limit, Collection<String> fields,
4442
Collection<String> facets, List<String> sortWithOrder) {
4543

46-
Collection<String> safeFields = fields == null ? Lists.newArrayList() : fields;
47-
addDefaultFields(safeFields);
48-
QuerySettings querySettings = QuerySettings.newSettings(query)
44+
List<String> safeFields = Lists.newArrayList();
45+
if (fields != null)
46+
safeFields.addAll(fields);
47+
return QuerySettings.newSettings(query)
4948
.fields(safeFields).facets(facets).from(offset).size(limit) //
5049
.sortWithOrder(sortWithOrder);
51-
52-
return querySettings;
5350
}
5451

5552
protected boolean searchServiceAvailable() {
5653
return opalSearchService.isRunning() && opalSearchService.isEnabled();
5754
}
5855

59-
protected void addDefaultFields(Collection<String> fields) {
60-
if (!fields.contains(INDEX_FIELD)) fields.add(INDEX_FIELD);
61-
}
6256
}
6357

opal-search/src/main/java/org/obiba/opal/search/IndexManagerConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import org.obiba.magma.ValueTable;
1313
import org.obiba.opal.core.cfg.OpalConfigurationExtension;
14-
import org.obiba.opal.spi.search.ValueTableIndex;
14+
import org.obiba.opal.search.service.ValueTableIndex;
1515
import org.obiba.opal.web.model.Opal;
1616

1717
import java.util.Calendar;

opal-search/src/main/java/org/obiba/opal/search/IndexSynchronizationManager.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
import org.obiba.opal.core.tx.TransactionalThreadFactory;
2121
import org.obiba.opal.search.event.SynchronizeIndexEvent;
2222
import org.obiba.opal.search.service.OpalSearchService;
23-
import org.obiba.opal.spi.search.IndexManager;
24-
import org.obiba.opal.spi.search.IndexSynchronization;
25-
import org.obiba.opal.spi.search.ValueTableIndex;
23+
import org.obiba.opal.search.service.IndexManager;
24+
import org.obiba.opal.search.service.IndexSynchronization;
25+
import org.obiba.opal.search.service.ValueTableIndex;
2626
import org.slf4j.Logger;
2727
import org.slf4j.LoggerFactory;
2828
import org.springframework.beans.factory.annotation.Autowired;

opal-search/src/main/java/org/obiba/opal/search/SearchQueryWhereClause.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import org.obiba.magma.support.VariableEntityBean;
2020
import org.obiba.magma.views.View;
2121
import org.obiba.opal.core.magma.QueryWhereClause;
22-
import org.obiba.opal.spi.search.ValuesIndexManager;
22+
import org.obiba.opal.search.service.ValuesIndexManager;
2323
import org.obiba.opal.web.search.support.RQLParserFactory;
2424
import org.slf4j.Logger;
2525
import org.slf4j.LoggerFactory;

opal-search/src/main/java/org/obiba/opal/search/ValueTableIndexManagerConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
package org.obiba.opal.search;
1111

1212
import org.obiba.magma.ValueTable;
13-
import org.obiba.opal.spi.search.ValueTableIndex;
13+
import org.obiba.opal.search.service.ValueTableIndex;
1414

1515
public interface ValueTableIndexManagerConfiguration {
1616

opal-search/src/main/java/org/obiba/opal/search/event/SynchronizeIndexEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
package org.obiba.opal.search.event;
1212

1313
import org.obiba.magma.ValueTable;
14-
import org.obiba.opal.spi.search.IndexManager;
14+
import org.obiba.opal.search.service.IndexManager;
1515

1616
public class SynchronizeIndexEvent {
1717

opal-spi/src/main/java/org/obiba/opal/spi/search/IndexManager.java opal-search/src/main/java/org/obiba/opal/search/service/IndexManager.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
/*
2-
* Copyright (c) 2021 OBiBa. All rights reserved.
2+
* Copyright (c) 2024 OBiBa. All rights reserved.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the GNU Public License v3.0.
66
*
77
* You should have received a copy of the GNU General Public License
88
* along with this program. If not, see <http://www.gnu.org/licenses/>.
99
*/
10-
package org.obiba.opal.spi.search;
10+
package org.obiba.opal.search.service;
1111

1212
import org.obiba.magma.ValueTable;
1313

@@ -40,6 +40,13 @@ public interface IndexManager {
4040
*/
4141
IndexSynchronization createSyncTask(ValueTable valueTable, ValueTableIndex index);
4242

43+
/**
44+
* Create a query executor for this index.
45+
*
46+
* @return
47+
*/
48+
SearchQueryExecutor createQueryExecutor();
49+
4350
/**
4451
* Check if this index manager is enabled.
4552
*

opal-spi/src/main/java/org/obiba/opal/spi/search/IndexSynchronization.java opal-search/src/main/java/org/obiba/opal/search/service/IndexSynchronization.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
/*
2-
* Copyright (c) 2021 OBiBa. All rights reserved.
2+
* Copyright (c) 2024 OBiBa. All rights reserved.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the GNU Public License v3.0.
66
*
77
* You should have received a copy of the GNU General Public License
88
* along with this program. If not, see <http://www.gnu.org/licenses/>.
99
*/
10-
package org.obiba.opal.spi.search;
10+
package org.obiba.opal.search.service;
1111

1212
import org.obiba.magma.ValueTable;
1313

opal-search/src/main/java/org/obiba/opal/search/service/OpalSearchService.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
import org.obiba.opal.core.runtime.Service;
2020
import org.obiba.opal.search.es.ElasticSearchConfigurationService;
2121
import org.obiba.opal.search.event.SynchronizeIndexEvent;
22-
import org.obiba.opal.spi.search.*;
23-
import org.obiba.opal.spi.search.support.ItemResultDtoStrategy;
22+
import org.obiba.opal.search.service.support.ItemResultDtoStrategy;
2423
import org.obiba.opal.web.model.Search;
2524
import org.slf4j.Logger;
2625
import org.slf4j.LoggerFactory;
@@ -134,15 +133,18 @@ public Search.EntitiesResultDto.Builder executeEntitiesQuery(QuerySettings query
134133

135134
public Search.QueryResultDto executeQuery(QuerySettings querySettings, String searchPath, ItemResultDtoStrategy strategy) throws SearchException {
136135
if (!isRunning()) return null;
136+
if (variablesIndexManager.getName().equals(searchPath)) {
137+
return variablesIndexManager.createQueryExecutor().execute(querySettings);
138+
}
137139
// return getSearchServicePlugin().executeQuery(querySettings, searchPath, strategy);
138-
throw new UnsupportedOperationException("Deprecated");
140+
return Search.QueryResultDto.newBuilder().setTotalHits(0).build();
139141
}
140142

141143
//
142144
// Inner classes
143145
//
144146

145-
public static class IdentifiersQueryCallback implements SearchService.HitsQueryCallback<String> {
147+
public static class IdentifiersQueryCallback implements HitsQueryCallback<String> {
146148

147149
private int total = -1;
148150

@@ -217,4 +219,15 @@ private void remove(@NotNull ValueTable vt) {
217219

218220
}
219221

222+
//
223+
// Search callbacks
224+
//
225+
226+
interface HitsQueryCallback<T> {
227+
228+
void onTotal(int total);
229+
230+
void onIdentifier(T id);
231+
232+
}
220233
}

opal-spi/src/main/java/org/obiba/opal/spi/search/QuerySettings.java opal-search/src/main/java/org/obiba/opal/search/service/QuerySettings.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021 OBiBa. All rights reserved.
2+
* Copyright (c) 2024 OBiBa. All rights reserved.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the GNU Public License v3.0.
@@ -8,17 +8,15 @@
88
* along with this program. If not, see <http://www.gnu.org/licenses/>.
99
*/
1010

11-
package org.obiba.opal.spi.search;
11+
package org.obiba.opal.search.service;
1212

1313
import com.google.common.base.Strings;
1414
import com.google.common.collect.Lists;
15-
import org.apache.commons.math3.util.Pair;
1615

1716
import javax.validation.constraints.NotNull;
1817
import java.util.ArrayList;
1918
import java.util.Collection;
2019
import java.util.List;
21-
import java.util.Map;
2220

2321
/**
2422
* Settings to be used to build a search query.

opal-spi/src/main/java/org/obiba/opal/spi/search/SearchException.java opal-search/src/main/java/org/obiba/opal/search/service/SearchException.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021 OBiBa. All rights reserved.
2+
* Copyright (c) 2024 OBiBa. All rights reserved.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the GNU Public License v3.0.
@@ -8,7 +8,7 @@
88
* along with this program. If not, see <http://www.gnu.org/licenses/>.
99
*/
1010

11-
package org.obiba.opal.spi.search;
11+
package org.obiba.opal.search.service;
1212

1313
public class SearchException extends Exception {
1414

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright (c) 2024 OBiBa. All rights reserved.
3+
*
4+
* This program and the accompanying materials
5+
* are made available under the terms of the GNU Public License v3.0.
6+
*
7+
* You should have received a copy of the GNU General Public License
8+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
9+
*/
10+
11+
package org.obiba.opal.search.service;
12+
13+
import org.obiba.opal.web.model.Search;
14+
15+
public interface SearchQueryExecutor {
16+
17+
/**
18+
* Performs the query.
19+
*
20+
* @param querySettings
21+
* @return
22+
* @throws SearchException
23+
*/
24+
Search.QueryResultDto execute(QuerySettings querySettings) throws SearchException;
25+
26+
}

0 commit comments

Comments
 (0)