Opis mechanizmu query

Mechanizm query jest formą komunikacji między agentami. Wykonując query na dowolnym agregacie agent może uzyskać od niego zestaw properties jego agentów spełniających dowolne kryteria.

Podstawowym interfejsem mechanizmu jest IQuery. Cykl operacji na IQuery przedstawia się następująco:

Przygotowano prostą implementację AggregatingQuery, dokonującą zbierania (agregowania) zbiorów propertiesów bez ich dogłębniejszej analizy. Zdefiniowane w niej query jest zbiorem constraintów (IConstraintEntry) i funkcji (IQueryFunction). IConstraintEntry to połączenie nazwy property na które narzucony jest constraint oraz samego constraintu. Constrainty to klasy sprawdzające czy uzyskany z property obiekt spełnia kryteria wyszukiwania. Zaimplementowano cztery podstawowe typy constraintów:

Funkcje to zbiór przekształceń na rezultatach query, są ustawione w listę i wykonywane kolejno.

Klasa umożliwia dodawanie do query constraintów i funkcji za pomocą kodu, jest także ClassPropertyContainer, co oznacza że można ją zdefiniować za pomocą konfiguracji jAgE. Domyślna implementacja IConstraintEntry (ConstraintEntry), wszystkie zdefiniowane rodzaje constraintów a także abstrakcyjna klasa funkcji AbstractQueryFunction także są ClassPropertyContainerami, więc także mogą być definiowane za pomocą konfiguracji.

Klasa przechowuje także konfiguracyjną nazwę (czyli nazwę pod jakim znajduje się on w konfiguracji jAgE) rezultatu jaki jest tworzony na etapie inicjalizacji query.

Taka definicja pozwala na dowolne zdefiniowanie query. Z reguły jest to jednak uciążliwe, szczególnie w przypadku gdy plik konfiguracyjny bardzo puchnie od skomplikowanych constraintów. Ponadto takie podejście zazwyczaj jest nieefektywne.

W wielu przypadkach prościej dla użytkownika jest zaimplementować własne IQuery, które wykonuje pożądanych selekcji i przekształceń. Nic nie stoi na przeszkodzie aby użytkownik korzystał w tej implementacji z przygotowanych constraintów i funkcji, może jednak równie dobrze zastosować jakieś własne podejście, specyficzne dla poszukiwanego rozwiązania i przez to znacznie efektywniejsze w użyciu.

Obiekty na których można wykonywać query implementują interfejs IQueryable. Interfejs ten jest rozszerzany w dwie strony.