iidec / Integra.Space.Language-upstream

Lenguaje de consulta que permite el acceso a datos en tiempo real
0 stars 0 forks source link

Streams (permanentes) / into #46

Closed marianogenovese closed 7 years ago

marianogenovese commented 7 years ago

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.

OscarCanek commented 7 years ago

Gramática

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);
OscarCanek commented 7 years ago

Propuesta

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);
marianogenovese commented 7 years ago

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.

OscarCanek commented 7 years ago

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

OscarCanek commented 7 years ago

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;
marianogenovese commented 7 years ago

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.

OscarCanek commented 7 years ago

Hay que definir que hará el into a nivel de ejecución.

OscarCanek commented 7 years ago

¿Como se debería almacenar en la metadata de la consulta (dll) la fuente definida en el into?