This is an automated email from the ASF dual-hosted git repository. rnewson pushed a commit to branch lucene-10 in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit d8169acc1510908ae9d1280e22d25a48ffb5cc73 Author: Robert Newson <[email protected]> AuthorDate: Sat Aug 23 14:18:21 2025 +0100 add lucene version to ddoc and index definition --- .../apache/couchdb/nouveau/api/IndexDefinition.java | 19 +++++++++++++++++-- .../org/apache/couchdb/nouveau/core/IndexManager.java | 3 ++- .../couchdb/nouveau/health/IndexHealthCheck.java | 5 +++-- .../nouveau/lucene9/Lucene9AnalyzerFactoryTest.java | 7 ++++--- src/nouveau/include/nouveau.hrl | 3 +++ src/nouveau/src/nouveau_index_updater.erl | 1 + src/nouveau/src/nouveau_util.erl | 16 +++++++++++++--- 7 files changed, 43 insertions(+), 11 deletions(-) diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java index 3d79fca65..ba84fcff4 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java @@ -22,6 +22,8 @@ import java.util.Map; @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class IndexDefinition { + private int luceneVersion; + @NotEmpty private String defaultAnalyzer; @@ -31,11 +33,21 @@ public class IndexDefinition { // Jackson deserialization } - public IndexDefinition(final String defaultAnalyzer, final Map<String, String> fieldAnalyzers) { + public IndexDefinition( + final int luceneVersion, final String defaultAnalyzer, final Map<String, String> fieldAnalyzers) { this.defaultAnalyzer = defaultAnalyzer; this.fieldAnalyzers = fieldAnalyzers; } + @JsonProperty + public int getLuceneVersion() { + return luceneVersion; + } + + public void setLuceneVersion(int luceneVersion) { + this.luceneVersion = luceneVersion; + } + @JsonProperty public String getDefaultAnalyzer() { return defaultAnalyzer; @@ -62,6 +74,7 @@ public class IndexDefinition { public int hashCode() { final int prime = 31; int result = 1; + result = prime * result + luceneVersion; result = prime * result + ((defaultAnalyzer == null) ? 0 : defaultAnalyzer.hashCode()); result = prime * result + ((fieldAnalyzers == null) ? 0 : fieldAnalyzers.hashCode()); return result; @@ -73,6 +86,7 @@ public class IndexDefinition { if (obj == null) return false; if (getClass() != obj.getClass()) return false; IndexDefinition other = (IndexDefinition) obj; + if (luceneVersion != other.luceneVersion) return false; if (defaultAnalyzer == null) { if (other.defaultAnalyzer != null) return false; } else if (!defaultAnalyzer.equals(other.defaultAnalyzer)) return false; @@ -84,6 +98,7 @@ public class IndexDefinition { @Override public String toString() { - return "IndexDefinition [defaultAnalyzer=" + defaultAnalyzer + ", fieldAnalyzers=" + fieldAnalyzers + "]"; + return "IndexDefinition [luceneVersion=" + luceneVersion + ", defaultAnalyzer=" + defaultAnalyzer + + ", fieldAnalyzers=" + fieldAnalyzers + "]"; } } diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java index 85230d322..fae9b6e32 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java @@ -380,7 +380,8 @@ public final class IndexManager implements Managed { final Path path = indexPath(name); final IndexDefinition indexDefinition = loadIndexDefinition(name); final Analyzer analyzer = Lucene9AnalyzerFactory.fromDefinition(indexDefinition); - final Directory dir = new DirectIODirectory(FSDirectory.open(path.resolve("9"))); + final Directory dir = new DirectIODirectory( + FSDirectory.open(path.resolve(Integer.toString(indexDefinition.getLuceneVersion())))); final IndexWriterConfig config = new IndexWriterConfig(analyzer); config.setUseCompoundFile(false); final IndexWriter writer = new IndexWriter(dir, config); diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java index 0ee8fefa2..7cebb4542 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java @@ -21,6 +21,7 @@ import org.apache.couchdb.nouveau.api.IndexDefinition; import org.apache.couchdb.nouveau.api.SearchRequest; import org.apache.couchdb.nouveau.api.SearchResults; import org.apache.couchdb.nouveau.resources.IndexResource; +import org.apache.lucene.util.Version; public final class IndexHealthCheck extends HealthCheck { @@ -32,14 +33,14 @@ public final class IndexHealthCheck extends HealthCheck { @Override protected Result check() throws Exception { - final String name = "___test9"; + final String name = "___test" + Version.LATEST.major; try { indexResource.deletePath(name, null); } catch (IOException e) { // Ignored, index might not exist yet. } - indexResource.createIndex(name, new IndexDefinition("standard", null)); + indexResource.createIndex(name, new IndexDefinition(Version.LATEST.major, "standard", null)); try { final DocumentUpdateRequest documentUpdateRequest = new DocumentUpdateRequest(0, 1, null, Collections.emptyList()); diff --git a/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene9/Lucene9AnalyzerFactoryTest.java b/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene9/Lucene9AnalyzerFactoryTest.java index eb8e30e08..95e0fb45a 100644 --- a/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene9/Lucene9AnalyzerFactoryTest.java +++ b/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene9/Lucene9AnalyzerFactoryTest.java @@ -60,6 +60,7 @@ import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.sv.SwedishAnalyzer; import org.apache.lucene.analysis.th.ThaiAnalyzer; import org.apache.lucene.analysis.tr.TurkishAnalyzer; +import org.apache.lucene.util.Version; import org.junit.jupiter.api.Test; public class Lucene9AnalyzerFactoryTest { @@ -256,8 +257,8 @@ public class Lucene9AnalyzerFactoryTest { @Test public void testFieldAnalyzers() throws Exception { - final IndexDefinition indexDefinition = - new IndexDefinition("standard", Map.of("english", "english", "thai", "thai", "email", "email")); + final IndexDefinition indexDefinition = new IndexDefinition( + Version.LATEST.major, "standard", Map.of("english", "english", "thai", "thai", "email", "email")); final Analyzer analyzer = Lucene9AnalyzerFactory.fromDefinition(indexDefinition); assertThat(analyzer).isInstanceOf(PerFieldAnalyzerWrapper.class); final Method m = PerFieldAnalyzerWrapper.class.getDeclaredMethod("getWrappedAnalyzer", String.class); @@ -275,7 +276,7 @@ public class Lucene9AnalyzerFactoryTest { private void assertAnalyzer(final String name, final Class<? extends Analyzer> clazz) throws Exception { assertThat(Lucene9AnalyzerFactory.newAnalyzer(name)).isInstanceOf(clazz); - assertThat(Lucene9AnalyzerFactory.fromDefinition(new IndexDefinition(name, null))) + assertThat(Lucene9AnalyzerFactory.fromDefinition(new IndexDefinition(Version.LATEST.major, name, null))) .isInstanceOf(clazz); } } diff --git a/src/nouveau/include/nouveau.hrl b/src/nouveau/include/nouveau.hrl index e50cd45d3..16f46bdd9 100644 --- a/src/nouveau/include/nouveau.hrl +++ b/src/nouveau/include/nouveau.hrl @@ -11,9 +11,12 @@ %% See the License for the specific language governing permissions and %% limitations under the License. +-define(LEGACY_LUCENE_VERSION, 9). + -record(index, { dbname, ddoc_id, + lucene_version, default_analyzer, field_analyzers, def, diff --git a/src/nouveau/src/nouveau_index_updater.erl b/src/nouveau/src/nouveau_index_updater.erl index 3952a893f..4bfea753a 100644 --- a/src/nouveau/src/nouveau_index_updater.erl +++ b/src/nouveau/src/nouveau_index_updater.erl @@ -204,6 +204,7 @@ get_db_info(#index{} = Index) -> index_definition(#index{} = Index) -> #{ + <<"lucene_version">> => Index#index.lucene_version, <<"default_analyzer">> => Index#index.default_analyzer, <<"field_analyzers">> => Index#index.field_analyzers }. diff --git a/src/nouveau/src/nouveau_util.erl b/src/nouveau/src/nouveau_util.erl index 0dfcb1e1e..dbc30927a 100644 --- a/src/nouveau/src/nouveau_util.erl +++ b/src/nouveau/src/nouveau_util.erl @@ -67,23 +67,33 @@ design_doc_to_index(DbName, #doc{id = Id, body = {Fields}}, IndexName) -> false -> {error, {not_found, <<IndexName/binary, " not found.">>}}; {IndexName, {Index}} -> + LuceneVersion = couch_util:get_value( + <<"lucene_version">>, Index, ?LEGACY_LUCENE_VERSION + ), DefaultAnalyzer = couch_util:get_value(<<"default_analyzer">>, Index, <<"standard">>), FieldAnalyzers = couch_util:get_value(<<"field_analyzers">>, Index, #{}), case couch_util:get_value(<<"index">>, Index) of undefined -> {error, InvalidDDocError}; Def -> - Sig = - couch_util:to_hex_bin( + SigTerm = + case LuceneVersion of + ?LEGACY_LUCENE_VERSION -> + {DefaultAnalyzer, FieldAnalyzers, Def}; + _ -> + {LuceneVersion, DefaultAnalyzer, FieldAnalyzers, Def} + end, + Sig = couch_util:to_hex_bin( crypto:hash( sha256, ?term_to_bin( - {DefaultAnalyzer, FieldAnalyzers, Def} + SigTerm ) ) ), {ok, #index{ dbname = DbName, + lucene_version = LuceneVersion, default_analyzer = DefaultAnalyzer, field_analyzers = FieldAnalyzers, ddoc_id = Id,
