D10058 - Utility X, thenParallelArray/Json

We have known that Utility X provide the api thenParallel for parallel usage, this chapter we’ll introduce some fixed data type such as JsonArray and JsonObject, both data types are frequently used in vert.x

The api definition is as following:

static Future<JsonArray> thenParallelArray(
    final Future<JsonArray> source, 
    final Function<JsonObject, Future<JsonObject>> generateFun, 
    final BinaryOperator<JsonObject> operatorFun)

static Future<JsonObject> thenParallelArray(
    final Future<JsonArray>... sources)

static Future<JsonObject> thenParallelJson(
    final Future<JsonObject> source, 
    final Function<JsonObject, List<Future>> generateFun, 
    final BiConsumer<JsonObject, JsonObject>... operatorFun)

static Future<JsonObject> thenParallelJson(
    final JsonObject source, 
    final Function<JsonObject, List<Future>> generateFun, 
    final BiConsumer<JsonObject, JsonObject>... operatorFun)

There are four new apis for parallel Future building, now we’ll explain the usage with real codes

1. Source Code

The codes came from real project of Micro Hotel Platform

1.1. thenParallelArray

This function is the same as thenParallel that we met in previous tutorial, but it’s not generic java type, but JsonObject and JsonArray instead:

    public Future<JsonArray> payterms(final String sigma) {
        return Ux.thenParallelArray(
                this.findPayterms(sigma),
                this.findCats(sigma)
        ).compose(item -> {
            // Two table data.
            final JsonArray payterms = item.getJsonArray("0");
            final JsonArray categories = item.getJsonArray("1");
            // Zip two json array
            final JsonArray result = Uarr.create(payterms)
                    .zip(categories, "category", "key")
                    .to();
            return Future.succeededFuture(result);
        });
    }

Here you should know one thing is that the result of Future<JsonObject> should contains different JsonArray, you can refer each JsonArray by index such as the code item.getJsonArray("0").

1.2. thenParallelJson

The secondary function is thenParallelJson, you can refer following code segments to check the usage:

    public Future<JsonObject> findById(final Long id) {
        return Ux.Jooq.on(HtlHotelDao.class)
                .<HtlHotel>fetchOneAsync("PK_ID", id)
                .compose(hotel -> Ux.thenJsonOne(hotel, "hotel"))
                .compose(item -> Ux.thenParallelJson(item,
                        (hotel) -> Arrays.asList(this.findLocation(hotel)),
                        // Calculation Function
                        (target, source) -> target.put("locationId", source)
                ));
    }

Here we get the object of Hotel as item and then use the item to find the related records Location, finally we put the Location data into hotel and set to locationId. The whole logical should be as following:

2. Summary

From above workflow explain, you should know that this function is very helpful when you need more additional database access here. In our project, we removed foreign key and used Jooq, to avoid complex duplicated codes, zero system provide the api for you to resolve this kind situation.