This is an automated email from the ASF dual-hosted git repository. rnewson pushed a commit to branch import-nouveau-reorg-wip in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit c0bcb92bf2ee76fed5e5f9b5950da600231ba325 Author: Robert Newson <[email protected]> AuthorDate: Sun Dec 18 10:28:28 2022 +0000 WIP2 --- .../apache/couchdb/nouveau/NouveauApplication.java | 6 +- .../apache/couchdb/nouveau/api/AnalyzeRequest.java | 12 +- .../couchdb/nouveau/api/IndexDefinition.java | 3 +- .../apache/couchdb/nouveau/core/IndexManager.java | 4 +- .../couchdb/nouveau/core/V461AnalyzerFactory.java | 165 +++++++++++++++++++++ ...AnalyzerFactory.java => V9AnalyzerFactory.java} | 2 +- .../apache/couchdb/nouveau/core/lucene/Lucene.java | 45 ++++++ .../lucene/Lucene461.java} | 41 ++--- .../lucene/Lucene9.java} | 34 ++--- .../couchdb/nouveau/health/AnalyzeHealthCheck.java | 3 +- .../nouveau/health/IndexManagerHealthCheck.java | 3 +- .../couchdb/nouveau/resources/AnalyzeResource.java | 39 +---- .../apache/couchdb/nouveau/IntegrationTest.java | 3 +- .../couchdb/nouveau/core/AnalyzerFactoryTest.java | 2 +- .../couchdb/nouveau/core/IndexManagerTest.java | 5 +- 15 files changed, 263 insertions(+), 104 deletions(-) diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java index f5a92fced..2df8b3f8f 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java @@ -15,7 +15,7 @@ package org.apache.couchdb.nouveau; import java.util.concurrent.ExecutorService; -import org.apache.couchdb.nouveau.core.AnalyzerFactory; +import org.apache.couchdb.nouveau.core.V9AnalyzerFactory; import org.apache.couchdb.nouveau.core.DocumentFactory; import org.apache.couchdb.nouveau.core.FileAlreadyExistsExceptionMapper; import org.apache.couchdb.nouveau.core.FileNotFoundExceptionMapper; @@ -48,7 +48,7 @@ public class NouveauApplication extends Application<NouveauApplicationConfigurat @Override public void run(NouveauApplicationConfiguration configuration, Environment environment) throws Exception { final DocumentFactory documentFactory = new DocumentFactory(); - final AnalyzerFactory analyzerFactory = new AnalyzerFactory(); + final V9AnalyzerFactory analyzerFactory = new V9AnalyzerFactory(); final ExecutorService searchExecutor = environment.lifecycle().executorService("searches").build(); @@ -74,7 +74,7 @@ public class NouveauApplication extends Application<NouveauApplicationConfigurat environment.jersey().register(new FileAlreadyExistsExceptionMapper()); environment.jersey().register(new UpdatesOutOfOrderExceptionMapper()); - final AnalyzeResource analyzeResource = new AnalyzeResource(analyzerFactory); + final AnalyzeResource analyzeResource = new AnalyzeResource(); environment.jersey().register(analyzeResource); environment.jersey().register(new IndexResource(indexManager, documentFactory)); environment.jersey().register(new SearchResource(indexManager)); diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/AnalyzeRequest.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/AnalyzeRequest.java index 5f3fcd1e9..41f7ffdfe 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/AnalyzeRequest.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/AnalyzeRequest.java @@ -14,6 +14,7 @@ package org.apache.couchdb.nouveau.api; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import com.fasterxml.jackson.annotation.JsonProperty; @@ -22,6 +23,9 @@ import io.dropwizard.jackson.JsonSnakeCase; @JsonSnakeCase public class AnalyzeRequest { + @NotNull + private LuceneVersion luceneVersion; + @NotEmpty private String analyzer; @@ -33,11 +37,17 @@ public class AnalyzeRequest { // Jackson deserialization } - public AnalyzeRequest(final String analyzer, final String text) { + public AnalyzeRequest(final LuceneVersion luceneVersion, final String analyzer, final String text) { + this.luceneVersion = luceneVersion; this.analyzer = analyzer; this.text = text; } + @JsonProperty + public LuceneVersion getLuceneVersion() { + return luceneVersion; + } + @JsonProperty public String getAnalyzer() { return analyzer; diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java index 4dece3f0f..aaad7626e 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java @@ -16,6 +16,7 @@ package org.apache.couchdb.nouveau.api; import java.util.Map; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import com.fasterxml.jackson.annotation.JsonProperty; @@ -24,7 +25,7 @@ import io.dropwizard.jackson.JsonSnakeCase; @JsonSnakeCase public class IndexDefinition { - @NotEmpty + @NotNull private LuceneVersion luceneVersion; @NotEmpty diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java index 109ac2e05..4975bcb5d 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java @@ -234,7 +234,7 @@ public class IndexManager implements Managed { private Path rootDir; @NotNull - private AnalyzerFactory analyzerFactory; + private V9AnalyzerFactory analyzerFactory; @NotNull private ObjectMapper objectMapper; @@ -339,7 +339,7 @@ public class IndexManager implements Managed { this.rootDir = rootDir; } - public void setAnalyzerFactory(final AnalyzerFactory analyzerFactory) { + public void setAnalyzerFactory(final V9AnalyzerFactory analyzerFactory) { this.analyzerFactory = analyzerFactory; } diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V461AnalyzerFactory.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V461AnalyzerFactory.java new file mode 100644 index 000000000..52ff55357 --- /dev/null +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V461AnalyzerFactory.java @@ -0,0 +1,165 @@ +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.couchdb.nouveau.core; + +import java.util.HashMap; +import java.util.Map; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response.Status; + +import org.apache.couchdb.nouveau.api.IndexDefinition; + +import v461.org.apache.lucene.analysis.Analyzer; +import v461.org.apache.lucene.analysis.ar.ArabicAnalyzer; +import v461.org.apache.lucene.analysis.bg.BulgarianAnalyzer; +import v461.org.apache.lucene.analysis.ca.CatalanAnalyzer; +import v461.org.apache.lucene.analysis.cjk.CJKAnalyzer; +import v461.org.apache.lucene.analysis.standard.ClassicAnalyzer; +import v461.org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; +import v461.org.apache.lucene.analysis.core.KeywordAnalyzer; +import v461.org.apache.lucene.analysis.core.SimpleAnalyzer; +import v461.org.apache.lucene.analysis.core.WhitespaceAnalyzer; +import v461.org.apache.lucene.analysis.cz.CzechAnalyzer; +import v461.org.apache.lucene.analysis.da.DanishAnalyzer; +import v461.org.apache.lucene.analysis.de.GermanAnalyzer; +import v461.org.apache.lucene.analysis.standard.UAX29URLEmailAnalyzer; +import v461.org.apache.lucene.analysis.en.EnglishAnalyzer; +import v461.org.apache.lucene.analysis.es.SpanishAnalyzer; +import v461.org.apache.lucene.analysis.eu.BasqueAnalyzer; +import v461.org.apache.lucene.analysis.fa.PersianAnalyzer; +import v461.org.apache.lucene.analysis.fi.FinnishAnalyzer; +import v461.org.apache.lucene.analysis.fr.FrenchAnalyzer; +import v461.org.apache.lucene.analysis.ga.IrishAnalyzer; +import v461.org.apache.lucene.analysis.gl.GalicianAnalyzer; +import v461.org.apache.lucene.analysis.hi.HindiAnalyzer; +import v461.org.apache.lucene.analysis.hu.HungarianAnalyzer; +import v461.org.apache.lucene.analysis.hy.ArmenianAnalyzer; +import v461.org.apache.lucene.analysis.id.IndonesianAnalyzer; +import v461.org.apache.lucene.analysis.it.ItalianAnalyzer; +import v461.org.apache.lucene.analysis.ja.JapaneseAnalyzer; +import v461.org.apache.lucene.analysis.lv.LatvianAnalyzer; +import v461.org.apache.lucene.analysis.miscellaneous.PerFieldAnalyzerWrapper; +import v461.org.apache.lucene.analysis.nl.DutchAnalyzer; +import v461.org.apache.lucene.analysis.no.NorwegianAnalyzer; +import v461.org.apache.lucene.analysis.pl.PolishAnalyzer; +import v461.org.apache.lucene.analysis.pt.PortugueseAnalyzer; +import v461.org.apache.lucene.analysis.ro.RomanianAnalyzer; +import v461.org.apache.lucene.analysis.ru.RussianAnalyzer; +import v461.org.apache.lucene.analysis.standard.StandardAnalyzer; +import v461.org.apache.lucene.analysis.sv.SwedishAnalyzer; +import v461.org.apache.lucene.analysis.th.ThaiAnalyzer; +import v461.org.apache.lucene.analysis.tr.TurkishAnalyzer; +import v461.org.apache.lucene.util.Version; + +public class V461AnalyzerFactory { + + private static final Version VERSION = Version.LUCENE_46; + + public Analyzer fromDefinition(final IndexDefinition indexDefinition) { + final Analyzer defaultAnalyzer = newAnalyzer(indexDefinition.getDefaultAnalyzer()); + if (!indexDefinition.hasFieldAnalyzers()) { + return defaultAnalyzer; + } + final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, Analyzer>(); + for (Map.Entry<String, String> entry : indexDefinition.getFieldAnalyzers().entrySet()) { + fieldAnalyzers.put(entry.getKey(), newAnalyzer(entry.getValue())); + } + return new PerFieldAnalyzerWrapper(defaultAnalyzer, fieldAnalyzers); + } + + public Analyzer newAnalyzer(final String name) { + switch(name) { + case "keyword": + return new KeywordAnalyzer(); + case "simple": + return new SimpleAnalyzer(VERSION); + case "whitespace": + return new WhitespaceAnalyzer(VERSION); + case "arabic": + return new ArabicAnalyzer(VERSION); + case "bulgarian": + return new BulgarianAnalyzer(VERSION); + case "catalan": + return new CatalanAnalyzer(VERSION); + case "cjk": + return new CJKAnalyzer(VERSION); + case "chinese": + return new SmartChineseAnalyzer(VERSION); + case "czech": + return new CzechAnalyzer(VERSION); + case "danish": + return new DanishAnalyzer(VERSION); + case "german": + return new GermanAnalyzer(VERSION); + case "english": + return new EnglishAnalyzer(VERSION); + case "spanish": + return new SpanishAnalyzer(VERSION); + case "basque": + return new BasqueAnalyzer(VERSION); + case "persian": + return new PersianAnalyzer(VERSION); + case "finnish": + return new FinnishAnalyzer(VERSION); + case "french": + return new FrenchAnalyzer(VERSION); + case "irish": + return new IrishAnalyzer(VERSION); + case "galician": + return new GalicianAnalyzer(VERSION); + case "hindi": + return new HindiAnalyzer(VERSION); + case "hungarian": + return new HungarianAnalyzer(VERSION); + case "armenian": + return new ArmenianAnalyzer(VERSION); + case "indonesian": + return new IndonesianAnalyzer(VERSION); + case "italian": + return new ItalianAnalyzer(VERSION); + case "japanese": + return new JapaneseAnalyzer(VERSION); + case "latvian": + return new LatvianAnalyzer(VERSION); + case "dutch": + return new DutchAnalyzer(VERSION); + case "norwegian": + return new NorwegianAnalyzer(VERSION); + case "polish": + return new PolishAnalyzer(VERSION); + case "portugese": + return new PortugueseAnalyzer(VERSION); + case "romanian": + return new RomanianAnalyzer(VERSION); + case "russian": + return new RussianAnalyzer(VERSION); + case "classic": + return new ClassicAnalyzer(VERSION); + case "standard": + return new StandardAnalyzer(VERSION); + case "email": + return new UAX29URLEmailAnalyzer(VERSION); + case "swedish": + return new SwedishAnalyzer(VERSION); + case "thai": + return new ThaiAnalyzer(VERSION); + case "turkish": + return new TurkishAnalyzer(VERSION); + default: + throw new WebApplicationException(name + " is not a valid analyzer name", Status.BAD_REQUEST); + } + } + +} diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/AnalyzerFactory.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V9AnalyzerFactory.java similarity index 99% rename from java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/AnalyzerFactory.java rename to java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V9AnalyzerFactory.java index 9892a1698..afa9d77d3 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/AnalyzerFactory.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V9AnalyzerFactory.java @@ -62,7 +62,7 @@ import v9.org.apache.lucene.analysis.sv.SwedishAnalyzer; import v9.org.apache.lucene.analysis.th.ThaiAnalyzer; import v9.org.apache.lucene.analysis.tr.TurkishAnalyzer; -public class AnalyzerFactory { +public class V9AnalyzerFactory { public Analyzer fromDefinition(final IndexDefinition indexDefinition) { final Analyzer defaultAnalyzer = newAnalyzer(indexDefinition.getDefaultAnalyzer()); diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene.java new file mode 100644 index 000000000..6c794c2ba --- /dev/null +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene.java @@ -0,0 +1,45 @@ +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.couchdb.nouveau.core.lucene; + +import java.io.IOException; + +import org.apache.couchdb.nouveau.api.AnalyzeRequest; +import org.apache.couchdb.nouveau.api.AnalyzeResponse; +import org.apache.couchdb.nouveau.api.LuceneVersion; + +public abstract class Lucene { + + private static final Lucene LUCENE_9 = new Lucene9(); + private static final Lucene LUCENE_4_6_1 = new Lucene461(); + + public final static AnalyzeResponse analyzeText(final AnalyzeRequest request) throws IOException { + return forVersion(request.getLuceneVersion()).analyzeImpl(request); + } + + public abstract AnalyzeResponse analyzeImpl(final AnalyzeRequest request) throws IOException; + + private static Lucene forVersion(final LuceneVersion luceneVersion) { + switch(luceneVersion) { + case LUCENE_4_6_1: + return LUCENE_4_6_1; + case LUCENE_9: + return LUCENE_9; + default: + // unreachable. + throw new IllegalArgumentException(luceneVersion + " not recognised"); + } + } + +} \ No newline at end of file diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene461.java similarity index 55% copy from java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java copy to java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene461.java index 9ff8f6c9c..9cc6eea6f 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene461.java @@ -11,53 +11,37 @@ // See the License for the specific language governing permissions and // limitations under the License. -package org.apache.couchdb.nouveau.resources; +package org.apache.couchdb.nouveau.core.lucene; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import javax.ws.rs.Consumes; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response.Status; import org.apache.couchdb.nouveau.api.AnalyzeRequest; import org.apache.couchdb.nouveau.api.AnalyzeResponse; -import org.apache.couchdb.nouveau.core.AnalyzerFactory; -import com.codahale.metrics.annotation.Timed; +import org.apache.couchdb.nouveau.core.V461AnalyzerFactory; -import v9.org.apache.lucene.analysis.Analyzer; -import v9.org.apache.lucene.analysis.TokenStream; -import v9.org.apache.lucene.analysis.tokenattributes.CharTermAttribute; +import v461.org.apache.lucene.analysis.Analyzer; +import v461.org.apache.lucene.analysis.TokenStream; +import v461.org.apache.lucene.analysis.tokenattributes.CharTermAttribute; -@Path("/analyze") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class AnalyzeResource { +class Lucene461 extends Lucene { - private final AnalyzerFactory analyzerFactory; + private final V461AnalyzerFactory analyzerFactory = new V461AnalyzerFactory(); - public AnalyzeResource(AnalyzerFactory analyzerFactory) { - this.analyzerFactory = analyzerFactory; - } - - @POST - @Timed - public AnalyzeResponse analyzeText(@NotNull @Valid AnalyzeRequest analyzeRequest) throws IOException { + @Override + public AnalyzeResponse analyzeImpl(final AnalyzeRequest request) throws IOException { final Analyzer analyzer; try { - analyzer = analyzerFactory.newAnalyzer(analyzeRequest.getAnalyzer()); + analyzer = analyzerFactory.newAnalyzer(request.getAnalyzer()); } catch (IllegalArgumentException e) { - throw new WebApplicationException(analyzeRequest.getAnalyzer() + " not a valid analyzer", + throw new WebApplicationException(request.getAnalyzer() + " not a valid analyzer", Status.BAD_REQUEST); } - return new AnalyzeResponse(tokenize(analyzer, analyzeRequest.getText())); + return new AnalyzeResponse(tokenize(analyzer, request.getText())); } private List<String> tokenize(final Analyzer analyzer, final String text) throws IOException { @@ -72,5 +56,4 @@ public class AnalyzeResource { } return result; } - } diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene9.java similarity index 62% copy from java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java copy to java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene9.java index 9ff8f6c9c..15803bcb6 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene9.java @@ -11,53 +11,37 @@ // See the License for the specific language governing permissions and // limitations under the License. -package org.apache.couchdb.nouveau.resources; +package org.apache.couchdb.nouveau.core.lucene; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import javax.ws.rs.Consumes; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response.Status; import org.apache.couchdb.nouveau.api.AnalyzeRequest; import org.apache.couchdb.nouveau.api.AnalyzeResponse; -import org.apache.couchdb.nouveau.core.AnalyzerFactory; -import com.codahale.metrics.annotation.Timed; +import org.apache.couchdb.nouveau.core.V9AnalyzerFactory; import v9.org.apache.lucene.analysis.Analyzer; import v9.org.apache.lucene.analysis.TokenStream; import v9.org.apache.lucene.analysis.tokenattributes.CharTermAttribute; -@Path("/analyze") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class AnalyzeResource { +class Lucene9 extends Lucene { - private final AnalyzerFactory analyzerFactory; + private final V9AnalyzerFactory analyzerFactory = new V9AnalyzerFactory(); - public AnalyzeResource(AnalyzerFactory analyzerFactory) { - this.analyzerFactory = analyzerFactory; - } - - @POST - @Timed - public AnalyzeResponse analyzeText(@NotNull @Valid AnalyzeRequest analyzeRequest) throws IOException { + @Override + public AnalyzeResponse analyzeImpl(final AnalyzeRequest request) throws IOException { final Analyzer analyzer; try { - analyzer = analyzerFactory.newAnalyzer(analyzeRequest.getAnalyzer()); + analyzer = analyzerFactory.newAnalyzer(request.getAnalyzer()); } catch (IllegalArgumentException e) { - throw new WebApplicationException(analyzeRequest.getAnalyzer() + " not a valid analyzer", + throw new WebApplicationException(request.getAnalyzer() + " not a valid analyzer", Status.BAD_REQUEST); } - return new AnalyzeResponse(tokenize(analyzer, analyzeRequest.getText())); + return new AnalyzeResponse(tokenize(analyzer, request.getText())); } private List<String> tokenize(final Analyzer analyzer, final String text) throws IOException { diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/AnalyzeHealthCheck.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/AnalyzeHealthCheck.java index 75d402b43..a4c56cdd7 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/AnalyzeHealthCheck.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/AnalyzeHealthCheck.java @@ -18,6 +18,7 @@ import java.util.List; import org.apache.couchdb.nouveau.api.AnalyzeRequest; import org.apache.couchdb.nouveau.api.AnalyzeResponse; +import static org.apache.couchdb.nouveau.api.LuceneVersion.*; import org.apache.couchdb.nouveau.resources.AnalyzeResource; import com.codahale.metrics.health.HealthCheck; @@ -31,7 +32,7 @@ public class AnalyzeHealthCheck extends HealthCheck { @Override protected Result check() throws Exception { - final AnalyzeRequest request = new AnalyzeRequest("standard", "hello there"); + final AnalyzeRequest request = new AnalyzeRequest(LUCENE_9, "standard", "hello there"); final AnalyzeResponse response = analyzeResource.analyzeText(request); final List<String> expected = Arrays.asList("hello", "there"); final List<String> actual = response.getTokens(); diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/IndexManagerHealthCheck.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/IndexManagerHealthCheck.java index 0cdb11b67..be990a74f 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/IndexManagerHealthCheck.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/IndexManagerHealthCheck.java @@ -16,6 +16,7 @@ package org.apache.couchdb.nouveau.health; import java.io.IOException; import org.apache.couchdb.nouveau.api.IndexDefinition; +import static org.apache.couchdb.nouveau.api.LuceneVersion.*; import org.apache.couchdb.nouveau.core.IndexManager; import org.apache.couchdb.nouveau.core.IndexManager.Index; import com.codahale.metrics.health.HealthCheck; @@ -40,7 +41,7 @@ public class IndexManagerHealthCheck extends HealthCheck { // Ignored, index might not exist yet. } - indexManager.create(name, new IndexDefinition("standard", null)); + indexManager.create(name, new IndexDefinition(LUCENE_9, "standard", null)); final Index index = indexManager.acquire(name); try { final IndexWriter writer = index.getWriter(); diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java index 9ff8f6c9c..8ba32eadb 100644 --- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java +++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java @@ -14,8 +14,6 @@ package org.apache.couchdb.nouveau.resources; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -23,54 +21,23 @@ import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response.Status; import org.apache.couchdb.nouveau.api.AnalyzeRequest; import org.apache.couchdb.nouveau.api.AnalyzeResponse; -import org.apache.couchdb.nouveau.core.AnalyzerFactory; -import com.codahale.metrics.annotation.Timed; +import org.apache.couchdb.nouveau.core.lucene.Lucene; -import v9.org.apache.lucene.analysis.Analyzer; -import v9.org.apache.lucene.analysis.TokenStream; -import v9.org.apache.lucene.analysis.tokenattributes.CharTermAttribute; +import com.codahale.metrics.annotation.Timed; @Path("/analyze") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public class AnalyzeResource { - private final AnalyzerFactory analyzerFactory; - - public AnalyzeResource(AnalyzerFactory analyzerFactory) { - this.analyzerFactory = analyzerFactory; - } - @POST @Timed public AnalyzeResponse analyzeText(@NotNull @Valid AnalyzeRequest analyzeRequest) throws IOException { - final Analyzer analyzer; - try { - analyzer = analyzerFactory.newAnalyzer(analyzeRequest.getAnalyzer()); - } catch (IllegalArgumentException e) { - throw new WebApplicationException(analyzeRequest.getAnalyzer() + " not a valid analyzer", - Status.BAD_REQUEST); - } - return new AnalyzeResponse(tokenize(analyzer, analyzeRequest.getText())); - } - - private List<String> tokenize(final Analyzer analyzer, final String text) throws IOException { - final List<String> result = new ArrayList<String>(10); - try (final TokenStream tokenStream = analyzer.tokenStream("default", text)) { - tokenStream.reset(); - while (tokenStream.incrementToken()) { - final CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class); - result.add(term.toString()); - } - tokenStream.end(); - } - return result; + return Lucene.analyzeText(analyzeRequest); } } diff --git a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java index 0dda50448..1602404ab 100644 --- a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java +++ b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java @@ -24,6 +24,7 @@ import javax.ws.rs.core.Response; import org.apache.couchdb.nouveau.api.DocumentUpdateRequest; import org.apache.couchdb.nouveau.api.IndexDefinition; +import static org.apache.couchdb.nouveau.api.LuceneVersion.*; import org.apache.couchdb.nouveau.api.SearchRequest; import org.apache.couchdb.nouveau.api.SearchResults; @@ -56,7 +57,7 @@ public class IntegrationTest { public void indexTest() { final String url = "http://localhost:" + APP.getLocalPort(); final String indexName = "foo"; - final IndexDefinition indexDefinition = new IndexDefinition("standard", null); + final IndexDefinition indexDefinition = new IndexDefinition(LUCENE_9, "standard", null); // Clean up. Response response = diff --git a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/AnalyzerFactoryTest.java b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/AnalyzerFactoryTest.java index 2027a436b..8e769a045 100644 --- a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/AnalyzerFactoryTest.java +++ b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/AnalyzerFactoryTest.java @@ -249,7 +249,7 @@ public class AnalyzerFactoryTest { } private void assertAnalyzer(final String name, final Class<? extends Analyzer> clazz) throws Exception { - final AnalyzerFactory factory = new AnalyzerFactory(); + final V9AnalyzerFactory factory = new V9AnalyzerFactory(); assertThat(factory.newAnalyzer(name)).isInstanceOf(clazz); } diff --git a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java index 29de49a74..b5151d8a5 100644 --- a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java +++ b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java @@ -16,6 +16,7 @@ package org.apache.couchdb.nouveau.core; import java.nio.file.Path; import org.apache.couchdb.nouveau.api.IndexDefinition; +import static org.apache.couchdb.nouveau.api.LuceneVersion.*; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.AfterEach; @@ -37,7 +38,7 @@ public class IndexManagerTest { @BeforeEach public void setup() throws Exception { manager = new IndexManager(); - manager.setAnalyzerFactory(new AnalyzerFactory()); + manager.setAnalyzerFactory(new V9AnalyzerFactory()); manager.setCommitIntervalSeconds(5); manager.setObjectMapper(new ObjectMapper()); manager.setRootDir(tempDir); @@ -51,7 +52,7 @@ public class IndexManagerTest { @Test public void testCreate() throws Exception { - final IndexDefinition def = new IndexDefinition("standard", null); + final IndexDefinition def = new IndexDefinition(LUCENE_9, "standard", null); manager.create("foo", def); }
