Skip to content

Commit a5d2d75

Browse files
authored
🐛#12 Fix missing FTS parameters (#13)
1 parent 2483e05 commit a5d2d75

6 files changed

Lines changed: 97 additions & 28 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version=3.0-SNAPSHOT
1+
version=3.1.1-SNAPSHOT
22

33
# plugins
44
lombok_version=4.1.6

src/main/java/com/github/couchmove/repository/CouchbaseRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.github.couchmove.pojo.CouchbaseEntity;
66

77
import java.time.Duration;
8+
import java.util.Map;
89

910
/**
1011
* A repository for encapsulating storage, retrieval, and removal of json documents to Couchbase {@link Bucket}

src/main/java/com/github/couchmove/repository/CouchbaseRepositoryImpl.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.time.Duration;
3939
import java.util.List;
4040
import java.util.Map;
41+
import java.util.Optional;
4142
import java.util.stream.Collectors;
4243

4344
import static com.couchbase.client.java.kv.InsertOptions.insertOptions;
@@ -160,23 +161,26 @@ public void importFtsIndex(String name, String jsonContent) {
160161
jsonContent = injectParameters(jsonContent);
161162
logger.trace("Import FTS index : \n'{}'", jsonContent);
162163
try {
163-
SearchIndex searchIndex = getJsonMapper().readValue(jsonContent, SearchIndex.class);
164+
CustomSearchIndex searchIndex = getJsonMapper().readValue(jsonContent, CustomSearchIndex.class);
164165
cluster.searchIndexes().upsertIndex(searchIndex, withRetry(upsertSearchIndexOptions()));
165166
} catch (CouchbaseException | JsonProcessingException e) {
166167
throw new CouchmoveException("Could not store FTS index '" + name + "'", e);
167168
}
168169
}
169170

170-
@Override
171-
public boolean isFtsIndexExists(String name) {
171+
public Optional<SearchIndex> getFtsIndex(String name) {
172172
try {
173-
cluster.searchIndexes().getIndex(name);
174-
return true;
173+
return Optional.of(cluster.searchIndexes().getIndex(name));
175174
} catch (IndexNotFoundException e) {
176-
return false;
175+
return Optional.empty();
177176
}
178177
}
179178

179+
@Override
180+
public boolean isFtsIndexExists(String name) {
181+
return getFtsIndex(name).isPresent();
182+
}
183+
180184
String injectParameters(String statement) {
181185
return StrSubstitutor.replace(statement, of(BUCKET_PARAM, getBucketName()));
182186
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.github.couchmove.repository;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import com.couchbase.client.java.manager.search.SearchIndex;
7+
import com.couchbase.client.core.deps.com.fasterxml.jackson.annotation.JsonCreator;
8+
import com.couchbase.client.core.deps.com.fasterxml.jackson.annotation.JsonProperty;
9+
import com.couchbase.client.core.json.Mapper;
10+
11+
public class CustomSearchIndex extends SearchIndex {
12+
13+
@JsonCreator
14+
public CustomSearchIndex(
15+
@JsonProperty("uuid") String uuid,
16+
@JsonProperty("name") String name,
17+
@JsonProperty("type") String type,
18+
@JsonProperty("params") Map<String, Object> params,
19+
@JsonProperty("sourceUUID") String sourceUuid,
20+
@JsonProperty("sourceName") String sourceName,
21+
@JsonProperty("sourceParams") Map<String, Object> sourceParams,
22+
@JsonProperty("sourceType") String sourceType,
23+
@JsonProperty("planParams") Map<String, Object> planParams) {
24+
super(uuid, name, type, params, sourceUuid, sourceName, sourceParams, sourceType, planParams);
25+
}
26+
27+
@Override
28+
public String toJson() {
29+
Map<String, Object> output = new HashMap<>();
30+
31+
if (super.uuid() != null) {
32+
output.put("uuid", super.uuid());
33+
}
34+
output.put("name", super.name());
35+
output.put("sourceName", super.sourceName());
36+
output.put("type", super.type() == null ? "fulltext-index" : super.type());
37+
output.put("sourceType", super.sourceType() == null ? "couchbase" : super.sourceType());
38+
output.put("params", super.params());
39+
output.put("planParams", super.planParams());
40+
output.put("sourceUUID", super.sourceUuid());
41+
42+
return Mapper.encodeAsString(output);
43+
}
44+
45+
}

src/test/java/com/github/couchmove/repository/CouchbaseRepositoryIT.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.couchbase.client.core.error.CasMismatchException;
44
import com.couchbase.client.core.error.DocumentExistsException;
55
import com.couchbase.client.java.manager.query.QueryIndex;
6+
import com.couchbase.client.java.manager.search.SearchIndex;
67
import com.couchbase.client.java.manager.view.DesignDocument;
78
import com.couchbase.client.java.view.DesignDocumentNamespace;
89
import com.github.couchmove.exception.CouchmoveException;
@@ -15,10 +16,12 @@
1516
import org.junit.Assert;
1617
import org.junit.jupiter.api.BeforeEach;
1718
import org.junit.jupiter.api.Test;
19+
import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper;
1820

1921
import java.io.IOException;
2022
import java.nio.charset.Charset;
2123
import java.util.List;
24+
import java.util.Map;
2225
import java.util.Random;
2326
import java.util.stream.Collectors;
2427

@@ -146,6 +149,13 @@ public void should_import_fts_index() throws IOException {
146149

147150
// Then it should be created
148151
assertThat(repository.isFtsIndexExists(TEST)).isTrue();
152+
153+
// Get fts file contents
154+
Map<String, Object> ftsIndexMap = (Map<String, Object>) CouchbaseRepositoryImpl.getJsonMapper().readValue(ftsIndex, Map.class);
155+
156+
// Ensure params is created as specified
157+
SearchIndex searchIndex = ((CouchbaseRepositoryImpl<?>) repository).getFtsIndex(TEST).get();
158+
assertThat(searchIndex.params()).isEqualTo(ftsIndexMap.get("params"));
149159
}
150160

151161
@Test

src/test/resources/db/migration/test.fts

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,37 @@
22
"name": "test",
33
"type": "fulltext-index",
44
"params": {
5-
"mapping": {
6-
"default_mapping": {
7-
"enabled": true,
8-
"dynamic": true
5+
"doc_config": {
6+
"docid_prefix_delim": "",
7+
"docid_regexp": "",
8+
"mode": "type_field",
9+
"type_field": "_class"
910
},
10-
"default_type": "_default",
11-
"default_analyzer": "standard",
12-
"default_datetime_parser": "dateTimeOptional",
13-
"default_field": "_all",
14-
"store_dynamic": false,
15-
"index_dynamic": true
16-
},
17-
"store": {
18-
"indexType": "scorch",
19-
"kvStoreName": ""
20-
},
21-
"doc_config": {
22-
"mode": "type_field",
23-
"type_field": "type",
24-
"docid_prefix_delim": "",
25-
"docid_regexp": ""
26-
}
11+
"mapping": {
12+
"analysis": {},
13+
"default_analyzer": "standard",
14+
"default_datetime_parser": "dateTimeOptional",
15+
"default_field": "_all",
16+
"default_mapping": {
17+
"dynamic": true,
18+
"enabled": false
19+
},
20+
"default_type": "_default",
21+
"docvalues_dynamic": true,
22+
"index_dynamic": true,
23+
"store_dynamic": false,
24+
"type_field": "_type",
25+
"types": {
26+
"testType": {
27+
"dynamic": true,
28+
"enabled": true
29+
}
30+
}
31+
},
32+
"store": {
33+
"indexType": "scorch",
34+
"segmentVersion": 15
35+
}
2736
},
2837
"sourceType": "couchbase",
2938
"sourceName": "${bucket}"

0 commit comments

Comments
 (0)