Skip to content

Commit 6c3dbdc

Browse files
committed
support legacy indexes but prevent new ones
1 parent 95420a3 commit 6c3dbdc

7 files changed

Lines changed: 40 additions & 19 deletions

File tree

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,23 @@
1313

1414
package org.apache.couchdb.nouveau.api;
1515

16+
import com.fasterxml.jackson.annotation.JsonIgnore;
1617
import com.fasterxml.jackson.annotation.JsonProperty;
1718
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
1819
import com.fasterxml.jackson.databind.annotation.JsonNaming;
20+
import jakarta.validation.constraints.Max;
21+
import jakarta.validation.constraints.Min;
1922
import jakarta.validation.constraints.NotEmpty;
2023
import java.util.Map;
2124

2225
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
2326
public class IndexDefinition {
2427

2528
public static final int LEGACY_LUCENE_VERSION = 9;
29+
public static final int LATEST_LUCENE_VERSION = 10;
2630

31+
@Min(LEGACY_LUCENE_VERSION)
32+
@Max(LATEST_LUCENE_VERSION)
2733
private int luceneVersion = LEGACY_LUCENE_VERSION; // Legacy version if not set.
2834

2935
@NotEmpty
@@ -47,6 +53,11 @@ public int getLuceneVersion() {
4753
return luceneVersion;
4854
}
4955

56+
@JsonIgnore
57+
public boolean isLatestVersion() {
58+
return luceneVersion == LATEST_LUCENE_VERSION;
59+
}
60+
5061
public void setLuceneVersion(int luceneVersion) {
5162
this.luceneVersion = luceneVersion;
5263
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.apache.lucene.analysis.Analyzer;
4040
import org.apache.lucene.index.IndexWriter;
4141
import org.apache.lucene.index.IndexWriterConfig;
42+
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
4243
import org.apache.lucene.misc.store.DirectIODirectory;
4344
import org.apache.lucene.search.SearcherFactory;
4445
import org.apache.lucene.search.SearcherManager;
@@ -393,9 +394,12 @@ private Index load(final String name) throws IOException {
393394
final Path path = indexPath(name);
394395
final IndexDefinition indexDefinition = loadIndexDefinition(name);
395396
final Analyzer analyzer = LuceneAnalyzerFactory.fromDefinition(indexDefinition);
396-
final Directory dir = new DirectIODirectory(
397-
FSDirectory.open(path.resolve(Integer.toString(indexDefinition.getLuceneVersion()))));
397+
final int luceneVersion = indexDefinition.getLuceneVersion();
398+
final Directory dir = new DirectIODirectory(FSDirectory.open(path.resolve(Integer.toString(luceneVersion))));
398399
final IndexWriterConfig config = new IndexWriterConfig(analyzer);
400+
if (luceneVersion != IndexDefinition.LATEST_LUCENE_VERSION) {
401+
config.setOpenMode(OpenMode.APPEND);
402+
}
399403
config.setUseCompoundFile(false);
400404
final IndexWriter writer = new IndexWriter(dir, config);
401405
final long updateSeq = getSeq(writer, "update_seq");

nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ protected Result check() throws Exception {
3939
// Ignored, index might not exist yet.
4040
}
4141

42-
indexResource.createIndex(name, new IndexDefinition(IndexDefinition.LEGACY_LUCENE_VERSION, "standard", null));
42+
indexResource.createIndex(name, new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null));
4343
try {
4444
final DocumentUpdateRequest documentUpdateRequest =
4545
new DocumentUpdateRequest(0, 1, null, Collections.emptyList());

nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
import jakarta.ws.rs.Path;
2727
import jakarta.ws.rs.PathParam;
2828
import jakarta.ws.rs.Produces;
29+
import jakarta.ws.rs.WebApplicationException;
2930
import jakarta.ws.rs.core.MediaType;
31+
import jakarta.ws.rs.core.Response.Status;
3032
import java.io.IOException;
3133
import java.util.List;
3234
import java.util.Objects;
@@ -57,6 +59,10 @@ public IndexResource(final IndexManager indexManager) {
5759
@PUT
5860
public Ok createIndex(@PathParam("name") String name, @NotNull @Valid IndexDefinition indexDefinition)
5961
throws IOException {
62+
if (!indexDefinition.isLatestVersion()) {
63+
throw new WebApplicationException(
64+
"Cannot create a new version " + indexDefinition.getLuceneVersion() + " index", Status.BAD_REQUEST);
65+
}
6066
indexManager.create(name, indexDefinition);
6167
return Ok.INSTANCE;
6268
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ public void cleanup() throws Exception {
6161

6262
@Test
6363
public void managerReturnsUsableIndex() throws Exception {
64-
final IndexDefinition indexDefinition = new IndexDefinition();
65-
indexDefinition.setDefaultAnalyzer("standard");
64+
final IndexDefinition indexDefinition =
65+
new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null);
6666
manager.create("foo", indexDefinition);
6767
var searchRequest = new SearchRequest();
6868
searchRequest.setQuery("*:*");
@@ -72,8 +72,8 @@ 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 =
76+
new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null);
7777

7878
manager.create("bar", indexDefinition);
7979

@@ -90,8 +90,8 @@ public void managerReopensAClosedIndex() throws Exception {
9090

9191
@Test
9292
public void deleteAllRemovesIndexByName() throws Exception {
93-
final IndexDefinition indexDefinition = new IndexDefinition();
94-
indexDefinition.setDefaultAnalyzer("standard");
93+
final IndexDefinition indexDefinition =
94+
new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null);
9595

9696
assertThat(countIndexes()).isEqualTo(0);
9797
manager.create("bar", indexDefinition);
@@ -102,8 +102,8 @@ public void deleteAllRemovesIndexByName() throws Exception {
102102

103103
@Test
104104
public void deleteAllRemovesIndexByPath() throws Exception {
105-
final IndexDefinition indexDefinition = new IndexDefinition();
106-
indexDefinition.setDefaultAnalyzer("standard");
105+
final IndexDefinition indexDefinition =
106+
new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null);
107107

108108
assertThat(countIndexes()).isEqualTo(0);
109109
manager.create("foo/bar", indexDefinition);
@@ -114,8 +114,8 @@ public void deleteAllRemovesIndexByPath() throws Exception {
114114

115115
@Test
116116
public void deleteAllRemovesIndexByGlob() throws Exception {
117-
final IndexDefinition indexDefinition = new IndexDefinition();
118-
indexDefinition.setDefaultAnalyzer("standard");
117+
final IndexDefinition indexDefinition =
118+
new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null);
119119

120120
assertThat(countIndexes()).isEqualTo(0);
121121
manager.create("foo/bar", indexDefinition);
@@ -126,8 +126,8 @@ public void deleteAllRemovesIndexByGlob() throws Exception {
126126

127127
@Test
128128
public void deleteAllRemovesIndexByGlobExceptExclusions() throws Exception {
129-
final IndexDefinition indexDefinition = new IndexDefinition();
130-
indexDefinition.setDefaultAnalyzer("standard");
129+
final IndexDefinition indexDefinition =
130+
new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null);
131131

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ public void testturkish() throws Exception {
257257
@Test
258258
public void testFieldAnalyzers() throws Exception {
259259
final IndexDefinition indexDefinition = new IndexDefinition(
260-
IndexDefinition.LEGACY_LUCENE_VERSION,
260+
IndexDefinition.LATEST_LUCENE_VERSION,
261261
"standard",
262262
Map.of("english", "english", "thai", "thai", "email", "email"));
263263
final Analyzer analyzer = LuceneAnalyzerFactory.fromDefinition(indexDefinition);
@@ -278,7 +278,7 @@ public void testUnknownAnalyzer() throws Exception {
278278
private void assertAnalyzer(final String name, final Class<? extends Analyzer> clazz) throws Exception {
279279
assertThat(LuceneAnalyzerFactory.newAnalyzer(name)).isInstanceOf(clazz);
280280
assertThat(LuceneAnalyzerFactory.fromDefinition(
281-
new IndexDefinition(IndexDefinition.LEGACY_LUCENE_VERSION, name, null)))
281+
new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, name, null)))
282282
.isInstanceOf(clazz);
283283
}
284284
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@
4848
public class LuceneIndexTest {
4949

5050
protected final Index setup(final Path path) throws IOException {
51-
final IndexDefinition indexDefinition = new IndexDefinition();
52-
indexDefinition.setDefaultAnalyzer("standard");
51+
final IndexDefinition indexDefinition =
52+
new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null);
5353
final Analyzer analyzer = LuceneAnalyzerFactory.fromDefinition(indexDefinition);
5454
final Directory dir = new DirectIODirectory(FSDirectory.open(path));
5555
final IndexWriterConfig config = new IndexWriterConfig(analyzer);

0 commit comments

Comments
 (0)