Skip to content

Commit a59f5e0

Browse files
committed
Allow existing legacy indexes but prevent new ones
1 parent b55d1c1 commit a59f5e0

File tree

4 files changed

+28
-17
lines changed

4 files changed

+28
-17
lines changed

nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,20 @@
1616
import com.fasterxml.jackson.annotation.JsonProperty;
1717
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
1818
import com.fasterxml.jackson.databind.annotation.JsonNaming;
19+
import jakarta.validation.constraints.Max;
20+
import jakarta.validation.constraints.Min;
1921
import jakarta.validation.constraints.NotEmpty;
2022
import java.util.Map;
2123

2224
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
2325
public class IndexDefinition {
2426

25-
private int luceneVersion = 9; // Legacy version if not set.
27+
public static final int LATEST_LUCENE_VERSION = 10;
28+
public static final int LEGACY_LUCENE_VERSION = 9;
29+
30+
@Max(LATEST_LUCENE_VERSION)
31+
@Min(LEGACY_LUCENE_VERSION)
32+
private int luceneVersion = LEGACY_LUCENE_VERSION; // Legacy version if not set.
2633

2734
@NotEmpty
2835
private String defaultAnalyzer;

nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,16 @@
3737
import org.apache.couchdb.nouveau.lucene.LuceneAnalyzerFactory;
3838
import org.apache.couchdb.nouveau.lucene.LuceneIndex;
3939
import org.apache.lucene.analysis.Analyzer;
40+
import org.apache.lucene.backward_codecs.lucene912.Lucene912Codec;
4041
import org.apache.lucene.index.IndexWriter;
4142
import org.apache.lucene.index.IndexWriterConfig;
43+
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
4244
import org.apache.lucene.misc.store.DirectIODirectory;
4345
import org.apache.lucene.search.SearcherFactory;
4446
import org.apache.lucene.search.SearcherManager;
4547
import org.apache.lucene.store.Directory;
4648
import org.apache.lucene.store.FSDirectory;
49+
import org.apache.lucene.util.Version;
4750
import org.slf4j.Logger;
4851
import org.slf4j.LoggerFactory;
4952

@@ -218,7 +221,6 @@ public void create(final String name, IndexDefinition indexDefinition) throws IO
218221
assertSame(indexDefinition, loadIndexDefinition(name));
219222
return;
220223
}
221-
222224
final Lock lock = this.createLock.writeLock(name);
223225
lock.lock();
224226
try {
@@ -393,9 +395,15 @@ private Index load(final String name) throws IOException {
393395
final Path path = indexPath(name);
394396
final IndexDefinition indexDefinition = loadIndexDefinition(name);
395397
final Analyzer analyzer = LuceneAnalyzerFactory.fromDefinition(indexDefinition);
396-
final Directory dir = new DirectIODirectory(
397-
FSDirectory.open(path.resolve(Integer.toString(indexDefinition.getLuceneVersion()))));
398+
final int luceneVersion = indexDefinition.getLuceneVersion();
399+
final Directory dir = new DirectIODirectory(FSDirectory.open(path.resolve(Integer.toString(luceneVersion))));
398400
final IndexWriterConfig config = new IndexWriterConfig(analyzer);
401+
if (luceneVersion != Version.LATEST.major) {
402+
config.setOpenMode(OpenMode.APPEND);
403+
}
404+
if (luceneVersion == IndexDefinition.LEGACY_LUCENE_VERSION) {
405+
config.setCodec(new Lucene912Codec());
406+
}
399407
config.setUseCompoundFile(false);
400408
final IndexWriter writer = new IndexWriter(dir, config);
401409
final long updateSeq = getSeq(writer, "update_seq");

nouveau/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.couchdb.nouveau.api.IndexDefinition;
2828
import org.apache.couchdb.nouveau.api.SearchRequest;
2929
import org.apache.couchdb.nouveau.lucene.ParallelSearcherFactory;
30+
import org.apache.lucene.util.Version;
3031
import org.junit.jupiter.api.AfterEach;
3132
import org.junit.jupiter.api.BeforeEach;
3233
import org.junit.jupiter.api.Test;
@@ -61,8 +62,7 @@ public void cleanup() throws Exception {
6162

6263
@Test
6364
public void managerReturnsUsableIndex() throws Exception {
64-
final IndexDefinition indexDefinition = new IndexDefinition();
65-
indexDefinition.setDefaultAnalyzer("standard");
65+
final IndexDefinition indexDefinition = new IndexDefinition(Version.LATEST.major, "standard", null);
6666
manager.create("foo", indexDefinition);
6767
var searchRequest = new SearchRequest();
6868
searchRequest.setQuery("*:*");
@@ -72,8 +72,7 @@ public void managerReturnsUsableIndex() throws Exception {
7272

7373
@Test
7474
public void managerReopensAClosedIndex() throws Exception {
75-
final IndexDefinition indexDefinition = new IndexDefinition();
76-
indexDefinition.setDefaultAnalyzer("standard");
75+
final IndexDefinition indexDefinition = new IndexDefinition(Version.LATEST.major, "standard", null);
7776

7877
manager.create("bar", indexDefinition);
7978

@@ -90,8 +89,7 @@ public void managerReopensAClosedIndex() throws Exception {
9089

9190
@Test
9291
public void deleteAllRemovesIndexByName() throws Exception {
93-
final IndexDefinition indexDefinition = new IndexDefinition();
94-
indexDefinition.setDefaultAnalyzer("standard");
92+
final IndexDefinition indexDefinition = new IndexDefinition(Version.LATEST.major, "standard", null);
9593

9694
assertThat(countIndexes()).isEqualTo(0);
9795
manager.create("bar", indexDefinition);
@@ -102,8 +100,7 @@ public void deleteAllRemovesIndexByName() throws Exception {
102100

103101
@Test
104102
public void deleteAllRemovesIndexByPath() throws Exception {
105-
final IndexDefinition indexDefinition = new IndexDefinition();
106-
indexDefinition.setDefaultAnalyzer("standard");
103+
final IndexDefinition indexDefinition = new IndexDefinition(Version.LATEST.major, "standard", null);
107104

108105
assertThat(countIndexes()).isEqualTo(0);
109106
manager.create("foo/bar", indexDefinition);
@@ -114,8 +111,7 @@ public void deleteAllRemovesIndexByPath() throws Exception {
114111

115112
@Test
116113
public void deleteAllRemovesIndexByGlob() throws Exception {
117-
final IndexDefinition indexDefinition = new IndexDefinition();
118-
indexDefinition.setDefaultAnalyzer("standard");
114+
final IndexDefinition indexDefinition = new IndexDefinition(Version.LATEST.major, "standard", null);
119115

120116
assertThat(countIndexes()).isEqualTo(0);
121117
manager.create("foo/bar", indexDefinition);
@@ -126,8 +122,7 @@ public void deleteAllRemovesIndexByGlob() throws Exception {
126122

127123
@Test
128124
public void deleteAllRemovesIndexByGlobExceptExclusions() throws Exception {
129-
final IndexDefinition indexDefinition = new IndexDefinition();
130-
indexDefinition.setDefaultAnalyzer("standard");
125+
final IndexDefinition indexDefinition = new IndexDefinition(Version.LATEST.major, "standard", null);
131126

132127
assertThat(countIndexes()).isEqualTo(0);
133128
manager.create("foo/bar", indexDefinition);

nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneIndexTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,14 @@
4242
import org.apache.lucene.search.SearcherManager;
4343
import org.apache.lucene.store.Directory;
4444
import org.apache.lucene.store.FSDirectory;
45+
import org.apache.lucene.util.Version;
4546
import org.junit.jupiter.api.Test;
4647
import org.junit.jupiter.api.io.TempDir;
4748

4849
public class LuceneIndexTest {
4950

5051
protected final Index setup(final Path path) throws IOException {
51-
final IndexDefinition indexDefinition = new IndexDefinition();
52+
final IndexDefinition indexDefinition = new IndexDefinition(Version.LATEST.major, "standard", null);
5253
indexDefinition.setDefaultAnalyzer("standard");
5354
final Analyzer analyzer = LuceneAnalyzerFactory.fromDefinition(indexDefinition);
5455
final Directory dir = new DirectIODirectory(FSDirectory.open(path));

0 commit comments

Comments
 (0)