Search in sources :

Example 31 with ClassType

use of com.querydsl.codegen.utils.model.ClassType in project querydsl by querydsl.

the class DefaultEvaluatorFactory method createEvaluator.

/**
 * Create an Evaluator for the given sources and the given optional filter
 *
 * @param metadata query metadata
 * @param joins joins
 * @param filter where condition
 * @return evaluator
 */
public Evaluator<List<Object[]>> createEvaluator(QueryMetadata metadata, List<JoinExpression> joins, @Nullable Predicate filter) {
    List<String> sourceNames = new ArrayList<String>();
    List<Type> sourceTypes = new ArrayList<Type>();
    List<Class<?>> sourceClasses = new ArrayList<Class<?>>();
    StringBuilder vars = new StringBuilder();
    CollQuerySerializer ser = new CollQuerySerializer(templates);
    ser.append("java.util.List<Object[]> rv = new java.util.ArrayList<Object[]>();\n");
    List<String> anyJoinMatchers = new ArrayList<String>();
    // creating context
    for (JoinExpression join : joins) {
        Expression<?> target = join.getTarget();
        String typeName = com.querydsl.codegen.utils.support.ClassUtils.getName(target.getType());
        if (vars.length() > 0) {
            vars.append(",");
        }
        switch(join.getType()) {
            case DEFAULT:
                ser.append("for (" + typeName + " " + target + " : " + target + "_) {\n");
                vars.append(target);
                sourceNames.add(target + "_");
                sourceTypes.add(new SimpleType(Types.ITERABLE, new ClassType(TypeCategory.SIMPLE, target.getType())));
                sourceClasses.add(Iterable.class);
                break;
            case INNERJOIN:
            case LEFTJOIN:
                Operation<?> alias = (Operation<?>) join.getTarget();
                boolean colAnyJoin = join.getCondition() != null && join.getCondition().toString().equals("any");
                boolean leftJoin = join.getType() == JoinType.LEFTJOIN;
                String matcher = null;
                if (colAnyJoin) {
                    matcher = alias.getArg(1).toString() + "_matched";
                    ser.append("boolean " + matcher + " = false;\n");
                    anyJoinMatchers.add(matcher);
                }
                ser.append("for (" + typeName + " " + alias.getArg(1) + " : ");
                if (leftJoin) {
                    ser.append(CollQueryFunctions.class.getName() + ".leftJoin(");
                }
                if (colAnyJoin) {
                    Context context = new Context();
                    Expression<?> replacement = alias.getArg(0).accept(collectionAnyVisitor, context);
                    ser.handle(replacement);
                } else {
                    ser.handle(alias.getArg(0));
                }
                if (alias.getArg(0).getType().equals(Map.class)) {
                    ser.append(".values()");
                }
                if (leftJoin) {
                    ser.append(")");
                }
                ser.append(") {\n");
                if (matcher != null) {
                    ser.append("if (!" + matcher + ") {\n");
                }
                vars.append(alias.getArg(1));
                break;
            default:
                throw new IllegalArgumentException("Illegal join expression " + join);
        }
    }
    // filter
    if (filter != null) {
        ser.append("try {\n");
        ser.append("if (");
        ser.handle(filter).append(") {\n");
        for (String matcher : anyJoinMatchers) {
            ser.append("    " + matcher + " = true;\n");
        }
        ser.append("    rv.add(new Object[]{" + vars + "});\n");
        ser.append("}\n");
        ser.append("} catch (NullPointerException npe) { }\n");
    } else {
        ser.append("rv.add(new Object[]{" + vars + "});\n");
    }
    // closing context
    int amount = joins.size() + anyJoinMatchers.size();
    for (int i = 0; i < amount; i++) {
        ser.append("}\n");
    }
    ser.append("return rv;");
    Map<Object, String> constantToLabel = ser.getConstantToLabel();
    Map<String, Object> constants = getConstants(metadata, constantToLabel);
    ClassType projectionType = new ClassType(TypeCategory.LIST, List.class, Types.OBJECTS);
    return factory.createEvaluator(ser.toString(), projectionType, sourceNames.toArray(new String[0]), sourceTypes.toArray(new Type[0]), sourceClasses.toArray(new Class<?>[0]), constants);
}
Also used : Context(com.querydsl.core.support.Context) ArrayList(java.util.ArrayList) Operation(com.querydsl.core.types.Operation) ClassType(com.querydsl.codegen.utils.model.ClassType) SimpleType(com.querydsl.codegen.utils.model.SimpleType) SimpleType(com.querydsl.codegen.utils.model.SimpleType) Type(com.querydsl.codegen.utils.model.Type) ClassType(com.querydsl.codegen.utils.model.ClassType) JoinType(com.querydsl.core.JoinType) JoinExpression(com.querydsl.core.JoinExpression)

Example 32 with ClassType

use of com.querydsl.codegen.utils.model.ClassType in project querydsl by querydsl.

the class MetaDataSerializer method serializePrimaryKeys.

