Skip to content

Commit f32e7ee

Browse files
Sort constructors in DefaultProjectionSerializer by number of parameters (#572)
* Sort constructors in generated classes based on constructor toString method (#272) sort constructors based on constructor toString method Co-authored-by: Lumír Návrat <[email protected]> (cherry picked from commit 487005f) * Sort constructors in generated clases based on number of constructor parameters Signed-off-by: rimuln <[email protected]> * Sort constructors in generated clases based on number of constructor parameters - fix formatting Signed-off-by: rimuln <[email protected]> --------- Signed-off-by: rimuln <[email protected]> Co-authored-by: Lumír Návrat <[email protected]>
1 parent c53d407 commit f32e7ee

File tree

4 files changed

+47
-20
lines changed

4 files changed

+47
-20
lines changed

querydsl-tooling/querydsl-codegen-utils/src/main/java/com/querydsl/codegen/utils/model/Constructor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/**
1919
* @author tiwe
2020
*/
21-
public final class Constructor {
21+
public final class Constructor implements Comparable<Constructor> {
2222

2323
private final Collection<Parameter> parameters;
2424

@@ -45,4 +45,9 @@ public Collection<Parameter> getParameters() {
4545
public int hashCode() {
4646
return parameters.hashCode();
4747
}
48+
49+
@Override
50+
public int compareTo(Constructor o) {
51+
return parameters.size() - o.parameters.size();
52+
}
4853
}

querydsl-tooling/querydsl-codegen-utils/src/test/java/com/querydsl/codegen/utils/model/ConstructorTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,15 @@ public void test() {
2222
assertThat(c2).isEqualTo(c1);
2323
assertThat(c2.hashCode()).isEqualTo(c1.hashCode());
2424
}
25+
26+
@Test
27+
public void order() {
28+
var firstName = new Parameter("firstName", new ClassType(TypeCategory.STRING, String.class));
29+
var lastName = new Parameter("lastName", new ClassType(TypeCategory.STRING, String.class));
30+
var c1 = new Constructor(Arrays.asList(firstName, lastName));
31+
var c2 = new Constructor(Arrays.asList(firstName));
32+
assertThat(c1.compareTo(c2)).isEqualTo(1);
33+
assertThat(c1.compareTo(c1)).isEqualTo(0);
34+
assertThat(c2.compareTo(c1)).isEqualTo(-1);
35+
}
2536
}

querydsl-tooling/querydsl-codegen/src/main/java/com/querydsl/codegen/DefaultProjectionSerializer.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@
3030
import jakarta.inject.Named;
3131
import java.io.IOException;
3232
import java.lang.annotation.Annotation;
33+
import java.util.ArrayList;
34+
import java.util.Collections;
3335
import java.util.HashSet;
3436
import java.util.Set;
35-
import java.util.function.Function;
3637

3738
/**
3839
* {@code ProjectionSerializer} is a {@link Serializer} implementation for projection types
@@ -85,10 +86,12 @@ protected void intro(EntityType model, CodeWriter writer) throws IOException {
8586
imports(model, writer);
8687

8788
Set<Integer> sizes = new HashSet<>();
88-
for (Constructor c : model.getConstructors()) {
89+
var constructors = new ArrayList<>(model.getConstructors());
90+
Collections.sort(constructors);
91+
for (Constructor c : constructors) {
8992
sizes.add(c.getParameters().size());
9093
}
91-
if (sizes.size() != model.getConstructors().size()) {
94+
if (sizes.size() != constructors.size()) {
9295
writer.imports(Expression.class);
9396
}
9497

@@ -124,24 +127,23 @@ public void serialize(
124127
var localName = writer.getRawName(model);
125128
Set<Integer> sizes = new HashSet<>();
126129

127-
for (Constructor c : model.getConstructors()) {
130+
var constructors = new ArrayList<>(model.getConstructors());
131+
Collections.sort(constructors);
132+
for (Constructor c : constructors) {
128133
final var asExpr = sizes.add(c.getParameters().size());
129134
// begin
130135
writer.beginConstructor(
131136
c.getParameters(),
132-
new Function<Parameter, Parameter>() {
133-
@Override
134-
public Parameter apply(Parameter p) {
135-
Type type;
136-
if (!asExpr) {
137-
type = typeMappings.getExprType(p.getType(), model, false, false, true);
138-
} else if (p.getType().isFinal()) {
139-
type = new ClassType(Expression.class, p.getType());
140-
} else {
141-
type = new ClassType(Expression.class, new TypeExtends(p.getType()));
142-
}
143-
return new Parameter(p.getName(), type);
137+
(Parameter p) -> {
138+
Type type;
139+
if (!asExpr) {
140+
type = typeMappings.getExprType(p.getType(), model, false, false, true);
141+
} else if (p.getType().isFinal()) {
142+
type = new ClassType(Expression.class, p.getType());
143+
} else {
144+
type = new ClassType(Expression.class, new TypeExtends(p.getType()));
144145
}
146+
return new Parameter(p.getName(), type);
145147
});
146148

147149
// body

querydsl-tooling/querydsl-codegen/src/test/java/com/querydsl/codegen/ProjectionSerializerTest.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,22 @@ public void constructors() throws IOException {
4848
var lastName = new Parameter("lastName", Types.STRING);
4949
var age = new Parameter("age", Types.INTEGER);
5050
type.addConstructor(new Constructor(Arrays.asList(firstName, lastName, age)));
51+
type.addConstructor(new Constructor(Arrays.asList(firstName, lastName)));
5152

5253
Writer writer = new StringWriter();
5354
ProjectionSerializer serializer = new DefaultProjectionSerializer(new JavaTypeMappings());
5455
serializer.serialize(type, SimpleSerializerConfig.DEFAULT, new JavaWriter(writer));
55-
assertThat(writer.toString()).contains("Expression<String> firstName");
56-
assertThat(writer.toString()).contains("Expression<String> lastName");
57-
assertThat(writer.toString()).contains("Expression<Integer> age");
56+
assertThat(writer.toString())
57+
.contains(
58+
"""
59+
public Path(Expression<String> firstName, Expression<String> lastName) {
60+
super(com.querydsl.DomainClass.class, new Class<?>[]{String.class, String.class}, firstName, lastName);
61+
}
62+
63+
public Path(Expression<String> firstName, Expression<String> lastName, Expression<Integer> age) {
64+
super(com.querydsl.DomainClass.class, new Class<?>[]{String.class, String.class, int.class}, firstName, lastName, age);
65+
}
66+
""");
5867
}
5968

6069
@Test

0 commit comments

Comments
 (0)