Skip to content

Commit 2455064

Browse files
committed
HV-2127 Add a missing SimpleSingleElementValidation/CascadedWithLotsOfItemsAndCyclesValidation for javax benchmarks
Signed-off-by: marko-bekhta <[email protected]>
1 parent 51b40d2 commit 2455064

13 files changed

+1208
-6
lines changed

performance/pom.xml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,7 @@
270270
<validation-api.version>2.0.2.Final</validation-api.version>
271271
<beanvalidation-impl.name>Hibernate Validator</beanvalidation-impl.name>
272272
<beanvalidation-impl.version>6.2.5.Final</beanvalidation-impl.version>
273-
<sources.to.add.main>${project.basedir}/src/main/javax</sources.to.add.main>
274-
<sources.to.add.additional>${project.basedir}/src/main/javax-bv2</sources.to.add.additional>
273+
<sources.to.add.main>${project.basedir}/src/main/javax-bv2</sources.to.add.main>
275274
<sources.to.add.additional.predefined>${project.basedir}/src/main/javax-predefined-scope</sources.to.add.additional.predefined>
276275
</properties>
277276
<dependencies>
@@ -308,8 +307,7 @@
308307
<validation-api.version>2.0.1.Final</validation-api.version>
309308
<beanvalidation-impl.name>Hibernate Validator</beanvalidation-impl.name>
310309
<beanvalidation-impl.version>6.1.7.Final</beanvalidation-impl.version>
311-
<sources.to.add.main>${project.basedir}/src/main/javax</sources.to.add.main>
312-
<sources.to.add.additional>${project.basedir}/src/main/javax-bv2</sources.to.add.additional>
310+
<sources.to.add.main>${project.basedir}/src/main/javax-bv2</sources.to.add.main>
313311
</properties>
314312
<dependencies>
315313
<dependency>
@@ -345,8 +343,7 @@
345343
<validation-api.version>2.0.1.Final</validation-api.version>
346344
<beanvalidation-impl.name>Hibernate Validator</beanvalidation-impl.name>
347345
<beanvalidation-impl.version>6.0.23.Final</beanvalidation-impl.version>
348-
<sources.to.add.main>${project.basedir}/src/main/javax</sources.to.add.main>
349-
<sources.to.add.additional>${project.basedir}/src/main/javax-bv2</sources.to.add.additional>
346+
<sources.to.add.main>${project.basedir}/src/main/javax-bv2</sources.to.add.main>
350347
</properties>
351348
<dependencies>
352349
<dependency>

performance/src/main/jakarta/org/hibernate/validator/performance/simple/SimpleSingleElementValidation.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,39 @@ public User(String name, String email, int age) {
5656
}
5757
}
5858

59+
private static class UserNoInterpolation {
60+
@NotNull(message = "must be not null")
61+
@Size(min = 3, max = 50, message = "size must be between 3 and 50")
62+
private String name;
63+
64+
@Size(min = 3, max = 50, message = "size must be between 3 and 50")
65+
@NotNull(message = "must be not null")
66+
private String email;
67+
68+
@Min(value = 20, message = "must be at least 20")
69+
private int age;
70+
71+
public UserNoInterpolation(String name, String email, int age) {
72+
this.name = name;
73+
this.email = email;
74+
this.age = age;
75+
}
76+
}
77+
5978
@State(Scope.Benchmark)
6079
public static class BenchmarkState {
6180
Validator validator;
6281
User validUser;
6382
User invalidUser;
83+
UserNoInterpolation invalidUserNoInterpolation;
6484

6585
@Setup
6686
public void setup() {
6787
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
6888
this.validator = factory.getValidator();
6989
this.validUser = new User( "John Doe", "[email protected]", 25 );
7090
this.invalidUser = new User( "Jo", "invalid-email", 19 );
91+
this.invalidUserNoInterpolation = new UserNoInterpolation( "Jo", "invalid-email", 19 );
7192
}
7293
}
7394

