Teleriks crea su propia implementación de “LINQ to M”

Uno de los aspectos que más me apasionan de la comunidad de desarrolladores que se han animado a probar Oslo hasta el momento es la cantidad de herramientas y tecnologías que, haciendo uso de Oslo, lo complementan en escenarios concretos o proporcionan funcionalidades adicionales bastante interesantes.

Buena muestra de ello es la implementación de LINQ to M, creada por Teleriks y lanzada la semana pasada, que nos permite realizar consultas sobre datos estructurados en M (MGraph) con un estilo muy similar al de LINQ to XML. Veamoslo con algo más de detalle…

El formato de datos “MGraph”

Como ya hemos comentado en posts previos, el lenguaje M, que en un futuro no muy lejano será un único lenguaje, está hoy por hoy dividido en tres “dialectos”: MSchema, MGrammar y MGraph.

M es un lenguaje cuya principal función es la de definir datos y restricciones sobre dichos datos, todo ello en forma de texto. Existe una conexión “emocional” entre la gran mayoría de desarrolladores y el formato de tipo texto, ya desde tiempos remotos los desarrolladores hemos vivido en entornos de tipo texto (consola, MS-DOS, etc), y además hemos representado nuestras ideas y algoritmos en forma de texto, mediante el uso de lenguajes de programación de propósito general (C, C++, C#, Java, etc.), o lenguajes de etiquetas/marcado para un dominio específico como por ejemplo HTML, XML o XAML. Adicionalmente, podemos pensar en un texto redactado en lengua castellana como otra representación de datos de forma textual, si bien, esta representación en lenguaje natural sigue unas reglas gramaticales algo menos estrictas que los lenguajes de programación y de marcado, así como una estructura textual (párrafos, signos de puntuación, etc) bastante más flexible que en los lenguajes citados con anterioridad.

Considerando todos estos lenguajes, el elemento diferenciador entre cada uno de ellos no es ni más ni menos que el conjunto de reglas que nos permiten expresar una serie de información en dicho lenguaje y también estructurar dichas ideas de forma más o menos “mecánica”. Esta forma mecánica de representación de información textual se lleva al extremo en un lenguaje como XML, el cual sigue una sintaxis muy estricta que lo convierte además en un lenguaje complejo de entender para una persona.

No obstante, todos ellos comparten una característica común, bastante obvia, pero conviene tenerla siempre presente: todos estos lenguajes nos permiten representar información en formato de texto.

Si pensamos en la relación entre texto y datos, el lenguaje M vive en dicha intersección. Por una parte, nos permite representar información en una serie de lenguajes proporcionados “de serie” y, por otra parte, nos permite crear fácilmente nuestras propias reglas gramaticales para transformar un conjunto de información textual poco estructurada (por ejemplo, un texto en castellano) en otro conjunto de información textual organizada de la forma que a nosotros nos resulte más cómoda: traducida a scripts T-SQL como en el caso de MSchema, a una representación en forma de grafo acíclico que conocemos con el nombre de AST y que constituye el “dialecto” MGraph, o a cualquier otra representación que definamos nosotros mismos mediante nuestras gramáticas creadas con MGrammar.

Una vez tengamos la información en un formato optimizado para su procesamiento, disponemos de diversas opciones para consumir dicha información desde nuestros entornos de ejecución y aplicaciones. En esta ocasión, nos vamos a centrar en la implementación de LINQ to M (MGraph) creada por Teleriks.

A continuación podemos ver un fragmento válido de información representada en formato MGraph, en la cual estamos describiendo un conjunto de vuelos e información sobre cada uno de ellos (código de vuelo, operador del vuelo, origen y destino).

{
      {Id=1,Origen=""Alicante"",Destino=""Madrid"",Operador=""Iberia""},
      {Id=2,Origen=""Oslo"",Destino=""Barcelona"",Operador=""SAS""},
      {Id=3,Origen=""Seattle"",Destino=""New York"",Operador=""Delta""},
      {Id=4,Origen=""Paris"",Destino=""Amsterdam"",Operador=""Air France""},
      {Id=5,Origen=""Londres"",Destino=""Vancouver"",Operador=""British Airways""},
      {Id=6,Origen=""Tokyo"",Destino=""Shanghai"",Operador=""Air China""},
      {Id=7,Origen=""Alicante"",Destino=""Madrid"",Operador=""Vueling""},
      {Id=8,Origen=""Alicante"",Destino=""Madrid"",Operador=""Spanair""}
}

Para este ejemplo, en el cual vamos a consumir la información directamente en tiempo de ejecución desde nuestro código C#, lo que vamos a hacer es almacenar este fragmento de código M en un const string.

Además, deberemos agregar en nuestro proyecto una referencia a Telerik.M.Core.dll y añadir una sentencia using Telerik.M.Core; en nuestro código, a fin de poder emplear estas funcionalidades. (esta dll forma parte de la descarga de LINQ to M).

Para consumir nuestro código M en forma de sentencias LINQ, deberemos en primer lugar cargar nuestro origen de datos, mediante el uso del objeto QueryContext, tal cual se muestra a continuación.

image

Con esto simplemente ya podríamos hacer uso de nuestra variable vueloM como origen de datos, por ejemplo para asignarlo a dicha propiedad DataSource en un objeto de tipo Grid, y visualizar nuestros registros de vuelos.

No obstante, si deseamos obtener Intellisense, coloreado de sintaxis, y demás servicios adicionales del lenguaje, deberemos crear una clase en C# que tenga la misma estructura que la información definida en M, para lo cual realizaremos algo parecido al siguiente código.

image

Gracias a esta definición, ya podemos hacer uso de características avanzadas del IDE, como por ejemplo Intellisense. En la siguiente captura podemos observar cómo realizar consultas LINQ sobre nuestra colección de datos en M, obteniendo información contextual en VS. (click sobre la imagen para una vista ampliada).

image

Terminaremos la consulta para visualizar los vuelos Alicante – Madrid ordenados de forma ascendente por nombre de Operador, y mostraremos dicha información en nuestra consola…

image

image

Para más información, podéis acceder al blog de Stephen Forte, CEO de Telerik, quien nos describe otra aplicación similar al ejemplo que os he mostrado aquí, y también nos cuenta sus experiencias con la SDK de Oslo durante los últimos meses.

También puedes descargar la implementación de LINQ to M en este enlace. Y el código completo de mi ejemplo aquí.

Saludos,

M.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *