Сохраните и отфильтруйте список значений для ключа в Hazelcast - PullRequest
0 голосов
/ 13 апреля 2020

Мой вызов базы данных возвращает список значений для ключа, и мне нужно весной использовать Hazelcast в качестве кэша для хранения этих значений.

Я могу сохранить его как (ключ, список) в IMap но при этом я не могу применить фильтры к этим элементам для ключа, используя что-то вроде Предикатов для Hazelcast. Я также хотел бы, чтобы он поддерживал разбиение на страницы для списка значений.

Уже слышал что-то о MultiMaps, но не может настроить его в Springboot, а также не уверен, что он использует вышеприведенный вариант использования.

Любая помощь по этому вопросу высоко ценится.

Пример: {userid1: [{accNum:, accType:}, {}], userid2: [{accNum:, accType:}, {}], ... .}

Теперь я хочу отфильтровать accType для userid1, используя предикаты, если это возможно.

1 Ответ

0 голосов
/ 30 апреля 2020

Это помогает?

Показывает, как вы можете запросить JSON объекты

import java.util.Collection;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.HazelcastJsonValue;
import com.hazelcast.core.IMap;
import com.hazelcast.query.Predicate;
import com.hazelcast.query.SqlPredicate;

public class Application {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception {
        HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();

        IMap<Integer, HazelcastJsonValue> someMap = hazelcastInstance.getMap("name goes here");

        String json1 = "{\"user\": 1, \"acc\": [{\"accNum\": 1, \"accType\": \"A\"}, {\"accNum\": 3, \"accType\": \"C\"}]";
        String json2 = "{\"user\": 2, \"acc\": [{\"accNum\": 2, \"accType\": \"B\"}, ]";

        HazelcastJsonValue value1 = new HazelcastJsonValue(json1);
        HazelcastJsonValue value2 = new HazelcastJsonValue(json2);

        someMap.put(1, value1);
        someMap.put(2, value2);

        String[] queries = {
                "user > 1",
                "acc[any].accType = 'C'",
                "acc[1].accType = 'C'",
                "acc[any].accType != 'C'",
                "acc[0].accType != 'C'",
        };

        for (String query : queries) {
            Predicate<Integer, HazelcastJsonValue> predicate = new SqlPredicate(query);
            System.out.printf("%n%s%n", query);
            Collection<HazelcastJsonValue> results = someMap.values(predicate);
            results.forEach(System.out::println);
            System.out.printf("[%d row%s]%n", results.size(), results.size()==1 ? "": "s");
        }

        hazelcastInstance.shutdown();
    }
...