From 9b11ae98423bd5ef88371836fca854b1837ad7c9 Mon Sep 17 00:00:00 2001 From: Christian Strempfer Date: Mon, 10 Oct 2016 16:12:42 +0200 Subject: [PATCH] enable Morphia converters --- .../mongodb/morphia/MorphiaSerializer.java | 7 ++++ .../querydsl/mongodb/MongodbQueryTest.java | 11 ++++++ .../mongodb/MongodbSerializerTest.java | 3 +- .../com/querydsl/mongodb/domain/Country.java | 29 ++++++++++++++ .../mongodb/domain/LocaleConverter.java | 38 +++++++++++++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 querydsl-mongodb/src/test/java/com/querydsl/mongodb/domain/Country.java create mode 100644 querydsl-mongodb/src/test/java/com/querydsl/mongodb/domain/LocaleConverter.java diff --git a/querydsl-mongodb/src/main/java/com/querydsl/mongodb/morphia/MorphiaSerializer.java b/querydsl-mongodb/src/main/java/com/querydsl/mongodb/morphia/MorphiaSerializer.java index 519350ef9..99185913a 100644 --- a/querydsl-mongodb/src/main/java/com/querydsl/mongodb/morphia/MorphiaSerializer.java +++ b/querydsl-mongodb/src/main/java/com/querydsl/mongodb/morphia/MorphiaSerializer.java @@ -23,6 +23,7 @@ import org.mongodb.morphia.annotations.Reference; import org.mongodb.morphia.mapping.Mapper; import com.mongodb.DBRef; +import com.querydsl.core.types.Constant; import com.querydsl.core.types.Path; import com.querydsl.core.types.PathMetadata; import com.querydsl.mongodb.MongodbSerializer; @@ -41,6 +42,12 @@ public class MorphiaSerializer extends MongodbSerializer { this.morphia = morphia; } + @Override + public Object visit(Constant expr, Void context) { + Object value = super.visit(expr, context); + return morphia.getMapper().toMongoObject(null, null, value); + } + @Override protected String getKeyForPath(Path expr, PathMetadata metadata) { AnnotatedElement annotations = expr.getAnnotatedElement(); diff --git a/querydsl-mongodb/src/test/java/com/querydsl/mongodb/MongodbQueryTest.java b/querydsl-mongodb/src/test/java/com/querydsl/mongodb/MongodbQueryTest.java index a866235e7..5b46bbebd 100644 --- a/querydsl-mongodb/src/test/java/com/querydsl/mongodb/MongodbQueryTest.java +++ b/querydsl-mongodb/src/test/java/com/querydsl/mongodb/MongodbQueryTest.java @@ -56,6 +56,7 @@ public class MongodbQueryTest { private final QAddress address = QAddress.address; private final QMapEntity mapEntity = QMapEntity.mapEntity; private final QDates dates = QDates.dates; + private final QCountry country = QCountry.country; List users = Lists.newArrayList(); User u1, u2, u3, u4; @@ -71,6 +72,7 @@ public class MongodbQueryTest { public void before() throws UnknownHostException, MongoException { ds.delete(ds.createQuery(Item.class)); ds.delete(ds.createQuery(User.class)); + ds.delete(ds.createQuery(Country.class)); ds.delete(ds.createQuery(MapEntity.class)); tampere = new City("Tampere", 61.30, 23.50); @@ -591,6 +593,15 @@ public class MongodbQueryTest { query.asDBObject()); } + @Test + public void converter() { + Country germany = new Country("Germany", Locale.GERMANY); + ds.save(germany); + + Country fetchedCountry = query(Country.class).where(country.defaultLocale.eq(Locale.GERMANY)).fetchOne(); + assertEquals(germany, fetchedCountry); + } + //TODO // - test dates // - test with empty values and nulls diff --git a/querydsl-mongodb/src/test/java/com/querydsl/mongodb/MongodbSerializerTest.java b/querydsl-mongodb/src/test/java/com/querydsl/mongodb/MongodbSerializerTest.java index 88fd5a25f..c028557e1 100644 --- a/querydsl-mongodb/src/test/java/com/querydsl/mongodb/MongodbSerializerTest.java +++ b/querydsl-mongodb/src/test/java/com/querydsl/mongodb/MongodbSerializerTest.java @@ -23,6 +23,7 @@ import java.util.List; import org.bson.types.ObjectId; import org.junit.Before; import org.junit.Test; +import org.mongodb.morphia.Morphia; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; @@ -57,7 +58,7 @@ public class MongodbSerializerTest { @Before public void before() { - serializer = new MorphiaSerializer(null); + serializer = new MorphiaSerializer(new Morphia()); entityPath = new PathBuilder(Object.class, "obj"); title = entityPath.getString("title"); year = entityPath.getNumber("year", Integer.class); diff --git a/querydsl-mongodb/src/test/java/com/querydsl/mongodb/domain/Country.java b/querydsl-mongodb/src/test/java/com/querydsl/mongodb/domain/Country.java new file mode 100644 index 000000000..afac00143 --- /dev/null +++ b/querydsl-mongodb/src/test/java/com/querydsl/mongodb/domain/Country.java @@ -0,0 +1,29 @@ +package com.querydsl.mongodb.domain; + +import java.util.Locale; + +import org.mongodb.morphia.annotations.Converters; +import org.mongodb.morphia.annotations.Entity; + +@Entity +@Converters(LocaleConverter.class) +public class Country extends AbstractEntity { + private String name; + private Locale defaultLocale; + + Country() { } + + public Country(String name, Locale defaultLocale) { + this.name = name; + this.defaultLocale = defaultLocale; + } + + public String getName() { + return name; + } + + public Locale getDefaultLocale() { + return defaultLocale; + } + +} diff --git a/querydsl-mongodb/src/test/java/com/querydsl/mongodb/domain/LocaleConverter.java b/querydsl-mongodb/src/test/java/com/querydsl/mongodb/domain/LocaleConverter.java new file mode 100644 index 000000000..97e2f2c2e --- /dev/null +++ b/querydsl-mongodb/src/test/java/com/querydsl/mongodb/domain/LocaleConverter.java @@ -0,0 +1,38 @@ +package com.querydsl.mongodb.domain; + +import java.util.Locale; + +import org.mongodb.morphia.converters.SimpleValueConverter; +import org.mongodb.morphia.converters.TypeConverter; +import org.mongodb.morphia.mapping.MappedField; +import org.mongodb.morphia.mapping.MappingException; + +public class LocaleConverter extends TypeConverter implements SimpleValueConverter { + + public LocaleConverter() { + super(Locale.class); + } + + @Override + public final Object encode(Object value, MappedField optionalExtraInfo) throws MappingException { + if (value == null) { + return null; + } + if (!(value instanceof Locale)) { + throw new MappingException("Unable to convert " + value.getClass().getName()); + } + return ((Locale) value).toLanguageTag(); + } + + @Override + @SuppressWarnings("rawtypes") + public Locale decode(Class targetClass, Object fromDBObject, MappedField optionalExtraInfo) throws MappingException { + if (fromDBObject == null) { + return null; + } + if (fromDBObject instanceof String) { + return Locale.forLanguageTag((String) fromDBObject); + } + throw new MappingException("Unable to convert " + fromDBObject.getClass().getName()); + } +}