/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira.drafts
 */

package net.ranides.esb.query;

import java.util.List;
import java.util.stream.Stream;
import net.ranides.assira.collection.query.CQuery;

/**
 * Idea jest taka:
 * Odpowiedzią na zapytanie do szyny jest EQList, która zawiera pola "origin" oraz "qid". 
 * Na serwerze odpowiedni DAO (patrz: origin) przechowuje informację o SQLu czy innym URLu 
 * wygenerowanym dla zapytania (patrz: qid). Dane nie są jeszcze transportowane, nie zostało
 * nawet wykonane zapytanie do żadnej bazy.
 * 
 * Jeśli poprosimy o dane (#list, #stream, #cstream) to do szyny idzie kolejny request (FETCH origin,qid).
 * Teraz w odpowiednich bazach rusza zapytanie, a wyniki są transportowane do klienta.
 * 
 * Każdy DAO oferuje funkcje: mapowania, filtrowania, joinowania. 
 * Każda taka funkcja ma nazwę oraz może pobierać argumenty. 
 * Część usług może być używana przez szynę podczas generowania query planu, np podczas joinowania szyna może użyć 
 * dostępnych filtrów, aby wstępnie ograniczyć zbiory. 
 * 
 * 
 * Czyli np katalog użytkowników może mieć filtry: 
 *      "id", 
 * "name", "age", "location". Z czego 
 * 
 * 
 * @author Ranides Atterwim <ranides@gmail.com>
 */
public interface EQList {
    
    EQOrigin origin();
    
    long qid();
    
    List<Object> list();
    
    Stream<Object> stream();
    
    CQuery<Object> cstream();
    
    EQList filter(String name, Object... params);

    EQList map(String name, Object... params);
    
    EQList join(EQList list);
    
    EQList join(String name, EQList list);
    
}
