Skip to content

Commit

Permalink
Merge pull request #15645 from gkysaad/main
Browse files Browse the repository at this point in the history
Couchbase SDK 3, Spring Data Couchbase 4 Integration
  • Loading branch information
mshima committed Aug 26, 2021
2 parents e9ec251 + e8a0d56 commit 3a2e16c
Show file tree
Hide file tree
Showing 53 changed files with 1,259 additions and 421 deletions.
14 changes: 14 additions & 0 deletions .github/workflows/angular.yml
Expand Up @@ -70,6 +70,8 @@ jobs:
- ngx-mariadb-oauth2-infinispan
- ngx-mongodb-kafka-cucumber
- ngx-h2mem-ws-nol2
#- ngx-couchbase
#- ngx-gradle-couchbase-search
- ngx-gradle-fr
- ngx-gradle-mysql-es-noi18n-mapsid
- ngx-gradle-mariadb-oauth2-infinispan
Expand Down Expand Up @@ -115,6 +117,18 @@ jobs:
war: 0
e2e: 1
testcontainers: 0
#- app-sample: ngx-couchbase
# entity: couchbase
# environment: prod
# war: 0
# e2e: 1
# testcontainers: 1
#- app-sample: ngx-gradle-couchbase-search
# entity: couchbase
# environment: prod
# war: 0
# e2e: 1
# testcontainers: 1
- app-sample: ngx-gradle-fr
entity: sql
environment: prod
Expand Down
7 changes: 7 additions & 0 deletions generators/cleanup.js
Expand Up @@ -487,6 +487,13 @@ function cleanupOldServerFiles(generator, javaDir, testDir, mainResourceDir, tes
if (generator.isJhipsterVersionLessThan('7.0.0-beta.1')) {
generator.removeFile(`${javaDir}config/CloudDatabaseConfiguration.java`);
}
if (generator.isJhipsterVersionLessThan('7.1.1')) {
generator.removeFile(`${javaDir}repository/ReactiveN1qlCouchbaseRepository.java `);
generator.removeFile(`${testDir}config/DatabaseConfigurationIT.java`);
if (generator.searchEngine !== 'couchbase') {
generator.removeFile(`${javaDir}repository/CustomN1qlCouchbaseRepository.java`);
}
}
}

/**
Expand Down
12 changes: 11 additions & 1 deletion generators/entity-server/files.js
Expand Up @@ -192,7 +192,7 @@ const serverFiles = {
],
},
{
condition: generator => !generator.reactive && !generator.embedded,
condition: generator => !generator.reactive && !generator.embedded && generator.databaseType !== COUCHBASE,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
Expand All @@ -201,6 +201,16 @@ const serverFiles = {
},
],
},
{
condition: generator => !generator.reactive && !generator.embedded && generator.databaseType === COUCHBASE,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/repository/EntityRepository_couchbase.java',
renameTo: generator => `${generator.packageFolder}/repository/${generator.entityClass}Repository.java`,
},
],
},
{
condition: generator => generator.reactive && !generator.embedded,
path: SERVER_MAIN_SRC_DIR,
Expand Down
4 changes: 2 additions & 2 deletions generators/entity-server/templates/partials/save_template.ejs
Expand Up @@ -22,7 +22,7 @@ const mapper = entityInstance + 'Mapper';
const dtoToEntity = mapper + '.' + 'toEntity';
const entityToDto = mapper + '.' + 'toDto';
const entityToDtoReference = mapper + '::' + 'toDto';
const returnPrefix = (returnDirectly && !searchEngine) ? 'return' : instanceType + ' result =';
const returnPrefix = (returnDirectly && !searchEngineElasticsearch) ? 'return' : instanceType + ' result =';
let resultEntity;
let mapsIdEntityInstance;
let mapsIdRepoInstance;
Expand Down Expand Up @@ -56,7 +56,7 @@ if (isUsingMapsId) {
<%_ } _%>
<%= returnPrefix %> <%= entityInstance %>Repository.save(<%= persistInstance %>);
<%_ } _%>
<%_ if (searchEngine) { _%>
<%_ if (searchEngineElasticsearch) { _%>
<%= entityInstance %>SearchRepository.save(<%= resultEntity %>);
<%_ if (returnDirectly) { _%>
return result;
Expand Down
Expand Up @@ -30,14 +30,13 @@ import static org.springframework.data.couchbase.core.mapping.id.GenerationStrat
<&_ if (fragment.importSection) { -&>
<%_ if (!embedded) { _%>
import org.springframework.data.annotation.Id;
import org.springframework.data.couchbase.core.mapping.Document;
import org.springframework.data.couchbase.core.mapping.id.GeneratedValue;
import org.springframework.data.couchbase.core.mapping.id.IdPrefix;
<%_ } _%>
import com.couchbase.client.java.repository.annotation.Field;
import org.springframework.data.couchbase.core.mapping.Document;
import org.springframework.data.couchbase.core.mapping.Field;
<%_ if (relationships.length > 0) { _%>
import org.springframework.data.couchbase.core.query.FetchType;
import org.springframework.data.couchbase.core.query.N1qlJoin;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.stream.Collectors;
<%_ } _%>
<&_ } -&>
Expand Down Expand Up @@ -68,18 +67,18 @@ import java.util.stream.Collectors;
@GeneratedValue(strategy = UNIQUE, delimiter = ID_DELIMITER)
<%_ } _%>
<%_ } else { _%>
@Field("<%= field.fieldNameUnderscored %>")
@Field
<%_ } _%>
<&_ } -&>
<%_ } -%>

<%_ for (const field of fields.filter(field => field.fieldWithContentType)) { _%>
<&_ if (fragment.field<%- field.fieldNameCapitalized %>ContentTypeAnnotationSection) { -&>
@Field("<%= field.fieldNameUnderscored %>_content_type")
@Field
<&_ } -&>
<%_ } -%>

<%_ for (const relationship of relationships) { _%>
<%_/* for (const relationship of relationships) { _%>
<&_ if (fragment.relationship<%- relationship.relationshipNameCapitalized %>AnnotationSection) { -&>
<%_ if (relationship.relationshipOneToMany) { _%>
<%_ if (!relationship.otherEntity.embedded) { _%>
Expand All @@ -100,14 +99,17 @@ import java.util.stream.Collectors;
<&_ } -&>
<%_ } -%>
<% Commented out until N1qlJoin support is fixed */%>

