Skip to content

Commit

Permalink
feat(mongo): #26 use mongo field as ObjectId key
Browse files Browse the repository at this point in the history
close #26
  • Loading branch information
Marthym committed Jun 13, 2024
1 parent fcce9e1 commit e011574
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,33 @@
import fr.ght1pc9kc.juery.api.filter.NoCriterion;
import fr.ght1pc9kc.juery.api.filter.NotOperation;
import fr.ght1pc9kc.juery.api.filter.OrOperation;
import lombok.AllArgsConstructor;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

@AllArgsConstructor
/**
* Convert a {@link fr.ght1pc9kc.juery.api.Criteria} into a Mongo filter query
*/
public class MongoFilterVisitor implements CriteriaVisitor<Bson> {

private final List<String> idsFields;
private final Set<String> objectIdFields;
private final Map<String, String> propertiesMapping;

/**
* Create a new MongoFilterVisitor
*
* @param objectIdFields A Set of mongo properties that must be considered as Mongo {@link ObjectId}
* @param propertiesMapping A properties mapping from query property name to Mongo database field name
*/
public MongoFilterVisitor(Collection<String> objectIdFields, Map<String, String> propertiesMapping) {
this.objectIdFields = Set.copyOf(objectIdFields);
this.propertiesMapping = Map.copyOf(propertiesMapping);
}

@Override
public Bson visitNoCriteria(NoCriterion none) {
return Filters.empty();
Expand Down Expand Up @@ -54,7 +68,7 @@ public Bson visitOr(OrOperation operation) {
@Override
public <T> Bson visitEqual(EqualOperation<T> operation) {
String mappedProperty = propertiesMapping.get(operation.field.property);
if (idsFields.contains(operation.field.property)) {
if (objectIdFields.contains(mappedProperty)) {
return Filters.eq(mappedProperty, new ObjectId(String.valueOf(operation.value.value)));
}
return Filters.eq(mappedProperty, operation.value.value);
Expand All @@ -63,7 +77,7 @@ public <T> Bson visitEqual(EqualOperation<T> operation) {
@Override
public <T> Bson visitGreaterThan(GreaterThanOperation<T> operation) {
String mappedProperty = propertiesMapping.get(operation.field.property);
if (idsFields.contains(operation.field.property)) {
if (objectIdFields.contains(mappedProperty)) {
return Filters.gt(mappedProperty, new ObjectId(String.valueOf(operation.value.value)));
}
return Filters.gt(mappedProperty, operation.value.value);
Expand All @@ -72,7 +86,7 @@ public <T> Bson visitGreaterThan(GreaterThanOperation<T> operation) {
@Override
public <T> Bson visitGreaterThanEquals(GreaterThanEqualsOperation<T> operation) {
String mappedProperty = propertiesMapping.get(operation.field.property);
if (idsFields.contains(operation.field.property)) {
if (objectIdFields.contains(mappedProperty)) {
return Filters.gte(mappedProperty, new ObjectId(String.valueOf(operation.value.value)));
}
return Filters.gte(mappedProperty, operation.value.value);
Expand All @@ -81,7 +95,7 @@ public <T> Bson visitGreaterThanEquals(GreaterThanEqualsOperation<T> operation)
@Override
public <T> Bson visitLowerThan(LowerThanOperation<T> operation) {
String mappedProperty = propertiesMapping.get(operation.field.property);
if (idsFields.contains(operation.field.property)) {
if (objectIdFields.contains(mappedProperty)) {
return Filters.lt(mappedProperty, new ObjectId(String.valueOf(operation.value.value)));
}
return Filters.lt(mappedProperty, operation.value.value);
Expand All @@ -90,7 +104,7 @@ public <T> Bson visitLowerThan(LowerThanOperation<T> operation) {
@Override
public <T> Bson visitLowerThanEquals(LowerThanEqualsOperation<T> operation) {
String mappedProperty = propertiesMapping.get(operation.field.property);
if (idsFields.contains(operation.field.property)) {
if (objectIdFields.contains(mappedProperty)) {
return Filters.lte(mappedProperty, new ObjectId(String.valueOf(operation.value.value)));
}
return Filters.lte(mappedProperty, operation.value.value);
Expand All @@ -99,7 +113,7 @@ public <T> Bson visitLowerThanEquals(LowerThanEqualsOperation<T> operation) {
@Override
public <T> Bson visitIn(InOperation<T> operation) {
String mappedProperty = propertiesMapping.get(operation.field.property);
if (idsFields.contains(operation.field.property)) {
if (objectIdFields.contains(mappedProperty)) {
List<ObjectId> list = operation.value.value.stream()
.map(value -> new ObjectId(String.valueOf(value)))
.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

public class SchemaSample {

public static final String ID = "myID";
public static final String ID = "_id";
public static final List<String> IDS_FIELD = List.of(ID);
public static final Map<String, String> PROPERTIES_MAPPING = Map.of(
ID, "_id",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,39 @@ private static Stream<Arguments> provideSCriteria() {
Filters.gt("pubdate", NOW)),
Arguments.of(Criteria.property("pubdate").gt(NOW.toLocalDate()),
Filters.gt("pubdate", NOW.toLocalDate())),
Arguments.of(Criteria.property(SchemaSample.ID).gt("632046635f85998fed60c32e"),
Filters.gt("_id", new ObjectId("632046635f85998fed60c32e"))),

Arguments.of(Criteria.property("title").eq("title"),
Filters.eq("title", "title")),
Arguments.of(Criteria.property("id").eq(1222),
Filters.eq("id", 1222)),
Arguments.of(Criteria.property(SchemaSample.ID).eq("632046635f85998fed60c32e"),
Filters.eq("_id", new ObjectId("632046635f85998fed60c32e"))),

Arguments.of(Criteria.property("id").gte(1222),
Filters.gte("id", 1222)),
Arguments.of(Criteria.property(SchemaSample.ID).gte("632046635f85998fed60c32e"),
Filters.gte("_id", new ObjectId("632046635f85998fed60c32e"))),

Arguments.of(Criteria.property("id").lt(1222),
Filters.lt("id", 1222)),
Arguments.of(Criteria.property(SchemaSample.ID).lt("632046635f85998fed60c32e"),
Filters.lt("_id", new ObjectId("632046635f85998fed60c32e"))),

Arguments.of(Criteria.property("id").lte(1222),
Filters.lte("id", 1222)),
Arguments.of(Criteria.property(SchemaSample.ID).lte("632046635f85998fed60c32e"),
Filters.lte("_id", new ObjectId("632046635f85998fed60c32e"))),

Arguments.of(Criteria.property("id").in(List.of(1, 2)),
Filters.in("id", List.of(1, 2))),
Arguments.of(Criteria.property(SchemaSample.ID).in("632046635f85998fed60c32e", "632046635f85998fed60c32e"),
Filters.in("_id", List.of(
new ObjectId("632046635f85998fed60c32e"),
new ObjectId("632046635f85998fed60c32e")
))),

Arguments.of(Criteria.or(Criteria.property("id").eq(1),
Criteria.property("title").eq("title")),
Filters.or(Filters.eq("id", 1), Filters.eq("title", "title"))),
Expand Down

0 comments on commit e011574

Please sign in to comment.