Closed marianogenovese closed 7 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);
Colocar el into a nivel del Stream en lugar de que este al nivel de la consulta. Esto traería la siguiente ventaja: no recompilar los dll cada vez que se cambié de fuente receptora, lo cual implica que no haya un corte en la recepción de eventos cuando se cambie de fuente. Ademas también influye en la velocidad de ejecución del cambio y en nuestro hardware.
Por lo tanto propongo lo siguiente:
Actualmente se tiene:
create stream = 'create', 'stream', ((identifier, ‘.’, identifier, ‘.’, identifier) | (identifier, ‘.’, identifier) | identifier), eql query, stream options;
Ahora sería:
create stream = 'create', 'stream', identifier path, eql query, 'into', identifier path, stream options;
identifier path = ((identifier, ‘.’, identifier, ‘.’, identifier) | (identifier, ‘.’, identifier) | identifier);
El alter sería:
alter stream = 'alter', 'stream', identifier path, (('with', stream options) | ('into', identifier path))
identifier path = ((identifier, ‘.’, identifier, ‘.’, identifier) | (identifier, ‘.’, identifier) | identifier);
La propuesta de ponerlo como parte del query permite mantener uniformidad cuando se hace un stream o cuando se hace un query o un stream de sesion (stream temporal o stream no durable). por ejemplo:
stream permanente from .. where.. select .. into otrafuente
stream no permanente from ... where .. select .. into otrafuente | currentsession
si se cambia a dejarlo a nivel de definición del stream, se pierde la uniformidad del lenguaje y de concepto.
currentsession puede omitirse de la regla gramatical, a menos que también sea posible especificar otra sesión, y solo permitir into otrafuente
y el currentsession se coloca cuando no haya into
.
stream permanente from .. where.. select .. into otrafuente
stream no permanente from ... where .. select .. [ into otrafuente ] <- es opcional, al no especificase se entiende que es a la sesión actual
Utilizando la gramática actual se propone la siguiente actualización:
eql query = source definition, where, ((select | (apply window, group by, select, order by))), into source;
=======================================================
into source = 'into', identifier;
Hacer el into explicito me parece que semanticamente denota que se tiene o un stream durable o un stream no durable, me parece que hacer el into obligatorio hace que el usuario tenga claro lo que esta haciendo.
Hay que definir que hará el into a nivel de ejecución.
¿Como se debería almacenar en la metadata de la consulta (dll) la fuente definida en el into?
Para controlar la salida de un stream (permante) es necesario definir la palabra reservada into que permita definir de manera explicita cual será la salida del stream. Para los streams permanentes, la salida siempre será otra fuente por lo que estos streams se usarán para procesar eventos más que consultarlos directamente. @OscarCanek por favor adjuntemos a este issue la gramatica del select para modificarlo.