Skip to content

Commit

Permalink
Merge pull request #16102 from tchlyah/feat/refactor-couchbase-search
Browse files Browse the repository at this point in the history
Refactor Couchbase Search using N1QL queries and Upgrade to 7.0.0
  • Loading branch information
mshima authored Sep 1, 2021
2 parents 9bf7f9d + fc39214 commit 7a6068e
Show file tree
Hide file tree
Showing 20 changed files with 104 additions and 256 deletions.
4 changes: 4 additions & 0 deletions generators/cleanup.js
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,10 @@ function cleanupOldServerFiles(generator, javaDir, testDir, mainResourceDir, tes
generator.removeFile(`${testDir}config/DatabaseConfigurationIT.java`);
if (generator.searchEngine !== 'couchbase') {
generator.removeFile(`${javaDir}repository/CustomN1qlCouchbaseRepository.java`);
} else {
generator.removeFile(`${javaDir}repository/CustomCouchbaseRepository.java`);
generator.removeFile(`${javaDir}repository/SearchCouchbaseRepository.java`);
generator.removeFile(`${testDir}repository/CustomCouchbaseRepositoryTest.java`);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const entityToDtoReference = mapper + '::' + 'toDto'; %>
return StreamSupport
.stream(<%= entityInstance %>SearchRepository.search(query).spliterator(), false)
<%_ } else { _%>
return <%= entityInstance %>Repository.search(<%= entityClass %>.PREFIX, query)<% if (!dtoMapstruct) { %>;<% } else { %>.stream()<% } %>
return <%= entityInstance %>Repository.search(query)<% if (!dtoMapstruct) { %>;<% } else { %>.stream()<% } %>
<%_ } _%>
<%_ if (dtoMapstruct) { _%>
.map(<%= entityToDtoReference %>)
Expand All @@ -34,7 +34,7 @@ const entityToDtoReference = mapper + '::' + 'toDto'; %>
.collect(Collectors.toList());
<%_ } _%>
<%_ } else { _%>
return <%= entityInstance %><% if (searchEngineElasticsearch) { %>Search<% } %>Repository.search(<% if (searchEngineCouchbase) { %><%= entityClass %>.PREFIX, <% } %>query)<%_ if (dtoMapstruct) { %>
return <%= entityInstance %><% if (searchEngineElasticsearch) { %>Search<% } %>Repository.search(query)<%_ if (dtoMapstruct) { %>
.map(<%= entityToDtoReference %>)<%_ } %><%_ if (fromResource) { _%>.collectList()<%_ } _%>;
<%_ } _%>
<%_ } else { _%>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ if (paginationNo) { %>
<%_ if (viaService) { _%>
Page<<%= instanceType %>> page = <%= entityInstance %>Service.search(query, pageable);
<%_ } else { _%>
Page<<%= persistClass %>> page = <%= entityInstance %><% if (searchEngineElasticsearch) { %>Search<% } %>Repository.search(<% if (searchEngineElasticsearch) { %>query<% } else { %><%= entityClass %>.PREFIX, query<% } %>, pageable);
Page<<%= persistClass %>> page = <%= entityInstance %><% if (searchEngineElasticsearch) { %>Search<% } %>Repository.search(query, pageable);
<%_ } _%>
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (!reactive) { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } else { %>UriComponentsBuilder.fromHttpRequest(request)<% } %>, page);
return ResponseEntity.ok().headers(headers).body(<% if (!viaService && dtoMapstruct) { %><%= entityListToDtoListReference %>(<% } %>page.getContent()<% if (!viaService && dtoMapstruct) { %>)<% } %>);
Expand All @@ -43,7 +43,7 @@ if (paginationNo) { %>
(searchEngineElasticsearch ? 'Search' : '') + 'Repository.count' %>()
.map(total -> new PageImpl<>(new ArrayList<>(), pageable, total))
.map(page -> PaginationUtil.generatePaginationHttpHeaders(UriComponentsBuilder.fromHttpRequest(request), page))
.map(headers -> ResponseEntity.ok().headers(headers).body(<%= entityInstance %><%= viaService ? 'Service' : (searchEngineElasticsearch ? 'Search' : '') + 'Repository' %>.search(<% if (!viaService && searchEngineCouchbase) { %><%= entityClass %>.PREFIX, <% } %>query, pageable)<% if (!viaService && dtoMapstruct) { %>.map(<%= entityToDtoReference %>)<% } %>));
.map(headers -> ResponseEntity.ok().headers(headers).body(<%= entityInstance %><%= viaService ? 'Service' : (searchEngineElasticsearch ? 'Search' : '') + 'Repository' %>.search(query, pageable)<% if (!viaService && dtoMapstruct) { %>.map(<%= entityToDtoReference %>)<% } %>));
<%_ } _%>
<% } -%>
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,22 @@ package <%= packageName %>.repository;
import <%= packageName %>.domain.<%= persistClass %>;
<%_ if (relationships.length !== 0 || searchEngineCouchbase) { _%>
import org.springframework.data.couchbase.repository.Query;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.PageImpl;
import static <%= packageName %>.repository.N1qlCouchbaseRepository.pageableStatement;
<%_ } _%>
<%_ if (relationships.length !== 0) { _%>
import com.couchbase.client.java.query.QueryScanConsistency;
import org.springframework.data.couchbase.repository.ScanConsistency;
<%_ if (relationships.length !== 0) { _%>
import org.springframework.data.couchbase.repository.Query;
import org.springframework.data.domain.PageImpl;
import java.util.Optional;
import static <%= packageName %>.repository.N1qlCouchbaseRepository.pageableStatement;
<%_ } _%>
<%_ if (searchEngineCouchbase) { _%>
import static <%= packageName %>.repository.N1qlCouchbaseRepository.searchQuery;
import com.couchbase.client.java.query.QueryScanConsistency;
import org.springframework.data.couchbase.repository.ScanConsistency;
<%_ } _%>
import org.springframework.stereotype.Repository;
<%_
Expand Down Expand Up @@ -101,4 +108,23 @@ public interface <%= entityClass %>Repository extends N1qlCouchbaseRepository<<%
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
Optional<<%= persistClass %>> findById(String id);<%
} _%>
<%_ if (searchEngineCouchbase) { _%>
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
<%_ if (relationships.length === 0) { _%>
@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND SEARCH(#{#n1ql.bucket}, #{[0]}) #{[1]}")
<%_ } else { _%>
@Query(SELECT + JOIN + " WHERE b.#{#n1ql.filter} AND SEARCH(b, #{[0]}) #{[1]}")
<%_ } _%>
List<<%= persistClass %>> search(String queryString, String pageableStatement);
default List<<%= persistClass %>> search(String queryString) {
return search(searchQuery(queryString).toString(), "");
}
default Page<<%= persistClass %>> search(String queryString, Pageable pageable) {
return new PageImpl<>(search(searchQuery(queryString).toString(), pageableStatement(pageable<% if (relationships.length !== 0) { %>, "b"<% } %>)));
}
<%_ } _%>

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@ import <%= packageName %>.domain.<%= persistClass %>;
import org.springframework.data.cassandra.repository.ReactiveCassandraRepository;
<%_ } _%>
<%_ if (databaseTypeCouchbase) { _%>
import <%= packageName %>.repository.search.SearchCouchbaseRepository;
<%_ } _%>
<%_ if (databaseTypeCouchbase) { _%>
import org.springframework.data.couchbase.core.query.Query;
import org.springframework.data.couchbase.repository.ReactiveCouchbaseSortingRepository;
<%_ } _%>
Expand Down Expand Up @@ -64,7 +61,7 @@ import java.util.UUID;
*/
@SuppressWarnings("unused")
@Repository
public interface <%= entityClass %>Repository extends <% if (databaseTypeSql) { %>R2dbc<% } if (databaseTypeMongodb) { %>ReactiveMongo<% } if (databaseTypeCouchbase) { %>ReactiveN1qlCouchbase<% } if (databaseTypeNeo4j) { %>ReactiveNeo4j<% } if (databaseTypeCassandra) { %>ReactiveCassandra<% } %>Repository<<%= persistClass %>, <%= primaryKey.type %>><% if (searchEngineCouchbase) { %>, SearchCouchbaseRepository<<%= persistClass %>, <%= primaryKey.type %>><% } %><% if (databaseTypeSql) { %>, <%= entityClass %>RepositoryInternal<% } %> {
public interface <%= entityClass %>Repository extends <% if (databaseTypeSql) { %>R2dbc<% } if (databaseTypeMongodb) { %>ReactiveMongo<% } if (databaseTypeCouchbase) { %>ReactiveN1qlCouchbase<% } if (databaseTypeNeo4j) { %>ReactiveNeo4j<% } if (databaseTypeCassandra) { %>ReactiveCassandra<% } %>Repository<<%= persistClass %>, <%= primaryKey.type %>><% if (databaseTypeSql) { %>, <%= entityClass %>RepositoryInternal<% } %> {
<%_ if (!paginationNo) { _%>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ public class <%= serviceClassName %><% if (serviceImpl) { %> implements <%= enti
log.debug("Request to search <%= entityClassPlural %> for query {}", query);<%- include('../../common/search_stream_template', {viaService: false, fromResource: false}); -%>
<%_ } else { _%>
log.debug("Request to search for a page of <%= entityClassPlural %> for query {}", query);
return <%= entityInstance %><% if (searchEngineElasticsearch) { %>Search<% } %>Repository.search(<% if (searchEngineElasticsearch) { %>query<% } else { %><%= entityClass %>.PREFIX, query<% } %>, pageable)<%_ if (!dtoMapstruct) { _%>;<% } else { %>
return <%= entityInstance %><% if (searchEngineElasticsearch) { %>Search<% } %>Repository.search(query, pageable)<%_ if (!dtoMapstruct) { _%>;<% } else { %>
.map(<%= entityToDtoReference %>);
<%_ } } _%>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1736,10 +1736,6 @@ _%>
.thenReturn(Stream.of(<%= persistInstance %>));
<%_ } _%>
<%_ } _%>
<%_ } else if (searchEngineCouchbase) { _%>

// Wait for the <%= entityInstance %> to be indexed
TestUtil.retryUntilNotEmpty(() -> <%= entityInstance %>Repository.search(<%= entityClass %>.PREFIX, "id:" + <%= entityInstance %>.get<%= primaryKey.nameCapitalized %>())<% if (reactive) { %>.collectList().block()<% } %>);
<%_ } _%>

// Search the <%= entityInstance %>
Expand Down
2 changes: 1 addition & 1 deletion generators/generator-constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ const DOCKER_MYSQL = 'mysql:8.0.25';
const DOCKER_MARIADB = 'mariadb:10.6.1';
const DOCKER_POSTGRESQL = 'postgres:13.3';
const DOCKER_MONGODB = 'mongo:4.4.6';
const DOCKER_COUCHBASE = 'couchbase/server:6.6.2';
const DOCKER_COUCHBASE = 'couchbase/server:7.0.0';
const DOCKER_CASSANDRA = 'cassandra:3.11.10';
const DOCKER_MSSQL = 'mcr.microsoft.com/mssql/server:2019-CU11-ubuntu-20.04';
const DOCKER_NEO4J = 'neo4j:4.2.7';
Expand Down
16 changes: 1 addition & 15 deletions generators/server/__snapshots__/generator.spec.mjs.snap
Original file line number Diff line number Diff line change
Expand Up @@ -763,10 +763,6 @@ Object {
"condition": [Function],
"path": "src/main/java/",
"templates": Array [
Object {
"file": "package/repository/CustomCouchbaseRepository.java",
"renameTo": [Function],
},
Object {
"file": "package/repository/N1qlCouchbaseRepository.java",
"renameTo": [Function],
Expand All @@ -783,22 +779,12 @@ Object {
},
],
},
Object {
"condition": [Function],
"path": "src/main/java/",
"templates": Array [
Object {
"file": "package/repository/search/SearchCouchbaseRepository.java",
"renameTo": [Function],
},
],
},
Object {
"condition": [Function],
"path": "src/test/java/",
"templates": Array [
Object {
"file": "package/repository/CustomCouchbaseRepositoryTest.java",
"file": "package/repository/N1qlCouchbaseRepositoryTest.java",
"renameTo": [Function],
},
],
Expand Down
18 changes: 2 additions & 16 deletions generators/server/files.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,6 @@ const couchbaseFiles = {
condition: generator => !generator.reactive,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/repository/CustomCouchbaseRepository.java',
renameTo: generator => `${generator.javaDir}repository/CustomCouchbaseRepository.java`,
},
{
file: 'package/repository/N1qlCouchbaseRepository.java',
renameTo: generator => `${generator.javaDir}repository/N1qlCouchbaseRepository.java`,
Expand All @@ -176,23 +172,13 @@ const couchbaseFiles = {
},
],
},
{
condition: generator => generator.searchEngine === COUCHBASE,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/repository/search/SearchCouchbaseRepository.java',
renameTo: generator => `${generator.javaDir}repository/search/SearchCouchbaseRepository.java`,
},
],
},
{
condition: generator => generator.searchEngine === COUCHBASE,
path: SERVER_TEST_SRC_DIR,
templates: [
{
file: 'package/repository/CustomCouchbaseRepositoryTest.java',
renameTo: generator => `${generator.testDir}repository/CustomCouchbaseRepositoryTest.java`,
file: 'package/repository/N1qlCouchbaseRepositoryTest.java',
renameTo: generator => `${generator.testDir}repository/N1qlCouchbaseRepositoryTest.java`,
},
],
},
Expand Down
6 changes: 6 additions & 0 deletions generators/server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,12 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
'docker:db:await': 'wait-on tcp:9042 && sleep 20',
});
}
if (databaseType === COUCHBASE) {
scriptsStorage.set({
'docker:db:await':
'echo "Waiting for Couchbase to start" && wait-on http-get://localhost:8091/ui/index.html && sleep 30 && echo "Couchbase started"',
});
}
if (databaseType === COUCHBASE || databaseType === CASSANDRA) {
scriptsStorage.set({
'docker:db:build': `docker-compose -f ${dockerFile} build`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,6 @@ import com.couchbase.client.java.Bucket;
import com.couchbase.client.java.Cluster;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.couchmove.Couchmove;
<%_ if (searchEngineCouchbase) { _%>
import <%= packageName %>.repository.Custom<% if (reactive) { %>Reactive<% } %>CouchbaseRepository;
<%_ } else if (searchEngineElasticsearch) { _%>
import org.springframework.data.couchbase.repository.<% if (reactive) { %>Reactive<% } %>CouchbaseRepository;
<%_ } _%>
import <%= packageName %>.config.couchbase.CustomCouchbaseRepositoryFactoryBean;
Expand Down Expand Up @@ -81,7 +76,7 @@ import reactor.core.publisher.Flux;
@Enable<% if (reactive) { %>Reactive<% } %>ElasticsearchRepositories("<%= packageName %>.repository.search")
<%_ } _%>
@Profile("!" + JHipsterConstants.SPRING_PROFILE_CLOUD)
@Enable<% if (reactive) { %>Reactive<% } %>CouchbaseRepositories(<% if (searchEngineCouchbase) { %>repositoryBaseClass = Custom<% if (reactive) { %>Reactive<% } %>CouchbaseRepository.class, <% } %>basePackages = "<%= packageName %>.repository", repositoryFactoryBeanClass = CustomCouchbaseRepositoryFactoryBean.class<%_ if (searchEngineElasticsearch) { %>,
@Enable<% if (reactive) { %>Reactive<% } %>CouchbaseRepositories(basePackages = "<%= packageName %>.repository", repositoryFactoryBeanClass = CustomCouchbaseRepositoryFactoryBean.class<%_ if (searchEngineElasticsearch) { %>,
includeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, value = <% if (reactive) { %>Reactive<% } %>CouchbaseRepository.class)<%_ } _%>)
<%_ if (!reactive) { _%>
@EnableCouchbaseAuditing(auditorAwareRef = "springSecurityAuditorAware", dateTimeProviderRef = "")
Expand Down

This file was deleted.

Loading

0 comments on commit 7a6068e

Please sign in to comment.