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,

Reply via email to