SharpMongo en C# (3) Implementando el REPL

Anterior Post


Quería describir hoy algo de la implementación del REPL (Read Eval Print Loop) que implementé para SharpMongo en:


https://github.com/ajlopez/SharpMongo


Recordemos, SharpMongo es una base NoSQL basada en documentos, inspirada en MongoDB. Es trabajo en progreso, pero el núcleo ya está bastante implementado. El REPL es un utilitario de consola que sirve para probar algunos comandos.


Para implementar cosas como atender:


> db.people.insert({ Name: 'Adam', Age: 800 })
> db.people.insert({ Name: 'Eve', Age: 700 })
> show collections
people  

tuve que manejar un objeto Database que tuviera propiedades, y que esa propiedad (por ejemplo .people en el código de arriba) fuera una colección de documentos, incluso una no existente.


Curiosamente, la implementación de un objeto así está basada en los propios DynamicObject que tiene el núcleo de SharpMongo: los documentos que mantiene SharpMongo en memoria son objetos del tipo DynamicObject, y los objetos que maneje el REPL, también.


He aquí la implementación actual de DbObject


https://github.com/ajlopez/SharpMongo/blob/master/Src/SharpMongo.Language/DbObject.cs


public class DbObject : DynamicObject
{
    private DocumentBase dbase;

    public DbObject(DocumentBase dbase)
    {
        this.dbase = dbase;
    }

    public DocumentBase DocumentBase { get { return this.dbase; } }

    public override object GetMember(string name)
    {
        return new CollectionObject(this.dbase.GetOrCreateCollection(name));
    }
}

La forma de implementar la propiedad dinámica .people es redefinir el método que consigue una propiedad por nombre. En vez de basarse en el método de la clase madre, que mantiene un diccionario de las propiedades, en el código de arriba se devuelve una colección de documentos dentro de la base de documentos que estemos trabajando. Si ven el código y la historia del proyecto, todo esto fue programando usando TDD.


Próximos posts: implementación del objecto Collection en el REPL, parser, lexer, operadores


Nos leemos!


Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 13239, 1389, 15035, 17526, 18097, 5374. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>