|
@@ -1,39 +1,29 @@
|
|
|
package io.helidon.benchmark.services;
|
|
|
|
|
|
-import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
import java.util.Optional;
|
|
|
import java.util.concurrent.ThreadLocalRandom;
|
|
|
|
|
|
import javax.json.Json;
|
|
|
-import javax.json.JsonArray;
|
|
|
import javax.json.JsonArrayBuilder;
|
|
|
import javax.json.JsonBuilderFactory;
|
|
|
-import javax.json.JsonObject;
|
|
|
-import javax.json.JsonWriterFactory;
|
|
|
|
|
|
import io.helidon.benchmark.models.DbRepository;
|
|
|
import io.helidon.benchmark.models.World;
|
|
|
import io.helidon.common.http.Parameters;
|
|
|
+import io.helidon.common.reactive.Multi;
|
|
|
import io.helidon.webserver.Routing;
|
|
|
import io.helidon.webserver.ServerRequest;
|
|
|
import io.helidon.webserver.ServerResponse;
|
|
|
import io.helidon.webserver.Service;
|
|
|
-import io.reactivex.Flowable;
|
|
|
-import io.reactivex.Single;
|
|
|
|
|
|
public class DbService implements Service {
|
|
|
|
|
|
private final DbRepository repository;
|
|
|
- private JsonWriterFactory jsonWriterFactory;
|
|
|
- private JsonBuilderFactory jsonBuilderFactory;
|
|
|
|
|
|
public DbService(DbRepository repository) {
|
|
|
this.repository = repository;
|
|
|
-
|
|
|
- this.jsonWriterFactory = Json.createWriterFactory(null);
|
|
|
- this.jsonBuilderFactory = Json.createBuilderFactory(Collections.emptyMap());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -44,63 +34,61 @@ public class DbService implements Service {
|
|
|
}
|
|
|
|
|
|
private void db(final ServerRequest request,
|
|
|
- final ServerResponse response) {
|
|
|
+ final ServerResponse response) {
|
|
|
repository.getWorld(randomWorldNumber())
|
|
|
- .map(World::toJson)
|
|
|
- .subscribe(jsonObject -> response.send(jsonObject));
|
|
|
+ .forSingle(world -> response.send(world.toJson()));
|
|
|
}
|
|
|
|
|
|
private void queries(final ServerRequest request,
|
|
|
- final ServerResponse response) {
|
|
|
- Flowable<JsonObject>[] worlds = new Flowable[parseQueryCount(request.queryParams())];
|
|
|
- Arrays.setAll(worlds, i -> repository.getWorld(randomWorldNumber()).map(World::toJson).toFlowable());
|
|
|
+ final ServerResponse response) {
|
|
|
+
|
|
|
+ Multi.range(0, parseQueryCount(request.queryParams()))
|
|
|
+ .flatMap(i -> repository.getWorld(randomWorldNumber()))
|
|
|
+ .map(World::toJson)
|
|
|
+ .reduce(JSON::createArrayBuilder, JsonArrayBuilder::add)
|
|
|
+ .map(JsonArrayBuilder::build)
|
|
|
+ .onError(response::send)
|
|
|
+ .forSingle(response::send);
|
|
|
|
|
|
- marshall(worlds).subscribe(jsonObject -> response.send(jsonObject));
|
|
|
}
|
|
|
|
|
|
private void updates(final ServerRequest request,
|
|
|
final ServerResponse response) {
|
|
|
- Flowable<JsonObject>[] worlds = new Flowable[parseQueryCount(request.queryParams())];
|
|
|
-
|
|
|
- Arrays.setAll(worlds, i -> repository.getWorld(randomWorldNumber()).flatMapPublisher(world -> {
|
|
|
- world.randomNumber = randomWorldNumber();
|
|
|
- return repository.updateWorld(world).map(World::toJson).toFlowable();
|
|
|
- }));
|
|
|
|
|
|
- marshall(worlds).subscribe(jsonObject -> response.send(jsonObject));
|
|
|
- }
|
|
|
-
|
|
|
- private Single<JsonArray> marshall(Flowable<JsonObject>[] worlds) {
|
|
|
- return Flowable.mergeArray(worlds)
|
|
|
- .toList()
|
|
|
- .map(this::buildArray)
|
|
|
- .doOnError(Throwable::printStackTrace);
|
|
|
+ Multi.range(0, parseQueryCount(request.queryParams()))
|
|
|
+ .flatMap(i -> repository.getWorld(randomWorldNumber()), 1, false, 1)
|
|
|
+ .flatMap(world -> {
|
|
|
+ world.randomNumber = randomWorldNumber();
|
|
|
+ return repository.updateWorld(world);
|
|
|
+ }, 1, false, 1)
|
|
|
+ .map(World::toJson)
|
|
|
+ .reduce(JSON::createArrayBuilder, JsonArrayBuilder::add)
|
|
|
+ .map(JsonArrayBuilder::build)
|
|
|
+ .onError(response::send)
|
|
|
+ .forSingle(response::send);
|
|
|
}
|
|
|
|
|
|
- private JsonArray buildArray(List<JsonObject> jsonObjects) {
|
|
|
- return jsonObjects.stream().reduce(
|
|
|
- jsonBuilderFactory.createArrayBuilder(),
|
|
|
- JsonArrayBuilder::add,
|
|
|
- JsonArrayBuilder::addAll)
|
|
|
- .build();
|
|
|
- }
|
|
|
+ private static final JsonBuilderFactory JSON = Json.createBuilderFactory(Collections.emptyMap());
|
|
|
|
|
|
private int randomWorldNumber() {
|
|
|
return 1 + ThreadLocalRandom.current().nextInt(10000);
|
|
|
}
|
|
|
|
|
|
private int parseQueryCount(Parameters parameters) {
|
|
|
- Optional<String> textValue = parameters.first("queries");
|
|
|
+ List<String> values = parameters.all("queries");
|
|
|
|
|
|
- if (textValue.isEmpty()) {
|
|
|
+ if (values.isEmpty()) {
|
|
|
return 1;
|
|
|
}
|
|
|
+
|
|
|
+ String first = values.get(0);
|
|
|
+
|
|
|
int parsedValue;
|
|
|
try {
|
|
|
- parsedValue = Integer.parseInt(textValue.get());
|
|
|
+ parsedValue = Integer.parseInt(first, 10);
|
|
|
} catch (NumberFormatException e) {
|
|
|
return 1;
|
|
|
}
|
|
|
return Math.min(500, Math.max(1, parsedValue));
|
|
|
}
|
|
|
-}
|
|
|
+}
|