Open marianogenovese opened 8 years ago
eql query = source definition, where, (select | (apply window, group by, select, order by));
=======================================================
source definition = from | join;
from = 'from', identifier or alias;
join = ('left' | 'right' | 'cross' | 'inner' | Ɛ), 'join', identifier or alias, where, 'with', identifier or alias | where, 'on', logic expression for on condition, 'timeout', datetimevalue;
=======================================================
where = ('where', logic expression) | Ɛ;
=======================================================
apply window = 'apply', 'window', 'of', datetimevalue;
=======================================================
group by = ('group', 'by', list of groups) | Ɛ;
list of groups = (list of groups, ',', values, 'as', identifier) | values, 'as', identifier;
=======================================================
select = 'select', top, list of columns;
top = 'top', integer | Ɛ;
list of columns = (list of columns, ',', projection value, 'as', identifier) | projection value, 'as', identifier;
=======================================================
order by = ('order', 'by', ('asc' | 'desc' | Ɛ), list of identifiers) | Ɛ;
list of identifiers = (list of identifiers, ',', identifier) | identifier
=======================================================
identifier or alias = identifier | (identifier, 'as' identifier);
La extensión reactive de este sería Repeat
o Replay
?
el apply repeat sustituye al apply window o se ponen juntos?, de ponerse juntos cual va primero?
La propuesta es conceptual, no tiene, al menos inicialmente, relación con las funciones de Rx. Mira el issue #45 para entender el porque de este argumento.
En un flujo indefinido de eventos, ¿Cómo debería comportarse el repeat?, ¿Qué repetiría si el flujo de eventos es indefinido?
En el issue #45 comento eso.
Solo para tener el enlace al comentario, abajo lo coloco:
No tengo claro lo siguiente: el repeat es sobre los valores o sobre la ejecución de la consulta? porque segun el caso B
Caso B. Quiero saber por 3 veces con ventanas de 5 segundos, un conteo de registros en una fuente. Aquí el usuario no debe poner duración (apply) sino debe poner repetición (apply) y aplicar una ventana de tiempo (apply), si el usuario pone duración el comportamiento cambia.
Eso quiere decir que el conteo no va a ser sobre los mismos eventos, es decir, va a tomar tres conteos consecutivos antes de terminar la ejecución.
Ejemplo:
from visa
select count(tarjeta)
group by tarjeta
apply repetition 3
apply window '00:00:05'
Seg: 1 al 5: Llegan 2 eventos, cuenta 2 y genera un registro con 2 Seg: 5 al 10: Llegan 4 eventos, cuenta 4 y genera un registro con 4 Seg: 10 al 15: Llegan eventos, cuenta 0 y genera un registro con 0 Fin del stream.
eql query = source definition, where, (select | (apply window, group by, select, order by)), (apply extensions | Ɛ);
apply extensions = (apply extensions, apply extension) | apply extension;
apply extension = appy duration | apply repetition
apply duration = 'apply', 'duration', timespan value
apply repetition = 'apply', 'repeat', unsigned int value
Para definir la condición de finalización de un stream (sesión) es necesario definir la palabra reservada repeat que permita declarar el comportamiendo de un stream. Para los streams de sesión, la repetición es importante puesto que podriamos tener los casos:
apply_repeat = 'apply', 'repeat', ' ', unsigned_int_value
@OscarCanek por favor adjuntemos a este issue la gramatica del select para modificarlo.