protected void serializePrimaryKeys(EntityType model, CodeWriter writer, Collection<PrimaryKeyData> primaryKeys) throws IOException {
    for (PrimaryKeyData primaryKey : primaryKeys) {
        String fieldName = namingStrategy.getPropertyNameForPrimaryKey(primaryKey.getName(), model);
        StringBuilder value = new StringBuilder("createPrimaryKey(");
        boolean first = true;
        for (String column : primaryKey.getColumns()) {
            if (!first) {
                value.append(", ");
            }
            value.append(namingStrategy.getPropertyName(column, model));
            first = false;
        }
        value.append(")");
        Type type = new ClassType(PrimaryKey.class, model);
        writer.publicFinal(type, fieldName, value.toString());
    }
}
Also used : PrimaryKeyData(com.querydsl.sql.codegen.support.PrimaryKeyData) SimpleType(com.querydsl.codegen.utils.model.SimpleType) Type(com.querydsl.codegen.utils.model.Type) ClassType(com.querydsl.codegen.utils.model.ClassType) ClassType(com.querydsl.codegen.utils.model.ClassType)

Example 33 with ClassType

use of com.querydsl.codegen.utils.model.ClassType in project querydsl by querydsl.

the class BeanSerializerTest method fullConstructor.

@Test
public void fullConstructor() throws IOException {
    // property
    type.addProperty(new Property(type, "entityField", type));
    type.addProperty(new Property(type, "collection", new SimpleType(Types.COLLECTION, typeModel)));
    type.addProperty(new Property(type, "listField", new SimpleType(Types.LIST, typeModel)));
    type.addProperty(new Property(type, "setField", new SimpleType(Types.SET, typeModel)));
    type.addProperty(new Property(type, "arrayField", new ClassType(TypeCategory.ARRAY, String[].class)));
    type.addProperty(new Property(type, "mapField", new SimpleType(Types.MAP, typeModel, typeModel)));
    BeanSerializer serializer = new BeanSerializer();
    serializer.setAddFullConstructor(true);
    serializer.serialize(type, SimpleSerializerConfig.DEFAULT, new JavaWriter(writer));
// System.out.println(writer.toString());
}
Also used : SimpleType(com.querydsl.codegen.utils.model.SimpleType) JavaWriter(com.querydsl.codegen.utils.JavaWriter) Matchers.containsString(org.hamcrest.Matchers.containsString) ClassType(com.querydsl.codegen.utils.model.ClassType) Test(org.junit.Test)

Example 34 with ClassType

use of com.querydsl.codegen.utils.model.ClassType in project querydsl by querydsl.

the class BeanSerializerTest method toString_.

@Test
public void toString_() throws IOException {
    // property
    type.addProperty(new Property(type, "entityField", type));
    type.addProperty(new Property(type, "collection", new SimpleType(Types.COLLECTION, typeModel)));
    type.addProperty(new Property(type, "listField", new SimpleType(Types.LIST, typeModel)));
    type.addProperty(new Property(type, "setField", new SimpleType(Types.SET, typeModel)));
    type.addProperty(new Property(type, "arrayField", new ClassType(TypeCategory.ARRAY, String[].class)));
    type.addProperty(new Property(type, "mapField", new SimpleType(Types.MAP, typeModel, typeModel)));
    BeanSerializer serializer = new BeanSerializer();
    serializer.setAddToString(true);
    serializer.serialize(type, SimpleSerializerConfig.DEFAULT, new JavaWriter(writer));
    assertTrue(String.valueOf(writer).contains("    @Override\n" + "    public String toString()"));
}
Also used : SimpleType(com.querydsl.codegen.utils.model.SimpleType) JavaWriter(com.querydsl.codegen.utils.JavaWriter) Matchers.containsString(org.hamcrest.Matchers.containsString) ClassType(com.querydsl.codegen.utils.model.ClassType) Test(org.junit.Test)

Example 35 with ClassType

use of com.querydsl.codegen.utils.model.ClassType in project querydsl by querydsl.

the class TypeMappingsTest method isRegistered.

@Test
public void isRegistered() {
    TypeMappings typeMappings = new JavaTypeMappings();
    typeMappings.register(new ClassType(Double[].class), new ClassType(Point.class));
    assertTrue(typeMappings.isRegistered(new ClassType(Double[].class)));
}
Also used : ClassType(com.querydsl.codegen.utils.model.ClassType) Test(org.junit.Test)

Aggregations

ClassType (com.querydsl.codegen.utils.model.ClassType)35 Test (org.junit.Test)24 SimpleType (com.querydsl.codegen.utils.model.SimpleType)18 Type (com.querydsl.codegen.utils.model.Type)14 List (java.util.List)7 JavaWriter (com.querydsl.codegen.utils.JavaWriter)6 StringWriter (java.io.StringWriter)6 Parameter (com.querydsl.codegen.utils.model.Parameter)4 TypeCategory (com.querydsl.codegen.utils.model.TypeCategory)3 PrimaryKeyData (com.querydsl.sql.codegen.support.PrimaryKeyData)3 ArrayList (java.util.ArrayList)3 Matchers.containsString (org.hamcrest.Matchers.containsString)3 Property (com.querydsl.codegen.Property)2 Cat (com.querydsl.codegen.utils.support.Cat)2 JoinType (com.querydsl.core.JoinType)2 ColumnImpl (com.querydsl.sql.ColumnImpl)2 Annotation (java.lang.annotation.Annotation)2 Before (org.junit.Before)2 EntityType (com.querydsl.codegen.EntityType)1 ScalaWriter (com.querydsl.codegen.utils.ScalaWriter)1