<&_ if (fragment.classAdditionalRelationshipsSection) { -&>
<%_ for (const relationship of relationships) { _%>
<%_ if (!relationship.id) { _%>
<%_ if (!relationship.id && !relationship.otherEntity.embedded) { _%>
<%_ if (relationship.collection) { _%>
@JsonIgnore
@Field("<%= relationship.relationshipFieldNamePlural %>")
private Set<String> <%= relationship.relationshipFieldName %>Ids = new HashSet<>();
<%_ } else if (relationship.ownerSide) { _%>
@JsonIgnore
@Field("<%= relationship.relationshipFieldName %>")
private <%= relationship.otherEntity.primaryKey.type %> <%= relationship.relationshipFieldName %>Id;
<%_ } _%>
Expand Down Expand Up @@ -173,7 +175,7 @@ import java.util.stream.Collectors;
this.<%= relationship.relationshipFieldNamePlural %>.add(<%= relationship.otherEntityName %>);
<%_ if (!relationship.otherEntity.embedded || embedded && relationship.ownerSide) { _%>
<%_ if (!relationship.otherEntity.embedded) { _%>
this.<%= relationship.relationshipFieldName %>Ids.add(<%= relationship.otherEntityName %>.get<%= primaryKey.nameCapitalized %>());
this.<%= relationship.relationshipFieldName %>Ids.add(<%= relationship.otherEntityName %>.get<%= relationship.otherEntity.primaryKey.nameCapitalized %>());
<%_ } _%>
<%_ if (relationship.otherRelationship) { _%>
<%_ if (!relationship.otherRelationship.collection) { _%>
Expand All @@ -194,7 +196,7 @@ import java.util.stream.Collectors;
this.<%= relationship.relationshipFieldNamePlural %>.remove(<%= relationship.otherEntityName %>);
<%_ if (!relationship.otherEntity.embedded || (embedded && relationship.ownerSide)) { _%>
<%_ if (!relationship.otherEntity.embedded) { _%>
this.<%= relationship.relationshipFieldName %>Ids.remove(<%= relationship.otherEntityName %>.get<%= primaryKey.nameCapitalized %>());
this.<%= relationship.relationshipFieldName %>Ids.remove(<%= relationship.otherEntityName %>.get<%= relationship.otherEntity.primaryKey.nameCapitalized %>());
<%_ } _%>
<%_ if (relationship.otherRelationship) { _%>
<%_ if (!relationship.otherRelationship.collection) { _%>
Expand Down
Expand Up @@ -37,18 +37,12 @@ import org.springframework.data.mongodb.repository.MongoRepository;
<%_ if (databaseTypeNeo4j) { _%>
import org.springframework.data.neo4j.repository.Neo4jRepository;
<%_ } _%>
<%_ if (databaseTypeCouchbase) { _%>
import <%= packageName %>.repository.search.SearchCouchbaseRepository;
<%_ if (relationshipsContainEagerLoad) { _%>
import org.springframework.data.couchbase.core.query.Query;
<%_ } _%>
<%_ } _%>
<%_ if (databaseTypeCassandra) { _%>
import org.springframework.data.cassandra.repository.CassandraRepository;
<%_ } _%>
import org.springframework.stereotype.Repository;
<%_
if (databaseTypeSql || databaseTypeMongodb || databaseTypeCouchbase) {
if (databaseTypeSql || databaseTypeMongodb) {
let importList = fieldsContainOwnerManyToMany;
for (r of relationships) {
if (r.relationshipManyToOne && r.otherEntityUser) {
Expand All @@ -75,7 +69,7 @@ import java.util.UUID;
@SuppressWarnings("unused")
<%_ } _%>
@Repository
public interface <%= entityClass %>Repository extends <% if (databaseTypeSql) { %>JpaRepository<% } %><% if (databaseTypeMongodb) { %>MongoRepository<% } %><% if (databaseTypeNeo4j) { %>Neo4jRepository<% } %><% if (databaseTypeCassandra) { %>CassandraRepository<% } %><% if (databaseTypeCouchbase) { %>N1qlCouchbaseRepository<% } %><<%= persistClass %>, <%= primaryKey.type %>><% if (jpaMetamodelFiltering) { %>, JpaSpecificationExecutor<<%= persistClass %>><% } %><% if (searchEngineCouchbase) { %>, SearchCouchbaseRepository<<%= persistClass %>, <%= primaryKey.type %>><% } %> {
public interface <%= entityClass %>Repository extends <% if (databaseTypeSql) { %>JpaRepository<% } %><% if (databaseTypeMongodb) { %>MongoRepository<% } %><% if (databaseTypeNeo4j) { %>Neo4jRepository<% } %><% if (databaseTypeCassandra) { %>CassandraRepository<% } %><<%= persistClass %>, <%= primaryKey.type %>><% if (jpaMetamodelFiltering) { %>, JpaSpecificationExecutor<<%= persistClass %>><% } %> {
<%_
for (const relationship of relationships) {
if (relationship.relationshipManyToOne && relationship.otherEntityUser && databaseTypeSql) { _%>
Expand Down Expand Up @@ -107,17 +101,18 @@ public interface <%= entityClass %>Repository extends <% if (databaseTypeSql) {
} %> where <%= entityInstanceDbSafe %>.id =:id")
Optional<<%= persistClass %>> findOneWithEagerRelationships(@Param("id") <%= primaryKey.type %> id);
<%_
} else if (databaseTypeMongodb || databaseTypeCouchbase) { _%>
} else if (databaseTypeMongodb) { _%>
@Query("<%= (databaseTypeMongodb) ? '{}' : '#{#n1ql.selectEntity} WHERE #{#n1ql.filter}' %>")
@Query("{}")
Page<<%= persistClass %>> findAllWithEagerRelationships(Pageable pageable);
@Query("<%= (databaseTypeMongodb) ? '{}' : '#{#n1ql.selectEntity} WHERE #{#n1ql.filter}' %>")
@Query("{}")
List<<%= persistClass %>> findAllWithEagerRelationships();
@Query("<%- (databaseTypeMongodb) ? "{'id': ?0}" : "#{#n1ql.selectEntity} USE KEYS $1 WHERE #{#n1ql.filter}" %>")
@Query("{'id': ?0}")
Optional<<%= persistClass %>> findOneWithEagerRelationships(<%= primaryKey.type %> id);
<%_
}
} _%>
}
_%>
}
@@ -0,0 +1,104 @@
<%#
Copyright 2013-2021 the original author or authors from the JHipster project.

This file is part of the JHipster project, see https://www.jhipster.tech/
for more information.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-%>
package <%= packageName %>.repository;
import <%= packageName %>.domain.<%= persistClass %>;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
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;
<%_ } _%>
import org.springframework.stereotype.Repository;
<%_
let importList = fieldsContainOwnerManyToMany;
for (r of relationships) {
if (r.relationshipManyToOne && r.otherEntityUser) {
importList = true;
}
}
_%>
import java.util.List;
<%_ if (relationshipsContainEagerLoad) { _%>
import java.util.Optional;
<%_ } _%>
<%_ if (primaryKey.typeUUID) { _%>
import java.util.UUID;
<%_ } _%>
/**
* Spring Data Couchbase repository for the <%= persistClass %> entity.
*/
<%_ if (!relationshipsContainEagerLoad) { _%>
@SuppressWarnings("unused")
<%_ } _%>
@Repository
public interface <%= entityClass %>Repository extends N1qlCouchbaseRepository<<%= persistClass %>, <%= primaryKey.type %>><% if (jpaMetamodelFiltering) { %>, JpaSpecificationExecutor<<%= persistClass %>><% } %> {
<%_
if (relationships.length !== 0) { %>
String SELECT = "SELECT meta(b).id as __id, meta(b).cas as __cas, b.*" + <%
for (const relationship of relationships) {
if (relationship.collection) {
%> ", (SELECT `<%= relationship.relationshipFieldName %>`.*, meta(`<%= relationship.relationshipFieldName %>`).id FROM `<%= relationship.relationshipFieldNamePlural %>` `<%= relationship.relationshipFieldName %>`) as `<%= relationship.relationshipFieldNamePlural %>`" + <%
} else {
%> ", (SELECT `<%= relationship.relationshipFieldName %>`.*, meta(`<%= relationship.relationshipFieldName %>`).id)[0] as `<%= relationship.relationshipFieldName %>`" + <%
}
} %>
" FROM #{#n1ql.bucket} b";
String JOIN = <%
relationships.forEach(function (relationship, index) {
if (!relationship.collection) { %>
" LEFT JOIN #{#n1ql.bucket} `<%= relationship.relationshipFieldName %>` ON KEYS b.`<%= relationship.relationshipFieldName %>`"<%
} else { %>
" LEFT NEST #{#n1ql.bucket} `<%= relationship.relationshipFieldNamePlural %>` ON KEYS b.`<%= relationship.relationshipFieldNamePlural %>`"<%
}
if (index < relationships.length - 1) { %>
+ <%
}
}); %>;
default Page<<%= persistClass %>> findAll(Pageable pageable) {
return new PageImpl<>(
findAllWithPagination(pageableStatement(pageable, "b")),
pageable,
count()
);
}
@Query(SELECT + JOIN + " WHERE b.#{#n1ql.filter} #{[0]}")
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
List<<%= persistClass %>> findAllWithPagination(String pageableStatement);
@Query(SELECT + JOIN + " WHERE b.#{#n1ql.filter}")
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
List<<%= persistClass %>> findAll();
@Query(SELECT + " USE KEYS $1" + JOIN)
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
Optional<<%= persistClass %>> findById(String id);<%
} _%>
}
Expand Up @@ -8,6 +8,7 @@
"type_field": "_class"
},
"mapping": {
"analysis": {},
"default_analyzer": "standard",
"default_datetime_parser": "dateTimeOptional",
"default_field": "_all",
Expand All @@ -29,9 +30,11 @@
},
"store": {
"indexType": "scorch",
"kvStoreName": ""
"segmentVersion": 15
}
},
"sourceType": "couchbase",
"sourceName": "${bucket}"
"sourceName": "${bucket}",
"uuid": "",
"name": "<%= entityClass.toLowerCase() %>"
}
Expand Up @@ -886,7 +886,7 @@ _%>
if (field.fieldTypeZonedDateTime) { %>)<% } else
if (!field.fieldTypeString) { %>.toString()<% } %>))<%= !reactive ? ')' : '' %><%_ } _%>;
}
<% if (fieldsContainOwnerManyToMany && !databaseTypeNeo4j) { %>
<% if (fieldsContainOwnerManyToMany && !databaseTypeNeo4j && !databaseTypeCouchbase) { %>
@SuppressWarnings({"unchecked"})
void getAll<%= entityClassPlural %>WithEagerRelationshipsIsEnabled() <% if (!reactive) { %>throws Exception <% } %>{
<%_ if (!serviceNo) { _%>
Expand Down Expand Up @@ -1164,7 +1164,7 @@ _%>
<%= relationship.relationshipFieldName %> = TestUtil.findAll(em, <%= asEntity(relationship.otherEntityNameCapitalized) %>.class).get(0);
}
<%_ } else { _%>
<%= asEntity(relationship.otherEntityNameCapitalized) %> <%= relationship.relationshipFieldName %> = <%= relationship.otherEntityNameCapitalized %>ResourceIT.createEntity(em);
<%= asEntity(relationship.otherEntityNameCapitalized) %> <%= relationship.relationshipFieldName %> = <%= relationship.otherEntityNameCapitalized %>ResourceIT.createEntity(em);
<%_ } _%>
em.persist(<%= relationship.relationshipFieldName %>);
em.flush();
Expand Down
4 changes: 2 additions & 2 deletions generators/entity/index.js
Expand Up @@ -791,8 +791,8 @@ class EntityGenerator extends BaseBlueprintGenerator {
(this.context.paginate !== PAGINATION &&
relationship.relationshipType === 'many-to-many' &&
relationship.ownerSide === true)) &&
// Neo4j eagerly loads relations by default
this.context.databaseType !== NEO4J;
// Neo4j & Couchbase eagerly loads relations by default
![NEO4J, COUCHBASE].includes(this.context.databaseType);
});
this.context.relationshipsContainEagerLoad = this.context.relationships.some(relationship => relationship.relationshipEagerLoad);
this.context.eagerRelations = this.context.relationships.filter(rel => rel.relationshipEagerLoad);
Expand Down

0 comments on commit 3a2e16c

Please sign in to comment.