Агрегация отдельных ключей Hazelcast

Есть ли способ использовать агрегация Hazelcast для получения отдельных IMap ключевых свойств?

Aggregations.distinctValues() вместе с извлекатель свойств позволяет получать различные свойства value; однако я не уверен, как получить отдельные свойства key с помощью агрегирования.

public class AggregationTest {

    public static void main(String[] args) throws Exception {

        HazelcastInstance instance = Hazelcast.getOrCreateHazelcastInstance(new Config("hazelcast1"));

        // Create map with test values
        IMap<MapKey, MapValue> map = instance.getMap("tenantUserMap");
        map.set(new MapKey("tenantA", "userA"), new MapValue("someMapValue1"));
        map.set(new MapKey("tenantA", "userB"), new MapValue("someMapValue2"));
        map.set(new MapKey("tenantB", "userA"), new MapValue("someMapValue1"));

        // Use case: Obtain counts for each tenant (a property of the map's key)
        // FIXME In order to iterate over each tenant to obtain a count, how do we get the list of distinct key properties??
        Long tenantACount = map.aggregate(Supplier.fromKeyPredicate(new TenantKeyPredicate("tenantA")), Aggregations.count());
        Long tenantBCount = map.aggregate(Supplier.fromKeyPredicate(new TenantKeyPredicate("tenantB")), Aggregations.count());
        Long unknownTenantCount = map.aggregate(Supplier.fromKeyPredicate(new TenantKeyPredicate("unknown")), Aggregations.count());

        System.out.println("tenantA count: " + tenantACount);
        System.out.println("tenantB count: " + tenantBCount);
        System.out.println("unknown count: " + unknownTenantCount);

        // It is easily possible to obtain distinct VALUE properties... but how to obtain distinct KEY properties?
        Set<Object> distinctValues = map.aggregate(Supplier.all(value -> value.getValue()), Aggregations.distinctValues());
        System.out.println("distinct values: " + distinctValues);

        instance.shutdown();
    }

    static class TenantKeyPredicate implements KeyPredicate<MapKey> {

        private static final long serialVersionUID = 5073272969705387966L;

        private final String tenant;

        public TenantKeyPredicate(String tenant) {
            this.tenant = tenant;
        }

        @Override
        public boolean evaluate(MapKey key) {
            return tenant.equals(key.getTenant());
        }
    }

    static class MapKey implements Serializable {

        private static final long serialVersionUID = -4067718572086979235L;

        private final String tenant;
        private final String username;

        MapKey(String tenant, String username) {
            this.tenant = tenant;
            this.username = username;
        }

        public String getTenant() {
            return tenant;
        }

        public String getUsername() {
            return username;
        }

    }

    static class MapValue implements Serializable {

        private static final long serialVersionUID = 7173400494627910565L;

        private final String value;

        MapValue(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

    }

}

person shelley    schedule 04.03.2016    source источник


Ответы (1)


Вы можете легко реализовать свой собственный Supplier.

Поставщик — это просто компонент, который умеет извлекать данные из записи карты. В вашем случае вы хотите извлечь данные из ключа. Поскольку в Hazelcast это не является обычным сценарием (лучше иметь простой ключ), не существует общей реализации, которая бы это делала.

Однако в вашем случае эта реализация проста:

public class TenantSupplier extends Supplier<MapKey, MapValue, String> {

    @Override
    public String apply(Entry<MapKey, MapValue> entry) {
        return entry.getKey().getTenant();
    }   
}

Затем вы можете агрегировать арендаторов ключей с этим поставщиком:

Set<String> uniqueTenant = map.aggregate(new TenantSupplier(), 
              Aggregations.<MapKey, String, String>distinctValues());
person Jérémie B    schedule 04.03.2016
comment
Я надеялся, что упустил что-то очевидное, и был простой ответ, и он действительно есть. Благодарю вас! - person shelley; 04.03.2016