From 6458747971d2ec15c5fa01f432a4c8a2fbeaa16f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Thu, 10 Sep 2009 09:11:33 +0000 Subject: [PATCH] added supertype serialization --- .../java/com/mysema/query/apt/Processor.java | 7 +++- .../query/collections/impl/ColQueryImpl.java | 11 ------ .../query/collections/domain/Animal.java | 1 + .../collections/domain/TypeCastTest.java | 25 +++++++++++++ .../query/codegen/EntitySerializer.java | 19 +++++++--- .../com/mysema/query/codegen/Serializers.java | 4 +- .../query/codegen/SupertypeSerializer.java | 37 +++++++++++++++++++ .../mysema/query/codegen/SerializerTest.java | 2 +- .../query/hql/hibernate/HibernateQuery.java | 10 ++++- .../com/mysema/query/hql/jpa/JPAQuery.java | 5 +++ .../query/jdoql/AbstractJDOQLQuery.java | 6 --- .../mysema/query/jdoql/JDOQLQueryImpl.java | 9 +++-- .../mysema/query/sql/MetaDataExporter.java | 2 +- 13 files changed, 106 insertions(+), 32 deletions(-) create mode 100644 querydsl-collections/src/test/java/com/mysema/query/collections/domain/TypeCastTest.java create mode 100644 querydsl-core/src/main/java/com/mysema/query/codegen/SupertypeSerializer.java diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java index 2815f41a1..d3c5f5dc4 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java @@ -71,6 +71,11 @@ public class Processor { ClassModel model = element.accept(entityVisitor, null); superTypes.put(model.getName(), model); } + + // serialize supertypes + if (!superTypes.isEmpty()){ + serialize(Serializers.SUPERTYPE, superTypes); + } } // ENTITIES @@ -87,7 +92,7 @@ public class Processor { } // serialize entity types if (!entityTypes.isEmpty()) { - serialize(Serializers.DOMAIN, entityTypes); + serialize(Serializers.ENTITY, entityTypes); } // EMBEDDABLES (optional) diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/impl/ColQueryImpl.java b/querydsl-collections/src/main/java/com/mysema/query/collections/impl/ColQueryImpl.java index 8de7ad40e..38f44875c 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/impl/ColQueryImpl.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/impl/ColQueryImpl.java @@ -8,7 +8,6 @@ package com.mysema.query.collections.impl; import com.mysema.query.DefaultQueryMetadata; import com.mysema.query.QueryMetadata; import com.mysema.query.collections.ColQuery; -import com.mysema.query.collections.ColQueryTemplates; /** @@ -18,16 +17,6 @@ import com.mysema.query.collections.ColQueryTemplates; * */ public class ColQueryImpl extends AbstractColQuery implements ColQuery{ - - @Deprecated - public ColQueryImpl(ColQueryTemplates templates) { - super(new DefaultQueryMetadata(), new EvaluatorFactory(templates)); - } - - @Deprecated - public ColQueryImpl(QueryMetadata metadata, ColQueryTemplates templates) { - super(metadata, new EvaluatorFactory(templates)); - } public ColQueryImpl(EvaluatorFactory evaluatorFactory) { super(new DefaultQueryMetadata(), evaluatorFactory); diff --git a/querydsl-collections/src/test/java/com/mysema/query/collections/domain/Animal.java b/querydsl-collections/src/test/java/com/mysema/query/collections/domain/Animal.java index 8f84fe328..764d0df3b 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/collections/domain/Animal.java +++ b/querydsl-collections/src/test/java/com/mysema/query/collections/domain/Animal.java @@ -9,6 +9,7 @@ import com.mysema.query.annotations.Entity; @Entity public class Animal { + protected boolean alive; protected java.util.Date birthdate = new java.util.Date(); protected int bodyWeight, weight, toes; diff --git a/querydsl-collections/src/test/java/com/mysema/query/collections/domain/TypeCastTest.java b/querydsl-collections/src/test/java/com/mysema/query/collections/domain/TypeCastTest.java new file mode 100644 index 000000000..0c10d4fa7 --- /dev/null +++ b/querydsl-collections/src/test/java/com/mysema/query/collections/domain/TypeCastTest.java @@ -0,0 +1,25 @@ +package com.mysema.query.collections.domain; + +import static org.junit.Assert.*; + +import java.util.Collections; + +import org.junit.Test; + +import com.mysema.query.collections.ColQuery; +import com.mysema.query.collections.MiniApi; +import com.mysema.query.collections.impl.ColQueryImpl; + +public class TypeCastTest { + + @Test + public void cast(){ + QAnimal animal = QAnimal.animal; + QCat cat = new QCat(animal.getMetadata()); + System.out.println(cat); + + ColQuery query = MiniApi.from(animal, Collections.emptyList()).from(cat, Collections.emptyList()); + assertEquals(1, ((ColQueryImpl)query).getMetadata().getJoins().size()); + } + +} diff --git a/querydsl-core/src/main/java/com/mysema/query/codegen/EntitySerializer.java b/querydsl-core/src/main/java/com/mysema/query/codegen/EntitySerializer.java index f418150a5..65d0fb19a 100644 --- a/querydsl-core/src/main/java/com/mysema/query/codegen/EntitySerializer.java +++ b/querydsl-core/src/main/java/com/mysema/query/codegen/EntitySerializer.java @@ -149,6 +149,9 @@ public class EntitySerializer extends AbstractSerializer{ builder.append(" }\n\n"); } + builder.append(" public " + queryType + "(PEntity entity) {\n"); + builder.append(" this(entity.getMetadata());\n"); + builder.append(" }\n\n"); builder.append(" public " + queryType + "(PathMetadata metadata) {\n"); builder.append(" super("+ localName + ".class, \"" + simpleName + "\", metadata);\n"); builder.append(" }\n\n"); @@ -233,7 +236,6 @@ public class EntitySerializer extends AbstractSerializer{ final String simpleName = model.getSimpleName(); final String queryType = model.getPrefix() + simpleName; final String localName = model.getLocalName(); - final String unscapSimpleName = model.getUncapSimpleName(); StringBuilder builder = new StringBuilder(); // package @@ -253,14 +255,21 @@ public class EntitySerializer extends AbstractSerializer{ builder.append("@SuppressWarnings(\"all\")\n"); builder.append("public class " + queryType + " extends PEntity<" + localName + "> {\n\n"); - if (!embeddable){ - // default variable - builder.append(" public static final " + queryType + " " + unscapSimpleName + " = new " + queryType + "(\"" + unscapSimpleName + "\");\n\n"); - } + defaultInstance(model, builder); writer.append(builder.toString()); } + protected void defaultInstance(ClassModel model, StringBuilder builder) { + final String simpleName = model.getSimpleName(); + final String unscapSimpleName = model.getUncapSimpleName(); + final String queryType = model.getPrefix() + simpleName; + if (!embeddable){ + // default variable + builder.append(" public static final " + queryType + " " + unscapSimpleName + " = new " + queryType + "(\"" + unscapSimpleName + "\");\n\n"); + } + } + protected void numericField(FieldModel field, Writer writer) throws IOException { serialize(field, "PNumber<" + field.getTypeName() + ">", writer, "_number", field.getTypeName() +".class"); } diff --git a/querydsl-core/src/main/java/com/mysema/query/codegen/Serializers.java b/querydsl-core/src/main/java/com/mysema/query/codegen/Serializers.java index 9850d3cd6..22099f53c 100644 --- a/querydsl-core/src/main/java/com/mysema/query/codegen/Serializers.java +++ b/querydsl-core/src/main/java/com/mysema/query/codegen/Serializers.java @@ -16,7 +16,9 @@ public final class Serializers { private Serializers(){} - public static final Serializer DOMAIN = new EntitySerializer(false); + public static final Serializer ENTITY = new EntitySerializer(false); + + public static final Serializer SUPERTYPE = new SupertypeSerializer(false); public static final Serializer EMBEDDABLE = new EntitySerializer(true); diff --git a/querydsl-core/src/main/java/com/mysema/query/codegen/SupertypeSerializer.java b/querydsl-core/src/main/java/com/mysema/query/codegen/SupertypeSerializer.java new file mode 100644 index 000000000..24806c806 --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/codegen/SupertypeSerializer.java @@ -0,0 +1,37 @@ +package com.mysema.query.codegen; + +import java.io.IOException; +import java.io.Writer; + +/** + * @author tiwe + * + */ +public class SupertypeSerializer extends EntitySerializer{ + + public SupertypeSerializer(boolean embeddable) { + super(embeddable); + } + + @Override + protected void defaultInstance(ClassModel model, StringBuilder builder) { + // no default instance + } + + @Override + protected void constructors(ClassModel model, Writer writer) throws IOException { + final String simpleName = model.getSimpleName(); + final String queryType = model.getPrefix() + simpleName; + final String localName = model.getLocalName(); + + StringBuilder builder = new StringBuilder(); + builder.append(" public " + queryType + "(PEntity entity) {\n"); + builder.append(" this(entity.getMetadata());\n"); + builder.append(" }\n\n"); + builder.append(" public " + queryType + "(PathMetadata metadata) {\n"); + builder.append(" super("+ localName + ".class, \"" + simpleName + "\", metadata);\n"); + builder.append(" }\n\n"); + writer.append(builder.toString()); + } + +} diff --git a/querydsl-core/src/test/java/com/mysema/query/codegen/SerializerTest.java b/querydsl-core/src/test/java/com/mysema/query/codegen/SerializerTest.java index bdf4f2be1..ecc1fdd36 100644 --- a/querydsl-core/src/test/java/com/mysema/query/codegen/SerializerTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/codegen/SerializerTest.java @@ -50,7 +50,7 @@ public class SerializerTest { */ @Test public void testDomainTypesAsOuterClasses() throws Exception { - Serializers.DOMAIN.serialize(type, writer); + Serializers.ENTITY.serialize(type, writer); // System.out.println(writer); } diff --git a/querydsl-hql/src/main/java/com/mysema/query/hql/hibernate/HibernateQuery.java b/querydsl-hql/src/main/java/com/mysema/query/hql/hibernate/HibernateQuery.java index bd0d4743c..a05284452 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/hql/hibernate/HibernateQuery.java +++ b/querydsl-hql/src/main/java/com/mysema/query/hql/hibernate/HibernateQuery.java @@ -19,8 +19,14 @@ import com.mysema.query.hql.HQLTemplates; */ public class HibernateQuery extends AbstractHibernateQuery implements HQLQuery{ - public HibernateQuery(Session session, HQLTemplates patterns) { - super(new DefaultQueryMetadata(), session, patterns); + private static final HQLTemplates DEFAULT_TEMPLATES = new HQLTemplates(); + + public HibernateQuery(Session session, HQLTemplates templates) { + super(new DefaultQueryMetadata(), session, templates); + } + + public HibernateQuery(Session session) { + super(new DefaultQueryMetadata(), session, DEFAULT_TEMPLATES); } } diff --git a/querydsl-hql/src/main/java/com/mysema/query/hql/jpa/JPAQuery.java b/querydsl-hql/src/main/java/com/mysema/query/hql/jpa/JPAQuery.java index 8cd5c049e..965e6ec8c 100644 --- a/querydsl-hql/src/main/java/com/mysema/query/hql/jpa/JPAQuery.java +++ b/querydsl-hql/src/main/java/com/mysema/query/hql/jpa/JPAQuery.java @@ -19,8 +19,13 @@ import com.mysema.query.hql.HQLTemplates; */ public class JPAQuery extends AbstractJPAQuery implements HQLQuery{ + private static final HQLTemplates DEFAULT_TEMPLATES = new HQLTemplates(); + public JPAQuery(EntityManager em, HQLTemplates patterns) { super(new DefaultQueryMetadata(), em, patterns); } + public JPAQuery(EntityManager em) { + super(new DefaultQueryMetadata(), em, DEFAULT_TEMPLATES); + } } diff --git a/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/AbstractJDOQLQuery.java b/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/AbstractJDOQLQuery.java index fddacf5c6..76cd0ebb0 100644 --- a/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/AbstractJDOQLQuery.java +++ b/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/AbstractJDOQLQuery.java @@ -41,12 +41,6 @@ public abstract class AbstractJDOQLQuery implements JDOQLQuery{ - public JDOQLQueryImpl(JDOQLTemplates templates) { - super(new DefaultQueryMetadata(), templates); - } - + private static final JDOQLTemplates DEFAULT_TEMPLATES = new JDOQLTemplates(); + public JDOQLQueryImpl(PersistenceManager pm, JDOQLTemplates templates) { super(new DefaultQueryMetadata(), pm, templates); } + public JDOQLQueryImpl(PersistenceManager pm) { + super(new DefaultQueryMetadata(), pm, DEFAULT_TEMPLATES); + } } diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/MetaDataExporter.java b/querydsl-sql/src/main/java/com/mysema/query/sql/MetaDataExporter.java index 5f900a95b..991424c26 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/MetaDataExporter.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/MetaDataExporter.java @@ -39,7 +39,7 @@ public class MetaDataExporter { private final String schemaPattern, tableNamePattern; - private static final Serializer serializer = Serializers.DOMAIN; + private static final Serializer serializer = Serializers.ENTITY; public MetaDataExporter(String namePrefix, String packageName, String schemaPattern, String tableNamePattern, String targetFolder){ this.namePrefix = namePrefix;