2015-05-27 12 views
5

W Hazelcast, jest to możliwe do kwerendy IMAP w oparciu o atrybuty klucza zamiast wartości? Wszystkie przykłady Hazelcast pokazują zapytania według wartości. Na przykład na mapie pracowników z kluczami, które są ciągi:Możliwe zapytanie przez klucz zamiast wartości w Hazelcast (przy użyciu predykatów)?

IMap<String, Employee> employees; 

Typowe predykaty wyszukiwania następnie wyszukać na podstawie atrybutów pracownika (imię, wynagrodzenia, itp). Ale moja sprawa używa bardziej złożonych klucze, takie jak:

IMap<DataAttributes, DataValue> myData; 

więc jeśli DataAttributes ma dziedziny, takie jak:

class DataAttributes { 
    String theDescription; 
    Date theStartTime; 
    public String getDescription() { return theDescription; } 
    // etc.... 
} 

Chcę napisać predykat że może zapytać o klawiszach, aby powrócić odpowiedni Obiekt DataValue. To nie działa:

Predicate pred = Predicates.equal("description", "myDescription"); 
myData.keySet(pred); // Throws IllegalArgumentException: "There is no suitable accessor for..." 

mogłem roll-my-own, jak sugerowano w this answer, ale wolałbym użyć out-of-the-box rozwiązanie, jeśli mogę.

To nie ma znaczenia, czy mogę skończyć używając API kryteria lub rozproszonych API zapytania SQL. Każde działające zapytanie byłoby świetne. Punkty premiowe za rozwiązanie działające na zagnieżdżonych atrybutach (np .: DataAttributes theStartTime.getYear()).

Odpowiedz

7

to jest możliwe przy użyciu PredicateBuilder (com.hazelcast.query.PredicateBuilder). PredicateBuilder paradygmat pozwala na zapytanie na podstawie kluczy, tak:

EntryObject eo = new PredicateBuilder().getEntryObject(); 
Predicate fredWithStartTimeThisYear = eo.key().get("Description").equal("Fred") 
    .and(eo.key().get("theStartTime.Year").equal(2015)); 

pamiętać, że można odwołać się do członków klasy metodą akcesor („pochłaniacza”) lub nazwa pola, jak widać w powyższym przykładzie kodu . Znalazłem te informacje w książce online "Mastering Hazelcast", dostępnej na hazelcast.org (ale musisz wypełnić formularz rejestracyjny, aby uzyskać do niego dostęp).

+0

uwaga, że ​​za pomocą predykatu (na klucz lub wartości) jest bardzo kosztowna, gdy wiele danych jest ładowane do map ... być ostrożnym z tego użytkowania! – Donatello

+0

@Donatello Right. Zwykle używam indeksów, aby to złagodzić. Przydatne jest również użycie odpowiedniego serializera. –

Powiązane problemy