Skip to content

Commit 9779f5a

Browse files
committed
Fully implemented base repository
1 parent 9f691c5 commit 9779f5a

16 files changed

+51
-53
lines changed

morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package org.seedstack.mongodb.morphia;
99

1010
import org.mongodb.morphia.Datastore;
11-
import org.mongodb.morphia.mapping.Mapper;
1211
import org.mongodb.morphia.query.CriteriaContainer;
1312
import org.mongodb.morphia.query.Query;
1413
import org.seedstack.business.domain.AggregateExistsException;
@@ -18,7 +17,7 @@
1817
import org.seedstack.business.specification.Specification;
1918
import org.seedstack.business.spi.specification.SpecificationTranslator;
2019
import org.seedstack.mongodb.morphia.internal.DatastoreFactory;
21-
import org.seedstack.mongodb.morphia.internal.specification.MorphiaQueryContext;
20+
import org.seedstack.mongodb.morphia.internal.specification.MorphiaTranslationContext;
2221

2322
import javax.inject.Inject;
2423
import java.util.Optional;
@@ -33,7 +32,7 @@
3332
*/
3433
public abstract class BaseMorphiaRepository<A extends AggregateRoot<ID>, ID> extends BaseRepository<A, ID> {
3534
private Datastore datastore;
36-
private SpecificationTranslator<MorphiaQueryContext, CriteriaContainer> specificationTranslator;
35+
private SpecificationTranslator<MorphiaTranslationContext, CriteriaContainer> specificationTranslator;
3736

3837
public BaseMorphiaRepository() {
3938

@@ -44,7 +43,7 @@ public BaseMorphiaRepository(Class<A> aggregateRootClass, Class<ID> kClass) {
4443
}
4544

4645
@Inject
47-
private void init(DatastoreFactory datastoreFactory, SpecificationTranslator<MorphiaQueryContext, CriteriaContainer> specificationTranslator) {
46+
private void init(DatastoreFactory datastoreFactory, SpecificationTranslator<MorphiaTranslationContext, CriteriaContainer> specificationTranslator) {
4847
this.datastore = datastoreFactory.createDatastore(getAggregateRootClass());
4948
this.specificationTranslator = specificationTranslator;
5049
}
@@ -65,34 +64,22 @@ public void add(A aggregate) throws AggregateExistsException {
6564

6665
@Override
6766
public Stream<A> get(Specification<A> specification, Option... options) {
68-
Query<A> query = datastore.createQuery(getAggregateRootClass());
69-
specificationTranslator.translate(
70-
specification,
71-
new MorphiaQueryContext<>(query)
72-
);
73-
return query.asList().stream();
67+
return buildQuery(specification).asList().stream();
7468
}
7569

7670
@Override
7771
public Optional<A> get(ID id) {
7872
return Optional.ofNullable(datastore.get(getAggregateRootClass(), id));
7973
}
8074

81-
@Override
82-
public boolean contains(Specification<A> specification) {
83-
// TODO
84-
return false;
85-
}
86-
8775
@Override
8876
public boolean contains(ID id) {
89-
return datastore.find(getAggregateRootClass()).filter(Mapper.ID_KEY, id).getKey() != null;
77+
return datastore.exists(id) != null;
9078
}
9179

9280
@Override
9381
public long count(Specification<A> specification) {
94-
// TODO
95-
return 0;
82+
return buildQuery(specification).count();
9683
}
9784

9885
@Override
@@ -102,8 +89,8 @@ public long size() {
10289

10390
@Override
10491
public long remove(Specification<A> specification) throws AggregateNotFoundException {
105-
// TODO
106-
return 0;
92+
Query<A> query = buildQuery(specification);
93+
return datastore.delete(query).getN();
10794
}
10895

10996
@Override
@@ -137,4 +124,13 @@ public void clear() {
137124
datastore.getCollection(getAggregateRootClass()).drop();
138125
datastore.getCollection(getAggregateRootClass()).dropIndexes();
139126
}
127+
128+
private Query<A> buildQuery(Specification<A> specification) {
129+
Query<A> query = datastore.createQuery(getAggregateRootClass());
130+
specificationTranslator.translate(
131+
specification,
132+
new MorphiaTranslationContext<>(query)
133+
);
134+
return query;
135+
}
140136
}

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaAndConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

1515
import java.util.Arrays;
1616

17-
public class MorphiaAndConverter<T, V> implements SpecificationConverter<AndSpecification<V>, MorphiaQueryContext<T>, CriteriaContainer> {
17+
public class MorphiaAndConverter implements SpecificationConverter<AndSpecification<?>, MorphiaTranslationContext<?>, CriteriaContainer> {
1818
@Override
19-
public CriteriaContainer convert(AndSpecification<V> specification, MorphiaQueryContext<T> context, SpecificationTranslator<MorphiaQueryContext<T>, CriteriaContainer> translator) {
19+
public CriteriaContainer convert(AndSpecification<?> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
2020
return context.getQuery().and(
2121
Arrays.stream(specification.getSpecifications())
2222
.map(spec -> translator.translate(spec, context))

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaEqualConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
import org.seedstack.business.spi.specification.SpecificationTranslator;
1414

1515

16-
public class MorphiaEqualConverter<T, V> implements SpecificationConverter<EqualSpecification<V>, MorphiaQueryContext<T>, CriteriaContainer> {
16+
public class MorphiaEqualConverter implements SpecificationConverter<EqualSpecification<?>, MorphiaTranslationContext<?>, CriteriaContainer> {
1717
@Override
18-
public CriteriaContainer convert(EqualSpecification<V> specification, MorphiaQueryContext<T> context, SpecificationTranslator<MorphiaQueryContext<T>, CriteriaContainer> translator) {
18+
public CriteriaContainer convert(EqualSpecification<?> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
1919
if (specification.getExpectedValue() == null) {
2020
return context.pickFieldEnd().doesNotExist();
2121
} else {

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaFalseConverter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
*/
88
package org.seedstack.mongodb.morphia.internal.specification;
99

10+
import org.mongodb.morphia.mapping.Mapper;
1011
import org.mongodb.morphia.query.CriteriaContainer;
1112
import org.seedstack.business.specification.FalseSpecification;
1213
import org.seedstack.business.spi.specification.SpecificationConverter;
1314
import org.seedstack.business.spi.specification.SpecificationTranslator;
1415

1516

16-
public class MorphiaFalseConverter<T, V> implements SpecificationConverter<FalseSpecification<V>, MorphiaQueryContext<T>, CriteriaContainer> {
17+
public class MorphiaFalseConverter implements SpecificationConverter<FalseSpecification<?>, MorphiaTranslationContext<?>, CriteriaContainer> {
1718
@Override
18-
public CriteriaContainer convert(FalseSpecification<V> specification, MorphiaQueryContext<T> context, SpecificationTranslator<MorphiaQueryContext<T>, CriteriaContainer> translator) {
19+
public CriteriaContainer convert(FalseSpecification<?> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
1920
// Always false
20-
return context.getQuery().criteria("_id").doesNotExist();
21+
return context.getQuery().criteria(Mapper.ID_KEY).doesNotExist();
2122
}
2223
}

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaGreaterThanConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
import org.seedstack.business.spi.specification.SpecificationTranslator;
1414

1515

16-
public class MorphiaGreaterThanConverter<T, V extends Comparable<? super V>> implements SpecificationConverter<GreaterThanSpecification<V>, MorphiaQueryContext<T>, CriteriaContainer> {
16+
public class MorphiaGreaterThanConverter<V extends Comparable<? super V>> implements SpecificationConverter<GreaterThanSpecification<V>, MorphiaTranslationContext<?>, CriteriaContainer> {
1717
@Override
18-
public CriteriaContainer convert(GreaterThanSpecification<V> specification, MorphiaQueryContext<T> context, SpecificationTranslator<MorphiaQueryContext<T>, CriteriaContainer> translator) {
18+
public CriteriaContainer convert(GreaterThanSpecification<V> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
1919
return context.pickFieldEnd().greaterThan(specification.getExpectedValue());
2020
}
2121
}

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaIdentityConverter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77
*/
88
package org.seedstack.mongodb.morphia.internal.specification;
99

10+
import org.mongodb.morphia.mapping.Mapper;
1011
import org.mongodb.morphia.query.CriteriaContainer;
11-
import org.seedstack.business.domain.AggregateRoot;
1212
import org.seedstack.business.specification.IdentitySpecification;
1313
import org.seedstack.business.spi.specification.SpecificationConverter;
1414
import org.seedstack.business.spi.specification.SpecificationTranslator;
1515

16-
public class MorphiaIdentityConverter<A extends AggregateRoot<ID>, ID> implements SpecificationConverter<IdentitySpecification<A, ID>, MorphiaQueryContext<A>, CriteriaContainer> {
16+
public class MorphiaIdentityConverter implements SpecificationConverter<IdentitySpecification<?, ?>, MorphiaTranslationContext<?>, CriteriaContainer> {
1717
@Override
18-
public CriteriaContainer convert(IdentitySpecification<A, ID> specification, MorphiaQueryContext<A> context, SpecificationTranslator<MorphiaQueryContext<A>, CriteriaContainer> translator) {
19-
context.setFieldEnd("_id");
18+
public CriteriaContainer convert(IdentitySpecification<?, ?> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
19+
context.setFieldEnd(Mapper.ID_KEY);
2020
// We avoid using equal() because Morphia optimizes it without operator ("someAttr": "someVal")
2121
// Thus generating an invalid query when trying to negate it ("$not": "someVal")
2222
return context.pickFieldEnd().not().notEqual(specification.getExpectedIdentifier());

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaLessThanConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
import org.seedstack.business.spi.specification.SpecificationTranslator;
1414

1515

16-
public class MorphiaLessThanConverter<T, V extends Comparable<? super V>> implements SpecificationConverter<LessThanSpecification<V>, MorphiaQueryContext<T>, CriteriaContainer> {
16+
public class MorphiaLessThanConverter<V extends Comparable<? super V>> implements SpecificationConverter<LessThanSpecification<V>, MorphiaTranslationContext<?>, CriteriaContainer> {
1717
@Override
18-
public CriteriaContainer convert(LessThanSpecification<V> specification, MorphiaQueryContext<T> context, SpecificationTranslator<MorphiaQueryContext<T>, CriteriaContainer> translator) {
18+
public CriteriaContainer convert(LessThanSpecification<V> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
1919
return context.pickFieldEnd().lessThan(specification.getExpectedValue());
2020
}
2121
}

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaNotConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
import org.seedstack.business.spi.specification.SpecificationConverter;
1313
import org.seedstack.business.spi.specification.SpecificationTranslator;
1414

15-
public class MorphiaNotConverter<T, V> implements SpecificationConverter<NotSpecification<V>, MorphiaQueryContext<T>, CriteriaContainer> {
15+
public class MorphiaNotConverter implements SpecificationConverter<NotSpecification<?>, MorphiaTranslationContext<?>, CriteriaContainer> {
1616
@Override
17-
public CriteriaContainer convert(NotSpecification<V> specification, MorphiaQueryContext<T> context, SpecificationTranslator<MorphiaQueryContext<T>, CriteriaContainer> translator) {
17+
public CriteriaContainer convert(NotSpecification<?> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
1818
context.not();
1919
return translator.translate(specification.getSpecification(), context);
2020
}

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaOrConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

1515
import java.util.Arrays;
1616

17-
public class MorphiaOrConverter<T, V> implements SpecificationConverter<OrSpecification<V>, MorphiaQueryContext<T>, CriteriaContainer> {
17+
public class MorphiaOrConverter implements SpecificationConverter<OrSpecification<?>, MorphiaTranslationContext<?>, CriteriaContainer> {
1818
@Override
19-
public CriteriaContainer convert(OrSpecification<V> specification, MorphiaQueryContext<T> context, SpecificationTranslator<MorphiaQueryContext<T>, CriteriaContainer> translator) {
19+
public CriteriaContainer convert(OrSpecification<?> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
2020
return context.getQuery().or(
2121
Arrays.stream(specification.getSpecifications())
2222
.map(spec -> translator.translate(spec, context))

morphia/src/main/java/org/seedstack/mongodb/morphia/internal/specification/MorphiaPropertyConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
import org.seedstack.business.spi.specification.SpecificationConverter;
1313
import org.seedstack.business.spi.specification.SpecificationTranslator;
1414

15-
public class MorphiaPropertyConverter<T> implements SpecificationConverter<PropertySpecification<T, ?>, MorphiaQueryContext<T>, CriteriaContainer> {
15+
public class MorphiaPropertyConverter implements SpecificationConverter<PropertySpecification<?, ?>, MorphiaTranslationContext<?>, CriteriaContainer> {
1616
@Override
17-
public CriteriaContainer convert(PropertySpecification<T, ?> specification, MorphiaQueryContext<T> context, SpecificationTranslator<MorphiaQueryContext<T>, CriteriaContainer> translator) {
17+
public CriteriaContainer convert(PropertySpecification<?, ?> specification, MorphiaTranslationContext<?> context, SpecificationTranslator<MorphiaTranslationContext<?>, CriteriaContainer> translator) {
1818
context.setFieldEnd(specification.getPath());
1919
return translator.translate(specification.getValueSpecification(), context);
2020
}

0 commit comments

Comments
 (0)