ソースを参照

Quarkus code cleanup (#7380)

* Update the benchmark metadata for Quarkus

* Refactor and cleanup the WorldRepository

* Rocker template library can output a Vert.x Buffer directly

* Rocker template optimisations
Sanne Grinovero 3 年 前
コミット
129b52ed77
16 ファイル変更78 行追加151 行削除
  1. 8 8
      frameworks/Java/quarkus/benchmark_config.json
  2. 0 1
      frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java
  3. 1 7
      frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/resource/DbResource.java
  4. 0 1
      frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  5. 3 0
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml
  6. 1 3
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java
  7. 6 11
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  8. 0 21
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/Fortunes.rocker.html
  9. 8 0
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/views/Fortunes.rocker.html
  10. 4 3
      frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml
  11. 1 9
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java
  12. 26 23
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java
  13. 4 28
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/DbResource.java
  14. 8 15
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java
  15. 0 21
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/Fortunes.rocker.html
  16. 8 0
      frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/views/Fortunes.rocker.html

+ 8 - 8
frameworks/Java/quarkus/benchmark_config.json

@@ -18,10 +18,10 @@
         "flavor": "None",
         "orm": "Full",
         "platform": "JAX-RS",
-        "webserver": "Undertow",
+        "webserver": "Vert.x",
         "os": "Linux",
         "database_os": "Linux",
-        "display_name": "Quarkus + RESTEasy + Hibernate ORM",
+        "display_name": "quarkus [RESTEasy, Hibernate ORM]",
         "notes": "",
         "versus": "Netty"
       },
@@ -39,12 +39,12 @@
         "framework": "Quarkus",
         "language": "Java",
         "flavor": "None",
-        "orm": "Micro",
+        "orm": "Full",
         "platform": "RESTEasy Reactive",
-        "webserver": "Vertx",
+        "webserver": "Vert.x",
         "os": "Linux",
         "database_os": "Linux",
-        "display_name": "Quarkus RESTEasy Reactive + Hibernate ORM",
+        "display_name": "quarkus [RESTEasy Reactive, Hibernate ORM]",
         "notes": "",
         "versus": "Netty"
       },
@@ -62,12 +62,12 @@
         "framework": "Quarkus",
         "language": "Java",
         "flavor": "None",
-        "orm": "Micro",
+        "orm": "Full",
         "platform": "RESTEasy Reactive",
-        "webserver": "Vertx",
+        "webserver": "Vert.x",
         "os": "Linux",
         "database_os": "Linux",
-        "display_name": "Quarkus RESTEasy Reactive + Hibernate Reactive",
+        "display_name": "quarkus [RESTEasy Reactive, Hibernate Reactive]",
         "notes": "",
         "versus": "Netty"
       }

+ 0 - 1
frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java

@@ -47,7 +47,6 @@ public class WorldRepository {
         }
     }
 
