diff --git a/examples/mongo-db-demo/pom.xml b/examples/mongo-db-demo/pom.xml index 471f134e..f86c68d6 100644 --- a/examples/mongo-db-demo/pom.xml +++ b/examples/mongo-db-demo/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.3.RELEASE + 2.1.8.RELEASE ru.otus.example @@ -15,9 +15,9 @@ Demo project for MongoDB - 1.8 - 1.8. - 1.8 + 11 + 11 + 11 diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/changelogs/InitMongoDBDataChangeLog.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/changelogs/InitMongoDBDataChangeLog.java index b36b0046..c71c7515 100644 --- a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/changelogs/InitMongoDBDataChangeLog.java +++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/changelogs/InitMongoDBDataChangeLog.java @@ -30,8 +30,7 @@ public class InitMongoDBDataChangeLog { @ChangeSet(order = "002", id = "initStudents", author = "stvort", runAlways = true) public void initStudents(MongoTemplate template){ - val student = new Student("Student #1", springDataKnowledge, mongockKnowledge); - template.save(student); + template.save(new Student("Student #1", springDataKnowledge, mongockKnowledge)); } @ChangeSet(order = "003", id = "Teacher", author = "stvort", runAlways = true) diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java index 027eec09..8b902bbf 100644 --- a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java +++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustom.java @@ -1,6 +1,12 @@ package ru.otus.example.mongodbdemo.repositories; +import ru.otus.example.mongodbdemo.model.Knowledge; + +import java.util.List; + public interface StudentRepositoryCustom { + List getStudentExperienceById(String studentId); + long getExperienceArrayLengthByStudentId(String id); void removeExperienceArrayElementsById(String id); } diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java index 8d734a09..91fb3536 100644 --- a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java +++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/repositories/StudentRepositoryCustomImpl.java @@ -3,15 +3,22 @@ package ru.otus.example.mongodbdemo.repositories; import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.val; +import org.bson.Document; import org.bson.types.ObjectId; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; +import ru.otus.example.mongodbdemo.model.Knowledge; import ru.otus.example.mongodbdemo.model.Student; +import ru.otus.example.mongodbdemo.utils.RawResultPrinter; +import java.util.List; + +import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; +import static org.springframework.data.mongodb.core.aggregation.ObjectOperators.ObjectToArray.valueOfToArray; import static org.springframework.data.mongodb.core.query.Criteria.where; @RequiredArgsConstructor @@ -23,16 +30,36 @@ public class StudentRepositoryCustomImpl implements StudentRepositoryCustom { } private final MongoTemplate mongoTemplate; + private final RawResultPrinter rawResultPrinter; - public long getExperienceArrayLengthByStudentId(String id) { + @Override + public List getStudentExperienceById(String studentId) { + Aggregation aggregation = newAggregation( + match(Criteria.where("id").is(studentId)) + , unwind("experience") + , project().andExclude("_id").and(valueOfToArray("experience")).as("experience_map") + , project().and("experience_map").arrayElementAt(1).as("experience_id_map") + , project().and("experience_id_map.v").as("experience_id") + , lookup("knowledge", "experience_id", "_id", "experience") + , project().and("experience._id").as("_id").and("experience.name").as("name") + ); + + Document rawResults = mongoTemplate.aggregate(aggregation, Student.class, Knowledge.class).getRawResults(); + rawResultPrinter.prettyPrintRawResult(rawResults); + return mongoTemplate.aggregate(aggregation, Student.class, Knowledge.class).getMappedResults(); + } + + @Override + public long getExperienceArrayLengthByStudentId(String studentId) { val aggregation = Aggregation.newAggregation( - Aggregation.match(where("id").is(id)), - Aggregation.project().andExclude("_id").and("experience").size().as("size")); + match(where("id").is(studentId)), + project().andExclude("_id").and("experience").size().as("size")); val arraySizeProjection = mongoTemplate.aggregate(aggregation, Student.class, ArraySizeProjection.class).getUniqueMappedResult(); return arraySizeProjection == null ? 0 : arraySizeProjection.getSize(); } + @Override public void removeExperienceArrayElementsById(String id) { val query = Query.query(Criteria.where("$id").is(new ObjectId(id))); val update = new Update().pull("experience", query); diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinter.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinter.java new file mode 100644 index 00000000..e033d42d --- /dev/null +++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinter.java @@ -0,0 +1,8 @@ +package ru.otus.example.mongodbdemo.utils; + +import org.bson.Document; + +public interface RawResultPrinter { + @SuppressWarnings("unchecked") + void prettyPrintRawResult(Document document); +} diff --git a/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java new file mode 100644 index 00000000..1fcd9a7c --- /dev/null +++ b/examples/mongo-db-demo/src/main/java/ru/otus/example/mongodbdemo/utils/RawResultPrinterImpl.java @@ -0,0 +1,18 @@ +package ru.otus.example.mongodbdemo.utils; + +import org.bson.Document; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class RawResultPrinterImpl implements RawResultPrinter { + @SuppressWarnings("unchecked") + @Override + public void prettyPrintRawResult(Document document) { + List results = (List) document.get("results"); + String resultsAsString = results.stream().map(Document::toString).collect(Collectors.joining("\n")); + System.out.println(resultsAsString); + } +} diff --git a/examples/mongo-db-demo/src/main/resources/application.yml b/examples/mongo-db-demo/src/main/resources/application.yml index 6f2c5b5a..4d338124 100644 --- a/examples/mongo-db-demo/src/main/resources/application.yml +++ b/examples/mongo-db-demo/src/main/resources/application.yml @@ -4,3 +4,6 @@ spring: uri: mongodb://localhost port: 27017 database: awesomeMongo +logging: + level: + root: ERROR \ No newline at end of file diff --git a/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/AbstractRepositoryTest.java b/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/AbstractRepositoryTest.java index e3723a05..f1342168 100644 --- a/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/AbstractRepositoryTest.java +++ b/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/AbstractRepositoryTest.java @@ -3,11 +3,12 @@ package ru.otus.example.mongodbdemo.repositories; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.annotation.DirtiesContext; +import org.springframework.context.annotation.Import; +import ru.otus.example.mongodbdemo.utils.RawResultPrinterImpl; @DataMongoTest @EnableConfigurationProperties @ComponentScan({"ru.otus.example.mongodbdemo.config", "ru.otus.example.mongodbdemo.repositories"}) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@Import(RawResultPrinterImpl.class) public abstract class AbstractRepositoryTest { } diff --git a/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java b/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java index 94533d52..f70740c8 100644 --- a/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java +++ b/examples/mongo-db-demo/src/test/java/ru/otus/example/mongodbdemo/repositories/withlisteners/StudentRepositoryWithListenersTest.java @@ -10,6 +10,8 @@ import ru.otus.example.mongodbdemo.model.Student; import ru.otus.example.mongodbdemo.repositories.AbstractRepositoryTest; import ru.otus.example.mongodbdemo.repositories.StudentRepository; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; @DisplayName("StudentRepository при наличии listener-ов в контексте ") @@ -28,4 +30,12 @@ class StudentRepositoryWithListenersTest extends AbstractRepositoryTest { assertThat(actual.getName()).isEqualTo(student.getName()); } + @DisplayName("должен возвращать корректный список знаний студента") + @Test + void shouldReturnCorrectStudentKnowledgeList(){ + val student = studentRepository.findAll().get(0); + List knowledgeList = studentRepository.getStudentExperienceById(student.getId()); + assertThat(knowledgeList).containsExactlyInAnyOrderElementsOf(student.getExperience()); + } + } diff --git a/examples/mongo-db-demo/src/test/resources/application.yml b/examples/mongo-db-demo/src/test/resources/application.yml index 8b39c9df..e4a55735 100644 --- a/examples/mongo-db-demo/src/test/resources/application.yml +++ b/examples/mongo-db-demo/src/test/resources/application.yml @@ -5,4 +5,7 @@ spring: database: test #uri: mongodb://localhost #port: 27017 - #database: awesomeMongo \ No newline at end of file + #database: awesomeMongo +logging: + level: + root: ERROR \ No newline at end of file