Database.java 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package benchmark;
  2. import benchmark.entity.Fortune;
  3. import benchmark.entity.World;
  4. import benchmark.repository.DbRepository;
  5. import com.github.mustachejava.DefaultMustacheFactory;
  6. import com.github.mustachejava.Mustache;
  7. import io.micronaut.http.annotation.Controller;
  8. import io.micronaut.http.annotation.Get;
  9. import io.micronaut.http.annotation.QueryValue;
  10. import io.micronaut.views.ModelAndView;
  11. import io.micronaut.views.View;
  12. import io.reactivex.Flowable;
  13. import io.reactivex.Single;
  14. import java.util.Arrays;
  15. import java.util.Collections;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.concurrent.ThreadLocalRandom;
  19. import static java.util.Comparator.comparing;
  20. @Controller("/")
  21. public class Database {
  22. private final DbRepository dbRepository;
  23. public Database(DbRepository dbRepository) {
  24. this.dbRepository = dbRepository;
  25. }
  26. @Get("/db")
  27. public Single<World> db() {
  28. return dbRepository.getWorld(randomWorldNumber());
  29. }
  30. @Get("/queries")
  31. public Single<List<World>> queries(@QueryValue String queries) {
  32. Flowable<World>[] worlds = new Flowable[parseQueryCount(queries)];
  33. Arrays.setAll(worlds, i -> db().toFlowable());
  34. return Flowable.merge(Arrays.asList(worlds)).toList();
  35. }
  36. @Get(value = "/fortunes", produces = "text/html;charset=utf-8")
  37. public Single<ModelAndView<Map>> fortune() {
  38. return dbRepository.fortunes().toList().flatMap(fortunes -> {
  39. fortunes.add(new Fortune(0, "Additional fortune added at request time."));
  40. fortunes.sort(comparing(fortune -> fortune.message));
  41. return Single.just(new ModelAndView<>("fortunes", Collections.singletonMap("fortunes", fortunes)));
  42. });
  43. }
  44. @Get("/updates")
  45. public Single<List<World>> updates(@QueryValue String queries) {
  46. Flowable<World>[] worlds = new Flowable[parseQueryCount(queries)];
  47. Arrays.setAll(worlds, i ->
  48. dbRepository.findAndUpdateWorld(randomWorldNumber(), randomWorldNumber()).toFlowable()
  49. );
  50. return Flowable.merge(Arrays.asList(worlds)).toList();
  51. }
  52. private int randomWorldNumber() {
  53. return 1 + ThreadLocalRandom.current().nextInt(10000);
  54. }
  55. private int parseQueryCount(String textValue) {
  56. if (textValue == null) {
  57. return 1;
  58. }
  59. int parsedValue;
  60. try {
  61. parsedValue = Integer.parseInt(textValue);
  62. } catch (NumberFormatException e) {
  63. return 1;
  64. }
  65. return Math.min(500, Math.max(1, parsedValue));
  66. }
  67. }