Stefan Falk
Stefan Falk

Reputation: 25397

How can I use fetchMap() with a RecordMapper?

I know I can fetch a map something like this:

this.ctx.select(
        shopSubscription.field(SHOP_SUBSCRIPTION.SHOP_ID),
        shopSubscription.field(SHOP_SUBSCRIPTION.PAYMENT_GATEWAY_SUBSCRIPTION_ID),
        shopSubscription.field(SHOP_SUBSCRIPTION.ADMIN_TOOL_FEATURE_TYPE_ID),
        PAYMENT_GATEWAY_SUBSCRIPTION.SUBSCRIPTION_ID_TOKEN
        )
    .from(PAYMENT_GATEWAY_SUBSCRIPTION)
        .join(shopSubscription)
            .on(PAYMENT_GATEWAY_SUBSCRIPTION.ID.eq(shopSubscription.field(SHOP_SUBSCRIPTION.PAYMENT_GATEWAY_SUBSCRIPTION_ID))
                    .and(PAYMENT_GATEWAY_SUBSCRIPTION.PAYMENT_GATEWAY_TYPE_ID.eq(paymentGatewayType)))
        .fetchMap(PAYMENT_GATEWAY_SUBSCRIPTION.PAYMENT_GATEWAY_TYPE_ID, ShopSubscriptionDTO.class);

but to detect issues at compile time I'd prefer if I could additionally add a RecordMapper to this query.

So is there a way to call fetchMap() but also provide a RecordMapper?

What I'm thinking of would look something like this:

this.ctx.select(
        shopSubscription.field(SHOP_SUBSCRIPTION.SHOP_ID),
        shopSubscription.field(SHOP_SUBSCRIPTION.PAYMENT_GATEWAY_SUBSCRIPTION_ID),
        shopSubscription.field(SHOP_SUBSCRIPTION.ADMIN_TOOL_FEATURE_TYPE_ID),
        PAYMENT_GATEWAY_SUBSCRIPTION.SUBSCRIPTION_ID_TOKEN
        )
    .from(PAYMENT_GATEWAY_SUBSCRIPTION)
        .join(shopSubscription)
            .on(PAYMENT_GATEWAY_SUBSCRIPTION.ID.eq(shopSubscription.field(SHOP_SUBSCRIPTION.PAYMENT_GATEWAY_SUBSCRIPTION_ID))
                    .and(PAYMENT_GATEWAY_SUBSCRIPTION.PAYMENT_GATEWAY_TYPE_ID.eq(paymentGatewayType)))

        // For each record apply the map() function

        .map(new RecordMapper<Record<?>, ShopSubscriptionDTO>() {
            @Override
            public ShopSubscriptionDTO map(Record<?> record) {
                ShopSubscriptionDTO shopSubscriptionDto = new ShopSubscriptionDTO();

                shopSubscriptionDto.setShopId(record.getValue(SHOP_SUBSCRIPTION.SHOP_ID)
                // ...

                return shopSubscriptionDto;
            }
        });

        // Fetch the result into a map where the key is SHOP_SUBSCRIPTION.ADMIN_TOOL_FEATURE_TYPE_ID
        .fetchMap(SHOP_SUBSCRIPTION.ADMIN_TOOL_FEATURE_TYPE_ID);

Upvotes: 0

Views: 836

Answers (2)

Dmitry Roginin
Dmitry Roginin

Reputation: 11

java 8 or higher

.fetchMap(CN_TASKS.AGENTID,
                        r -> new CnTaskMessage(r.getValue(CN_TASKS.CN_TASKID), r.getValue(CN_TASKS.TASK_TYPE),
                                r.getValue(CN_TASKS.STATUS)));

Upvotes: 1

Stefan Falk
Stefan Falk

Reputation: 25397

Since there are quite a lot of different implementations of fetchMap() I didn't see that there is fetchMap(Field<K>, RecordMapper<? super R, R>) too. So just going with that helps solving this issue:

// ...
.fetchMap(ADMIN_TOOL_ADD_ON.ADMIN_TOOL_ADD_ON_TYPE_ID, new RecordMapper<Record, AdminToolAddOnDTO>() {

    @Override
    public AdminToolAddOnDTO map(Record record) {

        AdminToolAddOnDTO dto = new AdminToolAddOnDTO();

        dto.setId(record.getValue(ADMIN_TOOL_ADD_ON.ID));
        dto.setAdminToolFeatureTypeId(record.getValue(ADMIN_TOOL_ADD_ON.ADMIN_TOOL_FEATURE_TYPE_ID));
        dto.setAdminToolAddOnTypeId(record.getValue(ADMIN_TOOL_ADD_ON.ADMIN_TOOL_ADD_ON_TYPE_ID));
        dto.setPrice(record.getValue(ADMIN_TOOL_ADD_ON.PRICE));
        dto.setCountryId(record.getValue(ADMIN_TOOL_ADD_ON.COUNTRY_ID));
        dto.setAddOnIdToken(record.getValue(ADMIN_TOOL_ADD_ON_TYPE.ADD_ON_ID_TOKEN));

        return dto;
    }
});

Upvotes: 1

Related Questions