Database.java 2.5 KB

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