Skip to content

Commit 593d7e3

Browse files
author
Vladimir Kotal
committed
implement /suggest/rebuild API endpoints
1 parent e90a4de commit 593d7e3

File tree

7 files changed

+79
-9
lines changed

7 files changed

+79
-9
lines changed

apiary.apib

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,17 @@ with a colon. If the type cannot be determined "N/A" is returned.
362362
[{"iso":3},{"the":3},{"to":3},{"conform":3},{"-":2},
363363
{"sc_window_set":1},{"_lso_outbound":1},{"missing":1}]
364364

365+
## Suggester data rebuild [/suggest/rebuild]
366+
367+
### rebuilds suggester data for all projects [PUT]
368+
369+
## Suggester project data rebuild [/suggest/rebuild/{project}]
370+
371+
### rebuilds suggester data for given project [PUT]
372+
373+
+ Parameters
374+
+ project - project name
375+
365376
## Index searchers refresh [/system/refresh]
366377

367378
### refreshes index searchers for specified project [PUT]

opengrok-web/src/main/java/org/opengrok/web/api/v1/controller/ProjectsController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ public void markIndexed(@PathParam("project") final String projectName) throws E
215215
}
216216
}
217217
}
218-
suggester.refresh(projectName);
218+
suggester.rebuild(projectName);
219219
} else {
220220
logger.log(Level.WARNING, "cannot find project {0} to mark as indexed", projectName);
221221
}

opengrok-web/src/main/java/org/opengrok/web/api/v1/controller/SuggesterController.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import javax.ws.rs.DefaultValue;
5151
import javax.ws.rs.GET;
5252
import javax.ws.rs.POST;
53+
import javax.ws.rs.PUT;
5354
import javax.ws.rs.Path;
5455
import javax.ws.rs.PathParam;
5556
import javax.ws.rs.Produces;
@@ -164,6 +165,20 @@ public SuggesterConfig getConfig() {
164165
return env.getSuggesterConfig();
165166
}
166167

168+
@PUT
169+
@Path("/rebuild")
170+
public void rebuild() {
171+
// TODO run this async in a thread so that the request get a response instantly
172+
suggester.rebuild();
173+
}
174+
175+
@PUT
176+
@Path("/rebuild/{project}")
177+
public void rebuild(@PathParam("project") final String project) {
178+
// TODO run this async in a thread so that the request get a response instantly
179+
suggester.rebuild(project);
180+
}
181+
167182
/**
168183
* Initializes the search data used by suggester to perform most popular completion. The passed {@code urls} are
169184
* decomposed into single terms which search counts are then increased by 1.

opengrok-web/src/main/java/org/opengrok/web/api/v1/controller/SystemController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class SystemController {
4848
@Consumes(MediaType.TEXT_PLAIN)
4949
public void refresh(final String project) {
5050
env.maybeRefreshIndexSearchers(Collections.singleton(project));
51-
suggester.refresh(project);
51+
suggester.rebuild(project);
5252
}
5353

5454
@PUT

opengrok-web/src/main/java/org/opengrok/web/api/v1/suggester/provider/service/SuggesterService.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,15 @@ public interface SuggesterService {
5151
void refresh();
5252

5353
/**
54-
* Refreshes the suggester for specified {@code project}.
55-
* @param project name of the project to refresh
54+
* Rebuild suggester data structures. This is a subset of what {@code refresh} does.
5655
*/
57-
void refresh(String project);
56+
void rebuild();
57+
58+
/**
59+
* Rebuilds suggester data structures for given project. This is a subset of what {@code refresh} does.
60+
* @param project project name
61+
*/
62+
void rebuild(String project);
5863

5964
/**
6065
* Deletes all suggester data for the {@code project}.

opengrok-web/src/main/java/org/opengrok/web/api/v1/suggester/provider/service/impl/SuggesterServiceImpl.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.opengrok.indexer.index.IndexDatabase;
4444
import org.opengrok.indexer.logger.LoggerFactory;
4545
import org.opengrok.web.api.v1.suggester.provider.service.SuggesterService;
46+
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
4647

4748
import java.io.File;
4849
import java.io.IOException;
@@ -175,21 +176,36 @@ public void refresh() {
175176

176177
/** {@inheritDoc} */
177178
@Override
178-
public void refresh(final String project) {
179+
public void rebuild() {
180+
lock.readLock().lock();
181+
try {
182+
if (suggester == null) {
183+
logger.log(Level.FINE, "Cannot perform rebuild because suggester is not initialized");
184+
return;
185+
}
186+
suggester.rebuild(getAllProjectIndexDirs());
187+
} finally {
188+
lock.readLock().unlock();
189+
}
190+
}
191+
192+
/** {@inheritDoc} */
193+
@Override
194+
public void rebuild(final String project) {
179195
Project p = env.getProjects().get(project);
180196
if (p == null) {
181-
logger.log(Level.WARNING, "Cannot refresh suggester because project for name {0} was not found",
197+
logger.log(Level.WARNING, "Cannot rebuild suggester because project for name {0} was not found",
182198
project);
183199
return;
184200
}
185201
if (!p.isIndexed()) {
186-
logger.log(Level.WARNING, "Cannot refresh project {0} because it is not indexed yet", project);
202+
logger.log(Level.WARNING, "Cannot rebuild project {0} because it is not indexed yet", project);
187203
return;
188204
}
189205
lock.readLock().lock();
190206
try {
191207
if (suggester == null) {
192-
logger.log(Level.FINE, "Cannot refresh {0} because suggester is not initialized", project);
208+
logger.log(Level.FINE, "Cannot rebuild {0} because suggester is not initialized", project);
193209
return;
194210
}
195211
suggester.rebuild(Collections.singleton(getNamedIndexDir(p)));

opengrok-web/src/test/java/org/opengrok/web/api/v1/controller/SuggesterControllerTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.lucene.index.Term;
2626
import org.glassfish.jersey.test.JerseyTest;
2727
import org.junit.*;
28+
import org.junit.runners.MethodSorters;
2829
import org.opengrok.suggest.Suggester;
2930
import org.opengrok.indexer.condition.ConditionalRun;
3031
import org.opengrok.indexer.condition.ConditionalRunRule;
@@ -61,6 +62,7 @@
6162
import static org.junit.Assert.assertThat;
6263

6364
@ConditionalRun(CtagsInstalled.class)
65+
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
6466
public class SuggesterControllerTest extends JerseyTest {
6567

6668
public static class Result {
@@ -640,4 +642,25 @@ public void testWildcardQueryEndingWithAsterisk() {
640642
assertThat(res.suggestions.stream().map(r -> r.phrase).collect(Collectors.toList()),
641643
containsInAnyOrder("print", "printf"));
642644
}
645+
646+
@Test
647+
public void ZtestRebuild() {
648+
Response res = target(SuggesterController.PATH)
649+
.path("rebuild")
650+
.request()
651+
.put(Entity.text(""));
652+
653+
assertEquals(Response.Status.NO_CONTENT.getStatusCode(), res.getStatus());
654+
}
655+
656+
@Test
657+
public void ZtestRebuildProject() {
658+
Response res = target(SuggesterController.PATH)
659+
.path("rebuild")
660+
.path("c")
661+
.request()
662+
.put(Entity.text(""));
663+
664+
assertEquals(Response.Status.NO_CONTENT.getStatusCode(), res.getStatus());
665+
}
643666
}

0 commit comments

Comments
 (0)