Hazelcast — наборы запросов значений Map

Предположим, у меня есть следующее значение в IMap:

public class Employee{
  public int empId;
  public List<String> categories;

  public List<String> getCategories(){
    return this.categories;
  }
}

Я хотел бы найти всех сотрудников, которые относятся к категории "Продажи". Кроме того, я хотел бы создать индекс для getCategories(), чтобы запрос возвращался быстро. Кажется, для этого нет предиката. Как мне добиться этого? Похоже, мне придется написать предикат, чтобы сделать это. Есть ли пример кода, который я могу посмотреть, который покажет мне, как построить предикат, использующий индекс?


person fast learner    schedule 29.09.2015    source источник
comment
@pveentjer, не могли бы вы ответить на этот вопрос?   -  person Dinesh    schedule 07.10.2015


Ответы (2)


Единственный способ, которым я в настоящее время вижу, что это происходит, - это денормализация модели данных и использование чего-то вроде IMap и следующего в качестве значения:

класс EmployeeCategory {int employeeId, категория String}

И поставьте индекс на категорию.

Это где-то в списке невыполненных работ, чтобы предоставить более продвинутые индексы, которые должны быть в состоянии сделать это из коробки.

person pveentjer    schedule 14.10.2015
comment
Спасибо за ответ. Есть ли отставание по добавлению индекса в мультикарты? Я думаю, что это было бы огромным подспорьем в таких сценариях. - person Dinesh; 18.10.2015
comment
Афаик такой проблемы нет. Не стесняйтесь сделать тикет на github или сделать реализацию самостоятельно :) - person pveentjer; 18.10.2015
comment
Отправьте мне секретный код на hazelcast.org/t-shirts, и я закончу реализацию. ;) - person Dinesh; 19.10.2015

Я попытался перебрать список в отдельный Imap, а затем запросить его в клиенте.

IMap<String,ArrayList< categories >> cache=hazelcastInstance.getMap("cache");                   
        IMap<String, categories> cachemodified = hazelcastInstance.getMap("cachemodified") ;        
        int[] idx = { 0 };
        xref.get("urkey").forEach(cachefelement ->{
            cachemodified.put(String.valueOf(idx[0]++),cachefelement);
        });
        Predicate p = Predicates.equal("categoryId", "SearchValue");
        Collection<categories> result = cachemodified.values(p);
person Sajeevan mp    schedule 16.08.2020