-    @Transactional
     public void updateAll(Collection<World> worlds) {
         try (Session s = sf.openSession()) {
             s.setJdbcBatchSize(worlds.size());

+ 1 - 7
frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/resource/DbResource.java

@@ -30,9 +30,7 @@ public class DbResource {
     @GET
     @Path("/db")
     public World db() {
-        World world = randomWorldForRead();
-        if (world==null) throw new IllegalStateException( "No data found in DB. Did you seed the database? Make sure to invoke /createdata once." );
-        return world;
+        return worldRepository.findSingleAndStateless(randomWorldNumber());
     }
 
     @GET
@@ -72,10 +70,6 @@ public class DbResource {
         return "OK";
     }
 
-    private World randomWorldForRead() {
-        return worldRepository.findSingleAndStateless(randomWorldNumber());
-    }
-
     private Collection<World> randomWorldForRead(int count) {
         Set<Integer> ids = new HashSet<>(count);
         int counter = 0;

+ 0 - 1
frameworks/Java/quarkus/resteasy-hibernate/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,6 +1,5 @@
 package io.quarkus.benchmark.resource;
 
-import com.fizzed.rocker.BindableRockerModel;
 import com.fizzed.rocker.Rocker;
 import com.fizzed.rocker.RockerOutput;
 import io.quarkus.benchmark.model.Fortune;

+ 3 - 0
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml

@@ -63,6 +63,8 @@
                         <configuration>
                             <templateDirectory>${project.basedir}/src/main/resources</templateDirectory>
                             <optimize>true</optimize>
+                            <discardLogicWhitespace>true</discardLogicWhitespace>
+                            <markAsGenerated>false</markAsGenerated>
                         </configuration>
                     </execution>
                 </executions>
@@ -70,4 +72,5 @@
         </plugins>
 
     </build>
+
 </project>

+ 1 - 3
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java

@@ -3,9 +3,6 @@ package io.quarkus.benchmark.repository;
 import java.util.List;
 
 import javax.enterprise.context.ApplicationScoped;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
 
 import io.quarkus.benchmark.model.Fortune;
 import io.smallrye.mutiny.Uni;
@@ -18,4 +15,5 @@ public class FortuneRepository extends BaseRepository {
                 session -> session.createQuery("SELECT F FROM Fortune F", Fortune.class).getResultList()
         );
     }
+
 }

+ 6 - 11
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,20 +1,17 @@
 package io.quarkus.benchmark.resource;
 
-import com.fizzed.rocker.Rocker;
-import com.fizzed.rocker.RockerOutput;
 import io.quarkus.benchmark.model.Fortune;
 import io.quarkus.benchmark.repository.FortuneRepository;
 import io.smallrye.context.api.CurrentThreadContext;
 import io.smallrye.mutiny.Uni;
-import io.vertx.core.http.HttpHeaders;
-import io.vertx.ext.web.templ.rocker.RockerTemplateEngine;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.ext.web.templ.rocker.impl.VertxBufferOutput;
 import org.eclipse.microprofile.context.ThreadContext;
 
 import javax.inject.Inject;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
-import java.util.Collections;
 import java.util.Comparator;
 
 @Path("/fortunes")
@@ -24,20 +21,18 @@ public class FortuneResource  {
     FortuneRepository repository;
 
     private static final Comparator<Fortune> fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
-    private static final RockerTemplateEngine templeEngine  = RockerTemplateEngine.create();
-
-    private static final String FORTUNES_MAP_KEY = "fortunes";
-    private static final String FORTUNES_TEMPLATE_FILENAME = "Fortunes.rocker.html";
 
     @Produces("text/html; charset=UTF-8")
     @GET
     @CurrentThreadContext(propagated = {}, cleared = {}, unchanged = ThreadContext.ALL_REMAINING)
-    public Uni<String> fortunes() {
+    public Uni<Buffer> fortunes() {
         return repository.findAll()
                 .map(fortunes -> {
                     fortunes.add(new Fortune(0, "Additional fortune added at request time."));
                     fortunes.sort(fortuneComparator);
-                    return templeEngine.render(Collections.singletonMap(FORTUNES_MAP_KEY, fortunes), FORTUNES_TEMPLATE_FILENAME).result().toString();
+                    return views.Fortunes.template(fortunes)
+                            .render(VertxBufferOutput.FACTORY)
+                            .getBuffer();
                 });
     }
 }

+ 0 - 21
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/Fortunes.rocker.html

@@ -1,21 +0,0 @@
-@import java.util.*
-@import io.quarkus.benchmark.model.*
-@args(List fortunes)
-<!DOCTYPE html>
-<html>
-<head><title>Fortunes</title></head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    @for ((ForIterator i, Fortune fortune) : fortunes) {
-    <tr>
-        <td>@fortune.getId()</td>
-        <td>@fortune.getMessage()</td>
-    </tr>
-    }
-</table>
-</body>
-</html>

+ 8 - 0
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/src/main/resources/views/Fortunes.rocker.html

@@ -0,0 +1,8 @@
+@import java.util.*
+@import io.quarkus.benchmark.model.*
+@args(List fortunes)
+<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>
+@for ((ForIterator i, Fortune fortune) : fortunes) {
+<tr><td>@fortune.getId()</td><td>@fortune.getMessage()</td></tr>
+}
+</table></body></html>

+ 4 - 3
frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml

@@ -37,9 +37,8 @@
             <artifactId>quarkus-jdbc-postgresql</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.fizzed</groupId>
-            <artifactId>rocker-compiler</artifactId>
-            <version>1.3.0</version>
+            <groupId>io.vertx</groupId>
+            <artifactId>vertx-web-templ-rocker</artifactId>
         </dependency>
         <dependency>
             <groupId>io.netty</groupId>
@@ -64,6 +63,8 @@
                         <configuration>
                             <templateDirectory>${project.basedir}/src/main/resources</templateDirectory>
                             <optimize>true</optimize>
+                            <discardLogicWhitespace>true</discardLogicWhitespace>
+                            <markAsGenerated>false</markAsGenerated>
                         </configuration>
                     </execution>
                 </executions>

+ 1 - 9
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java

@@ -4,10 +4,6 @@ import java.util.List;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
-
 import org.hibernate.SessionFactory;
 import org.hibernate.StatelessSession;
 
@@ -21,11 +17,7 @@ public class FortuneRepository {
 
     public List<Fortune> findAllStateless() {
         try (StatelessSession s = sf.openStatelessSession()) {
-            CriteriaBuilder criteriaBuilder = sf.getCriteriaBuilder();
-            CriteriaQuery<Fortune> fortuneQuery = criteriaBuilder.createQuery(Fortune.class);
-            Root<Fortune> from = fortuneQuery.from(Fortune.class);
-            fortuneQuery.select(from);
-            return s.createQuery(fortuneQuery).getResultList();
+            return s.createQuery("SELECT F FROM Fortune F", Fortune.class).getResultList();
         }
     }
 }

+ 26 - 23
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java

@@ -13,7 +13,6 @@ import io.quarkus.benchmark.model.World;
 import io.quarkus.benchmark.utils.LocalRandom;
 import io.quarkus.benchmark.utils.Randomizer;
 
-
 @Singleton
 public class WorldRepository {
 
@@ -38,39 +37,43 @@ public class WorldRepository {
         }
     }
 
-    public World findSingleAndStateless(Integer id) {
+    public World loadSingleWorldById(Integer id) {
         try (StatelessSession ss = sf.openStatelessSession()) {
-            return singleStatelessWorldLoad(ss,id);
-        }
-    }
-
-    @Transactional
-    public void updateAll(World[] worlds) {
-        try (Session s = sf.openSession()) {
-            s.setJdbcBatchSize(worlds.length);
-            s.setHibernateFlushMode(FlushMode.MANUAL);
-            for (World w : worlds) {
-                s.update(w);
-            }
-            s.flush();
+            return (World) ss.get(World.class, id);
         }
     }
 
-    public World[] findReadonly(int count) {
-        try (StatelessSession s = sf.openStatelessSession()) {
+    public World[] loadNWorlds(final int count) {
+        final World[] list = new World[count];
+        final LocalRandom random = Randomizer.current();
+        try (StatelessSession ss = sf.openStatelessSession()) {
             //The rules require individual load: we can't use the Hibernate feature which allows load by multiple IDs as one single operation
-            World[] list = new World[count];
-            final LocalRandom random = Randomizer.current();
             for (int i=0;i<count;i++) {
-                Integer idToLoad = random.getNextRandom();
-                list[i] = singleStatelessWorldLoad(s,idToLoad);
+                list[i] = (World) ss.get(World.class, random.getNextRandom());
             }
             return list;
         }
     }
 
-    private static World singleStatelessWorldLoad(final StatelessSession ss, final Integer id) {
-        return (World) ss.get(World.class, id);
+    public World[] updateNWorlds(final int count) {
+        //We're again forced to use the "individual load" pattern by the rules:
+        final World[] list = loadNWorlds(count);
+        final LocalRandom random = Randomizer.current();
+        try (Session s = sf.openSession()) {
+            s.setJdbcBatchSize(count);
+            s.setHibernateFlushMode(FlushMode.MANUAL);
+            for (World w : list) {
+                //Read the one field, as required by the following rule:
+                // # vi. At least the randomNumber field must be read from the database result set.
+                final int previousRead = w.getRandomNumber();
+                //Update it, but make sure to exclude the current number as Hibernate optimisations would otherwise
+                //skip the write operation:
+                w.setRandomNumber(random.getNextRandomExcluding(previousRead));
+                s.update(w);
+            }
+            s.flush();
+        }
+        return list;
     }
 
 }

+ 4 - 28
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/DbResource.java

@@ -11,10 +11,7 @@ import javax.ws.rs.core.MediaType;
 
 import io.quarkus.benchmark.model.World;
 import io.quarkus.benchmark.repository.WorldRepository;
-import io.quarkus.benchmark.utils.LocalRandom;
 import io.quarkus.benchmark.utils.Randomizer;
-import io.smallrye.common.annotation.Blocking;
-
 
 @Singleton
 @Path("/")
@@ -25,24 +22,19 @@ public class DbResource {
     @Inject
     WorldRepository worldRepository;
 
-    @Blocking
     @GET
     @Path("/db")
     public World db() {
-        World world = worldRepository.findSingleAndStateless(Randomizer.current().getNextRandom());
-        if (world==null) throw new IllegalStateException( "No data found in DB. Did you seed the database? Make sure to invoke /createdata once." );
-        return world;
+        return worldRepository.loadSingleWorldById(Randomizer.current().getNextRandom());
     }
 
-    @Blocking
     @GET
     @Path("/queries")
     public World[] queries(@QueryParam("queries") String queries) {
         final int count = parseQueryCount(queries);
-        return randomWorldForRead(count);
+        return worldRepository.loadNWorlds(count);
     }
 
-    @Blocking
     @GET
     @Path("/updates")
     //Rules: https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates
@@ -52,21 +44,9 @@ public class DbResource {
     // all other tested frameworks seem to do.
     public World[] updates(@QueryParam("queries") String queries) {
         final int count = parseQueryCount(queries);
-        final World[] worlds = randomWorldForRead( count );
-        final LocalRandom random = Randomizer.current();
-        for (World w : worlds) {
-            //Read the one field, as required by the following rule:
-            // # vi. At least the randomNumber field must be read from the database result set.
-            final int previousRead = w.getRandomNumber();
-            //Update it, but make sure to exclude the current number as Hibernate optimisations would have us "fail"
-            //the verification:
-            w.setRandomNumber(random.getNextRandomExcluding(previousRead));
-        }
-        worldRepository.updateAll(worlds);
-        return worlds;
+        return worldRepository.updateNWorlds(count);
     }
 
-    @Blocking
     @GET
     @Path( "/createdata" )
     public String createData() {
@@ -74,11 +54,7 @@ public class DbResource {
         return "OK";
     }
 
-    private World[] randomWorldForRead(int count) {
-        return worldRepository.findReadonly(count);
-    }
-
-    private int parseQueryCount(String textValue) {
+    private int parseQueryCount(final String textValue) {
         if (textValue == null) {
             return 1;
         }

+ 8 - 15
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java

@@ -1,9 +1,9 @@
 package io.quarkus.benchmark.resource;
 
-import com.fizzed.rocker.Rocker;
-import com.fizzed.rocker.RockerOutput;
 import io.quarkus.benchmark.model.Fortune;
 import io.quarkus.benchmark.repository.FortuneRepository;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.ext.web.templ.rocker.impl.VertxBufferOutput;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -12,8 +12,6 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
@@ -26,22 +24,17 @@ public class FortuneResource {
     @Inject
     FortuneRepository repository;
 
-    private static final String FORTUNES_MAP_KEY = "fortunes";
-    private static final String FORTUNES_TEMPLATE_FILENAME = "Fortunes.rocker.html";
-
     private static final Comparator<Fortune> fortuneComparator = Comparator.comparing(fortune -> fortune.getMessage());
 
     @GET
     @Path("/fortunes")
-    public String fortunes() {
-        List<Fortune> fortunes = new ArrayList<>(repository.findAllStateless());
+    public Buffer fortunes() {
+        List<Fortune> fortunes = repository.findAllStateless();
         fortunes.add(new Fortune(0, "Additional fortune added at request time."));
         fortunes.sort(fortuneComparator);
-
-        RockerOutput output = Rocker.template(FORTUNES_TEMPLATE_FILENAME)
-                .bind(Collections.singletonMap(FORTUNES_MAP_KEY, fortunes))
-                .render();
-
-        return output.toString();
+        return views.Fortunes.template(fortunes)
+                .render(VertxBufferOutput.FACTORY)
+                .getBuffer();
     }
+
 }

+ 0 - 21
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/Fortunes.rocker.html

@@ -1,21 +0,0 @@
-@import java.util.*
-@import io.quarkus.benchmark.model.*
-@args(List fortunes)
-<!DOCTYPE html>
-<html>
-<head><title>Fortunes</title></head>
-<body>
-<table>
-    <tr>
-        <th>id</th>
-        <th>message</th>
-    </tr>
-    @for ((ForIterator i, Fortune fortune) : fortunes) {
-    <tr>
-        <td>@fortune.getId()</td>
-        <td>@fortune.getMessage()</td>
-    </tr>
-    }
-</table>
-</body>
-</html>

+ 8 - 0
frameworks/Java/quarkus/resteasy-reactive-hibernate/src/main/resources/views/Fortunes.rocker.html

@@ -0,0 +1,8 @@
+@import java.util.*
+@import io.quarkus.benchmark.model.*
+@args(List fortunes)
+<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>
+@for ((ForIterator i, Fortune fortune) : fortunes) {
+<tr><td>@fortune.getId()</td><td>@fortune.getMessage()</td></tr>
+}
+</table></body></html>