@@ -82,4 +103,10 @@ public void invalidObjectValidation(BenchmarkState state, Blackhole blackhole) {
82103
Set<ConstraintViolation<User>> violations = state.validator.validate( state.invalidUser );
83104
blackhole.consume( violations );
84105
}
106+
107+
@Benchmark
108+
public void invalidObjectNoInterpolationValidation(BenchmarkState state, Blackhole blackhole) {
109+
Set<ConstraintViolation<UserNoInterpolation>> violations = state.validator.validate( state.invalidUserNoInterpolation );
110+
blackhole.consume( violations );
111+
}
85112
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.validator.performance.cascaded;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
import java.util.HashSet;
10+
import java.util.Set;
11+
import java.util.concurrent.TimeUnit;
12+
13+
import javax.validation.ConstraintViolation;
14+
import javax.validation.Valid;
15+
import javax.validation.Validation;
16+
import javax.validation.Validator;
17+
import javax.validation.ValidatorFactory;
18+
import javax.validation.constraints.NotNull;
19+
20+
import org.openjdk.jmh.annotations.Benchmark;
21+
import org.openjdk.jmh.annotations.BenchmarkMode;
22+
import org.openjdk.jmh.annotations.Fork;
23+
import org.openjdk.jmh.annotations.Measurement;
24+
import org.openjdk.jmh.annotations.Mode;
25+
import org.openjdk.jmh.annotations.OutputTimeUnit;
26+
import org.openjdk.jmh.annotations.Scope;
27+
import org.openjdk.jmh.annotations.State;
28+
import org.openjdk.jmh.annotations.Threads;
29+
import org.openjdk.jmh.annotations.Warmup;
30+
import org.openjdk.jmh.infra.Blackhole;
31+
32+
/**
33+
* @author Hardy Ferentschik
34+
*/
35+
public class CascadedValidation {
36+
37+
@State(Scope.Benchmark)
38+
public static class CascadedValidationState {
39+
public volatile Validator validator;
40+
public volatile Person person;
41+
42+
public CascadedValidationState() {
43+
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
44+
validator = factory.getValidator();
45+
46+
// TODO graphs needs to be generated and deeper
47+
Person kermit = new Person( "kermit" );
48+
Person piggy = new Person( "miss piggy" );
49+
Person gonzo = new Person( "gonzo" );
50+
51+
kermit.addFriend( piggy ).addFriend( gonzo );
52+
piggy.addFriend( kermit ).addFriend( gonzo );
53+
gonzo.addFriend( kermit ).addFriend( piggy );
54+
55+
person = kermit;
56+
}
57+
}
58+
59+
@Benchmark
60+
@BenchmarkMode(Mode.Throughput)
61+
@OutputTimeUnit(TimeUnit.MILLISECONDS)
62+
@Fork(value = 1)
63+
@Threads(50)
64+
@Warmup(iterations = 10)
65+
@Measurement(iterations = 20)
66+
public void testCascadedValidation(CascadedValidationState state, Blackhole bh) {
67+
Set<ConstraintViolation<Person>> violations = state.validator.validate( state.person );
68+
assertThat( violations ).hasSize( 0 );
69+
70+
bh.consume( violations );
71+
}
72+
73+
public static class Person {
74+
@NotNull
75+
String name;
76+
77+
Set<@Valid Person> friends = new HashSet<>();
78+
79+
public Person(String name) {
80+
this.name = name;
81+
}
82+
83+
public Person addFriend(Person friend) {
84+
friends.add( friend );
85+
return this;
86+
}
87+
}
88+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.validator.performance.cascaded;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
import java.util.ArrayList;
10+
import java.util.HashSet;
11+
import java.util.List;
12+
import java.util.Set;
13+
import java.util.concurrent.TimeUnit;
14+
15+
import javax.validation.ConstraintViolation;
16+
import javax.validation.Valid;
17+
import javax.validation.Validation;
18+
import javax.validation.Validator;
19+
import javax.validation.ValidatorFactory;
20+
import javax.validation.constraints.NotNull;
21+
import org.openjdk.jmh.annotations.Benchmark;
22+
import org.openjdk.jmh.annotations.BenchmarkMode;
23+
import org.openjdk.jmh.annotations.Fork;
24+
import org.openjdk.jmh.annotations.Measurement;
25+
import org.openjdk.jmh.annotations.Mode;
26+
import org.openjdk.jmh.annotations.OutputTimeUnit;
27+
import org.openjdk.jmh.annotations.Scope;
28+
import org.openjdk.jmh.annotations.State;
29+
import org.openjdk.jmh.annotations.Threads;
30+
import org.openjdk.jmh.annotations.Warmup;
31+
import org.openjdk.jmh.infra.Blackhole;
32+
33+
public class CascadedWithLotsOfItemsAndCyclesValidation {
34+
35+
private static final int NUMBER_OF_ARTICLES_PER_SHOP = 2000;
36+
37+
@State(Scope.Benchmark)
38+
public static class CascadedWithLotsOfItemsValidationState {
39+
public volatile Validator validator;
40+
41+
public volatile Shop shop;
42+
43+
public CascadedWithLotsOfItemsValidationState() {
44+
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
45+
validator = factory.getValidator();
46+
47+
shop = createShop();
48+
}
49+
50+
private Shop createShop() {
51+
Shop shop = new Shop( 1 );
52+
53+
for ( int i = 0; i < NUMBER_OF_ARTICLES_PER_SHOP; i++ ) {
54+
shop.addArticle( new Article( i ) );
55+
}
56+
57+
return shop;
58+
}
59+
}
60+
61+
@Benchmark
62+
@BenchmarkMode(Mode.Throughput)
63+
@OutputTimeUnit(TimeUnit.SECONDS)
64+
@Fork(value = 1)
65+
@Threads(20)
66+
@Warmup(iterations = 10)
67+
@Measurement(iterations = 20)
68+
public void testCascadedValidationWithLotsOfItems(CascadedWithLotsOfItemsValidationState state, Blackhole bh) {
69+
Set<ConstraintViolation<Shop>> violations = state.validator.validate( state.shop );
70+
assertThat( violations ).hasSize( 0 );
71+
72+
bh.consume( violations );
73+
}
74+
75+
public static class Shop {
76+
@NotNull
77+
private Integer id;
78+
79+
@NotNull
80+
private List<@Valid @NotNull Article> articles = new ArrayList<>();
81+
82+
public Shop(Integer id) {
83+
this.id = id;
84+
}
85+
86+
public void addArticle(Article article) {
87+
articles.add( article );
88+
article.shops.add( this );
89+
}
90+
}
91+
92+
public static class Article {
93+
@NotNull
94+
private Integer id;
95+
96+
private Set<@Valid Shop> shops = new HashSet<>();
97+
98+
public Article(Integer id) {
99+
this.id = id;
100+
}
101+
}
102+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.validator.performance.cascaded;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
import java.util.Set;
12+
import java.util.concurrent.TimeUnit;
13+
14+
import javax.validation.ConstraintViolation;
15+
import javax.validation.Valid;
16+
import javax.validation.Validation;
17+
import javax.validation.Validator;
18+
import javax.validation.ValidatorFactory;
19+
import javax.validation.constraints.NotNull;
20+
import javax.validation.constraints.Size;
21+
22+
import org.openjdk.jmh.annotations.Benchmark;
23+
import org.openjdk.jmh.annotations.BenchmarkMode;
24+
import org.openjdk.jmh.annotations.Fork;
25+
import org.openjdk.jmh.annotations.Measurement;
26+
import org.openjdk.jmh.annotations.Mode;
27+
import org.openjdk.jmh.annotations.OutputTimeUnit;
28+
import org.openjdk.jmh.annotations.Scope;
29+
import org.openjdk.jmh.annotations.State;
30+
import org.openjdk.jmh.annotations.Threads;
31+
import org.openjdk.jmh.annotations.Warmup;
32+
import org.openjdk.jmh.infra.Blackhole;
33+
34+
/**
35+
* @author Guillaume Smet
36+
*/
37+
public class CascadedWithLotsOfItemsAndMoreConstraintsValidation {
38+
39+
private static final int NUMBER_OF_ARTICLES_PER_SHOP = 2000;
40+
41+
@State(Scope.Benchmark)
42+
public static class CascadedWithLotsOfItemsValidationState {
43+
public volatile Validator validator;
44+
45+
public volatile Shop shop;
46+
47+
public CascadedWithLotsOfItemsValidationState() {
48+
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
49+
validator = factory.getValidator();
50+
51+
shop = createShop();
52+
}
53+
54+
private Shop createShop() {
55+
Shop shop = new Shop( 1, "Shop" );
56+
57+
for ( int i = 0; i < NUMBER_OF_ARTICLES_PER_SHOP; i++ ) {
58+
shop.addArticle( new Article( i, "Article " + i ) );
59+
}
60+
61+
return shop;
62+
}
63+
}
64+
65+
@Benchmark
66+
@BenchmarkMode(Mode.Throughput)
67+
@OutputTimeUnit(TimeUnit.SECONDS)
68+
@Fork(value = 1)
69+
@Threads(20)
70+
@Warmup(iterations = 10)
71+
@Measurement(iterations = 20)
72+
public void testCascadedValidationWithLotsOfItems(CascadedWithLotsOfItemsValidationState state, Blackhole bh) {
73+
Set<ConstraintViolation<Shop>> violations = state.validator.validate( state.shop );
74+
assertThat( violations ).hasSize( 0 );
75+
76+
bh.consume( violations );
77+
}
78+
79+
public static class Shop {
80+
@NotNull
81+
private Integer id;
82+
83+
@Size(min = 1)
84+
private String name;
85+
86+
@NotNull
87+
private List<@Valid @NotNull Article> articles = new ArrayList<>();
88+
89+
public Shop(Integer id, String name) {
90+
this.id = id;
91+
this.name = name;
92+
}
93+
94+
public void addArticle(Article article) {
95+
articles.add( article );
96+
}
97+
}
98+
99+
public static class Article {
100+
@NotNull
101+
private Integer id;
102+
103+
@Size(min = 1)
104+
private String name;
105+
106+
public Article(Integer id, String name) {
107+
this.id = id;
108+
this.name = name;
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)