diff --git a/CHANGELOG.md b/CHANGELOG.md index a5ee722..e46dd58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# Version 3.1.0 (2020-01-31) + +* [new] Morphia repository now has the ability to stream results from the database as consumed (using a cursor instead of a list behind the scenes). +* [chg] Update the Morphia module to work with business framework 4.3.0+. +* [chg] Updated Morphia to 1.5.8 (its package has changed to `dev.morphia`, update project code accordingly if necessary). + # Version 3.0.2 (2019-01-10) * [fix] Fix issue #11: an exception occurred at startup because the way of accessing the ValidationFactory changed. diff --git a/core/pom.xml b/core/pom.xml index f4c2eb4..b4d2ef0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -14,7 +14,7 @@ org.seedstack.addons.mongodb mongodb - 3.0.2-SNAPSHOT + 3.1.0-SNAPSHOT mongodb-core diff --git a/core/src/main/java/org/seedstack/mongodb/internal/AbstractMongoDbManager.java b/core/src/main/java/org/seedstack/mongodb/internal/AbstractMongoDbManager.java index 8635e73..a807d19 100644 --- a/core/src/main/java/org/seedstack/mongodb/internal/AbstractMongoDbManager.java +++ b/core/src/main/java/org/seedstack/mongodb/internal/AbstractMongoDbManager.java @@ -12,18 +12,17 @@ import com.mongodb.AuthenticationMechanism; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; -import org.seedstack.coffig.Coffig; -import org.seedstack.mongodb.MongoDbConfig; -import org.seedstack.seed.SeedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.seedstack.coffig.Coffig; +import org.seedstack.mongodb.MongoDbConfig; +import org.seedstack.seed.SeedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; abstract class AbstractMongoDbManager implements MongoDbManager { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMongoDbManager.class); diff --git a/core/src/main/java/org/seedstack/mongodb/internal/SyncMongoDbManager.java b/core/src/main/java/org/seedstack/mongodb/internal/SyncMongoDbManager.java index efa4378..1217867 100644 --- a/core/src/main/java/org/seedstack/mongodb/internal/SyncMongoDbManager.java +++ b/core/src/main/java/org/seedstack/mongodb/internal/SyncMongoDbManager.java @@ -5,6 +5,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + package org.seedstack.mongodb.internal; import com.mongodb.MongoClient; @@ -13,13 +14,12 @@ import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; +import java.util.List; import org.seedstack.coffig.BuilderSupplier; import org.seedstack.coffig.Coffig; import org.seedstack.mongodb.MongoDbConfig; import org.seedstack.seed.SeedException; -import java.util.List; - class SyncMongoDbManager extends AbstractMongoDbManager { @Override protected MongoClient doCreateClient(String clientName, MongoDbConfig.ClientConfig clientConfig, Coffig coffig) { @@ -41,7 +41,8 @@ protected void doClose(MongoClient client) { client.close(); } - private MongoClient createMongoClient(String clientName, MongoDbConfig.ClientConfig clientConfig, MongoClientOptions mongoClientOptions) { + private MongoClient createMongoClient(String clientName, MongoDbConfig.ClientConfig clientConfig, + MongoClientOptions mongoClientOptions) { List serverAddresses = buildServerAddresses(clientName, clientConfig.getHosts()); if (serverAddresses.isEmpty()) { diff --git a/morphia/pom.xml b/morphia/pom.xml index 2407b4e..f97c36d 100644 --- a/morphia/pom.xml +++ b/morphia/pom.xml @@ -14,7 +14,7 @@ org.seedstack.addons.mongodb mongodb - 3.0.2-SNAPSHOT + 3.1.0-SNAPSHOT mongodb-morphia @@ -36,13 +36,24 @@ true - org.mongodb.morphia - morphia + dev.morphia.morphia + core ${morphia.version} + + + org.mongodb + mongo-java-driver + + + + + org.mongodb + mongo-java-driver + ${mongodb.version} - org.mongodb.morphia - morphia-logging-slf4j + dev.morphia.morphia + logging-slf4j ${morphia.version} @@ -51,6 +62,12 @@ + + javax.validation + validation-api + ${javax.validation.version} + provided + org.seedstack.seed @@ -73,7 +90,7 @@ org.hibernate hibernate-validator - 6.0.13.Final + 5.4.3.Final test diff --git a/morphia/src/license/THIRD-PARTY.properties b/morphia/src/license/THIRD-PARTY.properties new file mode 100644 index 0000000..4f00996 --- /dev/null +++ b/morphia/src/license/THIRD-PARTY.properties @@ -0,0 +1,20 @@ +# Generated by org.codehaus.mojo.license.AddThirdPartyMojo +#------------------------------------------------------------------------------- +# Already used licenses in project : +# - Apache 2 +# - BSD +# - CDDL +# - IGNORED_LICENSE +# - LGPL 3.0 +# - MIT License +# - MPL 2.0 +# - Public Domain +# - The MIT License (MIT) +# - WTFPL +#------------------------------------------------------------------------------- +# Please fill the missing licenses for dependencies : +# +# +#Fri Jan 31 12:24:04 CET 2020 +dev.morphia.morphia--core--1.5.8=Apache 2 +dev.morphia.morphia--logging-slf4j--1.5.8=Apache 2 diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java index c4c89d1..7db40d2 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java @@ -5,23 +5,28 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + package org.seedstack.mongodb.morphia; import static com.google.common.base.Preconditions.checkArgument; - +import static java.util.Spliterators.spliteratorUnknownSize; + +import com.mongodb.DBCollection; +import dev.morphia.Datastore; +import dev.morphia.query.CountOptions; +import dev.morphia.query.CriteriaContainer; +import dev.morphia.query.FindOptions; +import dev.morphia.query.Query; +import dev.morphia.query.Sort; +import dev.morphia.query.internal.MorphiaCursor; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.Spliterator; import java.util.stream.Stream; +import java.util.stream.StreamSupport; import javax.inject.Inject; -import org.mongodb.morphia.Datastore; -import org.mongodb.morphia.mapping.Mapper; -import org.mongodb.morphia.query.CountOptions; -import org.mongodb.morphia.query.CriteriaContainer; -import org.mongodb.morphia.query.FindOptions; -import org.mongodb.morphia.query.Query; -import org.mongodb.morphia.query.Sort; import org.seedstack.business.domain.AggregateExistsException; import org.seedstack.business.domain.AggregateNotFoundException; import org.seedstack.business.domain.AggregateRoot; @@ -42,6 +47,7 @@ * @param Identifier class. */ public abstract class BaseMorphiaRepository, ID> extends BaseRepository { + public static final String ID_KEY = "_id"; private Datastore datastore; private SpecificationTranslator specificationTranslator; @@ -77,12 +83,14 @@ public void add(A aggregate) throws AggregateExistsException { @Override public Stream get(Specification specification, Option... options) { - return buildQuery(specification, options).asList(buildFindOptions(options)).stream(); + final MorphiaCursor cursor = buildQuery(specification, options).find(buildFindOptions(options)); + return StreamSupport.stream(spliteratorUnknownSize(cursor, Spliterator.ORDERED), false) + .onClose(cursor::close); } @Override public Optional get(ID id) { - return Optional.ofNullable(datastore.get(getAggregateRootClass(), id)); + return Optional.ofNullable(datastore.createQuery(getAggregateRootClass()).first()); } @Override @@ -92,7 +100,7 @@ public boolean contains(Specification specification) { @Override public boolean contains(ID id) { - return datastore.find(getAggregateRootClass()).filter(Mapper.ID_KEY, id).count(new CountOptions().limit(1)) > 0; + return datastore.find(getAggregateRootClass()).filter(ID_KEY, id).count(new CountOptions().limit(1)) > 0; } @Override @@ -102,7 +110,7 @@ public long count(Specification specification) { @Override public long size() { - return datastore.getCount(getAggregateRootClass()); + return datastore.createQuery(getAggregateRootClass()).count(); } @Override @@ -112,7 +120,9 @@ public long remove(Specification specification) throws AggregateNotFoundExcep @Override public void remove(ID id) throws AggregateNotFoundException { - checkExactlyOneAggregateRemoved(datastore.delete(getAggregateRootClass(), id).getN(), id); + checkExactlyOneAggregateRemoved( + datastore.delete(datastore.find(getAggregateRootClass()).filter(ID_KEY, id)).getN(), + id); } private void checkExactlyOneAggregateRemoved(int n, ID id) { @@ -143,8 +153,9 @@ public A addOrUpdate(A aggregate) { @Override public void clear() { - datastore.getCollection(getAggregateRootClass()).drop(); - datastore.getCollection(getAggregateRootClass()).dropIndexes(); + DBCollection collection = datastore.getCollection(getAggregateRootClass()); + collection.drop(); + collection.dropIndexes(); } private Query buildQuery(Specification specification, Option... options) { @@ -187,7 +198,7 @@ private void applyLimit(FindOptions findOptions, LimitOption limitOption) { findOptions.limit((int) limit); } - private void applySort(Query query, SortOption sortOption) { + private void applySort(Query query, SortOption sortOption) { List sorts = new ArrayList<>(); for (SortOption.SortedAttribute sortedAttribute : sortOption.getSortedAttributes()) { switch (sortedAttribute.getDirection()) { @@ -202,6 +213,6 @@ private void applySort(Query query, SortOption sortOption) { "Unsupported sort direction " + sortedAttribute.getDirection()); } } - query.order(sorts.toArray(new Sort[sorts.size()])); + query.order(sorts.toArray(new Sort[0])); } } \ No newline at end of file diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreFactory.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreFactory.java index 827cc6a..f110c49 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreFactory.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreFactory.java @@ -5,22 +5,22 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + package org.seedstack.mongodb.morphia.internal; +import static org.seedstack.mongodb.morphia.internal.MorphiaUtils.createDatastoreAnnotation; +import static org.seedstack.mongodb.morphia.internal.MorphiaUtils.getMongoClientConfig; + import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.name.Names; import com.mongodb.MongoClient; -import org.mongodb.morphia.Datastore; -import org.mongodb.morphia.Morphia; +import dev.morphia.Datastore; +import dev.morphia.Morphia; +import javax.inject.Inject; import org.seedstack.mongodb.morphia.MorphiaDatastore; import org.seedstack.seed.Application; -import javax.inject.Inject; - -import static org.seedstack.mongodb.morphia.internal.MorphiaUtils.createDatastoreAnnotation; -import static org.seedstack.mongodb.morphia.internal.MorphiaUtils.getMongoClientConfig; - public class DatastoreFactory { private final Application application; private final Injector injector; @@ -46,7 +46,7 @@ public Datastore createDatastore(String clientName, String dbName) { dbName ) ); - datastore.ensureIndexes(true); + datastore.ensureIndexes(); datastore.ensureCaps(); return datastore; } diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreProvider.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreProvider.java index 8fca5c6..e4c2be6 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreProvider.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreProvider.java @@ -8,7 +8,7 @@ package org.seedstack.mongodb.morphia.internal; import com.google.inject.Provider; -import org.mongodb.morphia.Datastore; +import dev.morphia.Datastore; import org.seedstack.mongodb.morphia.MorphiaDatastore; import javax.inject.Inject; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaModule.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaModule.java index 7d44b89..ff5525e 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaModule.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaModule.java @@ -15,10 +15,10 @@ import com.google.inject.Key; import com.google.inject.Scopes; import java.util.Collection; -import org.mongodb.morphia.Datastore; -import org.mongodb.morphia.Morphia; +import java.util.Collection; +import dev.morphia.Datastore; +import dev.morphia.Morphia; import org.seedstack.mongodb.morphia.MorphiaDatastore; - class MorphiaModule extends AbstractModule { private final Collection morphiaDatastoresAnnotation; private final Morphia morphia; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaPlugin.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaPlugin.java index bceff44..2022c05 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaPlugin.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaPlugin.java @@ -13,7 +13,9 @@ import io.nuun.kernel.api.plugin.request.ClasspathScanRequest; import java.util.Collection; import java.util.HashSet; -import org.mongodb.morphia.Morphia; +import java.util.Collection; +import java.util.HashSet; +import dev.morphia.Morphia; import org.seedstack.mongodb.morphia.MorphiaDatastore; import org.seedstack.seed.Application; import org.seedstack.seed.core.internal.AbstractSeedPlugin; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaSpecifications.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaSpecifications.java index 6dad22f..eb7d407 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaSpecifications.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaSpecifications.java @@ -8,8 +8,8 @@ package org.seedstack.mongodb.morphia.internal; import org.kametic.specifications.Specification; -import org.mongodb.morphia.annotations.Embedded; -import org.mongodb.morphia.annotations.Entity; +import dev.morphia.annotations.Embedded; +import dev.morphia.annotations.Entity; import org.seedstack.seed.core.internal.utils.SpecificationBuilder; import java.lang.reflect.Modifier; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/ValidatingEntityInterceptor.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/ValidatingEntityInterceptor.java index b039d4b..fb7a54b 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/ValidatingEntityInterceptor.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/ValidatingEntityInterceptor.java @@ -5,6 +5,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + package org.seedstack.mongodb.morphia.internal; import com.mongodb.DBObject; @@ -12,9 +13,9 @@ import javax.inject.Inject; import javax.validation.ConstraintViolation; import javax.validation.ValidatorFactory; -import org.mongodb.morphia.AbstractEntityInterceptor; -import org.mongodb.morphia.mapping.Mapper; import org.seedstack.seed.core.internal.validation.VerboseConstraintViolationException; +import dev.morphia.AbstractEntityInterceptor; +import dev.morphia.mapping.Mapper; class ValidatingEntityInterceptor extends AbstractEntityInterceptor { @Inject diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAndConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAndConverter.java index 4847a01..33b7bc9 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAndConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAndConverter.java @@ -8,8 +8,8 @@ package org.seedstack.mongodb.morphia.internal.specification; import java.util.Arrays; -import org.mongodb.morphia.query.Criteria; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.Criteria; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.AndSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAttributeConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAttributeConverter.java index 7931047..0719f73 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAttributeConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAttributeConverter.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.AttributeSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaEqualConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaEqualConverter.java index ab43ee0..a3bb730 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaEqualConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaEqualConverter.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.EqualSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaFalseConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaFalseConverter.java index 796d21a..86ca967 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaFalseConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaFalseConverter.java @@ -7,17 +7,16 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.mapping.Mapper; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.FalseSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; - +import org.seedstack.mongodb.morphia.BaseMorphiaRepository; class MorphiaFalseConverter implements SpecificationConverter, MorphiaTranslationContext, CriteriaContainer> { @Override public CriteriaContainer convert(FalseSpecification specification, MorphiaTranslationContext context, SpecificationTranslator, CriteriaContainer> translator) { // Always false - return context.getQuery().criteria(Mapper.ID_KEY).doesNotExist(); + return context.getQuery().criteria(BaseMorphiaRepository.ID_KEY).doesNotExist(); } } diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaGreaterThanConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaGreaterThanConverter.java index 385e078..9963bd7 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaGreaterThanConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaGreaterThanConverter.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.GreaterThanSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaIdentityConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaIdentityConverter.java index 9a77dcb..f380ac0 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaIdentityConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaIdentityConverter.java @@ -7,16 +7,16 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.mapping.Mapper; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.IdentitySpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; +import org.seedstack.mongodb.morphia.BaseMorphiaRepository; class MorphiaIdentityConverter implements SpecificationConverter, MorphiaTranslationContext, CriteriaContainer> { @Override public CriteriaContainer convert(IdentitySpecification specification, MorphiaTranslationContext context, SpecificationTranslator, CriteriaContainer> translator) { - context.setProperty(Mapper.ID_KEY); + context.setProperty(BaseMorphiaRepository.ID_KEY); // We avoid using equal() because Morphia optimizes it without operator ("someAttr": "someVal") // Thus generating an invalid query when trying to negate it ("$not": "someVal") return context.pickFieldEnd().not().notEqual(specification.getExpectedIdentifier()); diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaLessThanConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaLessThanConverter.java index f00caac..9c7dd70 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaLessThanConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaLessThanConverter.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.LessThanSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaNotConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaNotConverter.java index 966fc2e..b2421d3 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaNotConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaNotConverter.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.NotSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaOrConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaOrConverter.java index 69edb40..8157518 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaOrConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaOrConverter.java @@ -8,8 +8,8 @@ package org.seedstack.mongodb.morphia.internal.specification; import java.util.Arrays; -import org.mongodb.morphia.query.Criteria; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.Criteria; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.OrSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaSpecificationTranslator.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaSpecificationTranslator.java index 9d59847..4b0f86a 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaSpecificationTranslator.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaSpecificationTranslator.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.Specification; import org.seedstack.business.spi.BaseSpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaStringConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaStringConverter.java index 6dd6ba6..2d9b3fc 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaStringConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaStringConverter.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.StringSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaTranslationContext.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaTranslationContext.java index 4e8c09a..a46f1e0 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaTranslationContext.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaTranslationContext.java @@ -9,9 +9,9 @@ import static com.google.common.base.Preconditions.checkState; -import org.mongodb.morphia.query.CriteriaContainer; -import org.mongodb.morphia.query.FieldEnd; -import org.mongodb.morphia.query.Query; +import dev.morphia.query.CriteriaContainer; +import dev.morphia.query.FieldEnd; +import dev.morphia.query.Query; public class MorphiaTranslationContext { private final Query query; diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaTrueConverter.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaTrueConverter.java index 9e2fe8f..c356f56 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaTrueConverter.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaTrueConverter.java @@ -7,17 +7,16 @@ */ package org.seedstack.mongodb.morphia.internal.specification; -import org.mongodb.morphia.mapping.Mapper; -import org.mongodb.morphia.query.CriteriaContainer; +import dev.morphia.query.CriteriaContainer; import org.seedstack.business.specification.TrueSpecification; import org.seedstack.business.spi.SpecificationConverter; import org.seedstack.business.spi.SpecificationTranslator; - +import org.seedstack.mongodb.morphia.BaseMorphiaRepository; class MorphiaTrueConverter implements SpecificationConverter, MorphiaTranslationContext, CriteriaContainer> { @Override public CriteriaContainer convert(TrueSpecification specification, MorphiaTranslationContext context, SpecificationTranslator, CriteriaContainer> translator) { // Always true - return context.getQuery().criteria(Mapper.ID_KEY).not().doesNotExist(); + return context.getQuery().criteria(BaseMorphiaRepository.ID_KEY).not().doesNotExist(); } } diff --git a/morphia/src/test/java/org/seedstack/mongodb/morphia/MorphiaIT.java b/morphia/src/test/java/org/seedstack/mongodb/morphia/MorphiaIT.java index b73b503..af2c376 100644 --- a/morphia/src/test/java/org/seedstack/mongodb/morphia/MorphiaIT.java +++ b/morphia/src/test/java/org/seedstack/mongodb/morphia/MorphiaIT.java @@ -19,8 +19,9 @@ import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; -import org.mongodb.morphia.Datastore; -import org.mongodb.morphia.Key; +import org.junit.runner.RunWith; +import dev.morphia.Datastore; +import dev.morphia.Key; import org.seedstack.business.domain.Repository; import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy1; import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy2; diff --git a/morphia/src/test/java/org/seedstack/mongodb/morphia/SpecificationIT.java b/morphia/src/test/java/org/seedstack/mongodb/morphia/SpecificationIT.java index 23f7f1c..e4c3f4a 100644 --- a/morphia/src/test/java/org/seedstack/mongodb/morphia/SpecificationIT.java +++ b/morphia/src/test/java/org/seedstack/mongodb/morphia/SpecificationIT.java @@ -5,6 +5,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + package org.seedstack.mongodb.morphia; import static org.assertj.core.api.Assertions.assertThat; @@ -20,7 +21,12 @@ import org.seedstack.business.domain.IdentityService; import org.seedstack.business.domain.Repository; import org.seedstack.business.domain.SortOption; +import org.seedstack.business.specification.AttributeSpecification; +import org.seedstack.business.specification.EqualSpecification; +import org.seedstack.business.specification.GreaterThanSpecification; +import org.seedstack.business.specification.LessThanSpecification; import org.seedstack.business.specification.Specification; +import org.seedstack.business.specification.StringMatchingSpecification; import org.seedstack.business.specification.dsl.SpecificationBuilder; import org.seedstack.mongodb.morphia.fixtures.product.Picture; import org.seedstack.mongodb.morphia.fixtures.product.Product; @@ -34,6 +40,7 @@ public class SpecificationIT { private Product product4; private Product product5; private Product product6; + private Product product7; @Inject @Morphia private Repository repository; @@ -50,6 +57,7 @@ public void setUp() throws Exception { product4 = createProduct(4L, "product4", "url2", " picture4", 6d); product5 = createProduct(5L, "product5", "url5", "picture4 ", 1d); product6 = createProduct(6L, "product6", "url6", "picture5", 5d); + product7 = createProduct(7L, "product7", "url7", "picture5", 6d); repository.clear(); @@ -59,6 +67,7 @@ public void setUp() throws Exception { repository.add(product4); repository.add(product5); repository.add(product6); + repository.add(product7); } @After @@ -71,7 +80,7 @@ public void testTrue() throws Exception { assertThat(repository.get(specificationBuilder.of(Product.class) .all() .build()) - ).containsExactlyInAnyOrder(product1, product2, product3, product4, product5, product6); + ).containsExactlyInAnyOrder(product1, product2, product3, product4, product5, product6, product7); } @Test @@ -91,7 +100,7 @@ public void testIdentity() throws Exception { assertThat(repository.get(specificationBuilder.ofAggregate(Product.class) .identity().isNot(3L) .build()) - ).containsExactlyInAnyOrder(product1, product2, product4, product5, product6); + ).containsExactlyInAnyOrder(product1, product2, product4, product5, product6, product7); } @Test @@ -99,7 +108,7 @@ public void testGreaterThan() throws Exception { assertThat(repository.get(specificationBuilder.of(Product.class) .property("id").greaterThan(3) .build()) - ).containsExactlyInAnyOrder(product4, product5, product6); + ).containsExactlyInAnyOrder(product4, product5, product6, product7); } @Test @@ -107,7 +116,7 @@ public void testGreaterThanOrEqualTo() throws Exception { assertThat(repository.get(specificationBuilder.of(Product.class) .property("id").greaterThanOrEqualTo(3) .build()) - ).containsExactlyInAnyOrder(product3, product4, product5, product6); + ).containsExactlyInAnyOrder(product3, product4, product5, product6, product7); } @Test @@ -183,27 +192,27 @@ public void testStringMatching() throws Exception { assertThat(repository.get(specificationBuilder.of(Product.class) .property("pictures.url.url").matching("picture?") .build()) - ).containsExactlyInAnyOrder(product1, product2, product3, product6); + ).containsExactlyInAnyOrder(product1, product2, product3, product6, product7); assertThat(repository.get(specificationBuilder.of(Product.class) .property("pictures.url.url").matching("picture*") .build()) - ).containsExactlyInAnyOrder(product1, product2, product3, product5, product6); + ).containsExactlyInAnyOrder(product1, product2, product3, product5, product6, product7); assertThat(repository.get(specificationBuilder.of(Product.class) .property("pictures.url.url").matching("pict?re5") .build()) - ).containsExactlyInAnyOrder(product6); + ).containsExactlyInAnyOrder(product6, product7); assertThat(repository.get(specificationBuilder.of(Product.class) .property("pictures.url.url").matching("pic*re5") .build()) - ).containsExactlyInAnyOrder(product6); + ).containsExactlyInAnyOrder(product6, product7); assertThat(repository.get(specificationBuilder.of(Product.class) .property("pictures.url.url").matching("?ict?re5") .build()) - ).containsExactlyInAnyOrder(product6); + ).containsExactlyInAnyOrder(product6, product7); assertThat(repository.get(specificationBuilder.of(Product.class) .property("pictures.url.url").matching("*cture5") .build()) - ).containsExactlyInAnyOrder(product6); + ).containsExactlyInAnyOrder(product6, product7); } @Test @@ -243,7 +252,7 @@ public void testNot() throws Exception { assertThat(repository.get(specificationBuilder.of(Product.class) .property("pictures.url.url").not().equalTo("picture2") .build()) - ).containsExactlyInAnyOrder(product1, product3, product4, product5, product6); + ).containsExactlyInAnyOrder(product1, product3, product4, product5, product6, product7); } @Test @@ -268,6 +277,7 @@ public void testAnd() throws Exception { .property("price").equalTo(2d) .build()) ).containsExactlyInAnyOrder(product2); + assertThat(repository.get(specificationBuilder.of(Product.class) .property("pictures.url.url").equalTo("picture3") .and() @@ -276,6 +286,31 @@ public void testAnd() throws Exception { ).isEmpty(); } + @Test + public void testAndVariations() { + assertThat(repository.get( + new AttributeSpecification("pictures.url.url", new EqualSpecification<>("picture5")) + .and(new AttributeSpecification<>("designation", new StringMatchingSpecification("product?"))) + .and(new AttributeSpecification<>("price", new EqualSpecification<>(6d))) + )).containsExactly(product7); + + assertThat(repository.get( + new AttributeSpecification("pictures.url.url", new EqualSpecification<>("picture5")) + .and(new AttributeSpecification<>("designation", new StringMatchingSpecification("product?")) + .and(new AttributeSpecification<>("price", new EqualSpecification<>(6d))) + ) + )).containsExactly(product7); + + assertThat(repository.get( + new AttributeSpecification<>( + "price", + new GreaterThanSpecification<>(4d) + .and(new LessThanSpecification<>(7d)) + .and(new EqualSpecification<>(5d)) + ) + )).containsExactly(product6); + } + @Test public void testSort() throws Exception { assertThat(repository.get(Specification.any(), diff --git a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/Picture.java b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/Picture.java index 96e7da7..4f235a7 100644 --- a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/Picture.java +++ b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/Picture.java @@ -11,9 +11,9 @@ package org.seedstack.mongodb.morphia.fixtures.product; -import org.mongodb.morphia.annotations.Embedded; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; +import dev.morphia.annotations.Embedded; +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; import org.seedstack.business.domain.BaseEntity; import org.seedstack.business.domain.Identity; import org.seedstack.business.util.SequenceGenerator; diff --git a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/PictureURL.java b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/PictureURL.java index 9dfa5e3..74d26cb 100644 --- a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/PictureURL.java +++ b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/PictureURL.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.fixtures.product; -import org.mongodb.morphia.annotations.Embedded; +import dev.morphia.annotations.Embedded; import org.seedstack.business.domain.BaseValueObject; @Embedded diff --git a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/Product.java b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/Product.java index a1a2768..2c95b0b 100644 --- a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/Product.java +++ b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/product/Product.java @@ -8,8 +8,8 @@ package org.seedstack.mongodb.morphia.fixtures.product; import java.util.List; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; import org.seedstack.business.domain.BaseAggregateRoot; @Entity diff --git a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/user/Address.java b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/user/Address.java index 236f73a..deef8eb 100644 --- a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/user/Address.java +++ b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/user/Address.java @@ -7,7 +7,7 @@ */ package org.seedstack.mongodb.morphia.fixtures.user; -import org.mongodb.morphia.annotations.Embedded; +import dev.morphia.annotations.Embedded; import org.seedstack.business.domain.ValueObject; @Embedded diff --git a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/user/User.java b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/user/User.java index dd37641..7c5d502 100644 --- a/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/user/User.java +++ b/morphia/src/test/java/org/seedstack/mongodb/morphia/fixtures/user/User.java @@ -7,8 +7,8 @@ */ package org.seedstack.mongodb.morphia.fixtures.user; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; import org.seedstack.business.domain.AggregateRoot; import javax.validation.constraints.NotNull; diff --git a/pom.xml b/pom.xml index d0d68f7..3a88d98 100644 --- a/pom.xml +++ b/pom.xml @@ -14,19 +14,19 @@ org.seedstack.poms parent-internal - 3.4.6 + 3.4.8 org.seedstack.addons.mongodb mongodb - 3.0.2-SNAPSHOT + 3.1.0-SNAPSHOT pom - 3.8.5 - 3.0.3 - 1.3.2 - 4.0.0 + 3.9.1 + 3.12.1 + 1.5.8 + 4.3.0 3.0.0 @@ -59,6 +59,7 @@ Apache 2|Apache License, Version 2.0 Apache 2|The Apache Software License, Version 2.0 + Apache 2|The Apache License, Version 2.0 Apache 2|ASF 2.0 Apache 2|Apache License 2.0 Apache 2|Apache License, version 2.0 @@ -69,6 +70,7 @@ CDDL|CDDL + GPLv2 with classpath exception LGPL 3.0|GNU Lesser Public License MIT License|The MIT License + MIT License|The MIT License (MIT) MIT License|MIT license IGNORED_LICENSE|MPL 1.1 IGNORED_LICENSE|LGPL 2.1