h1. OrientDB Module

OrientDB for Play! Framework

h3. Features

* play.db.Model support
* CRUD support
* Embedded server for development
* Injection of database sessions in controllers
* Annotation-based transaction demarcation
* Live class-reloading as usual
* Basic support for RecordHooks and DatabaseListeners

h2. Configuration

These are the default values that you can override in @conf/application.conf@

bc.. # OrientDB Module
# ~~~~~
# odb.url=memory:temp
# odb.user=admin
# odb.password=admin
# Separate url for graphDB, if not specified uses odb.url
# odb.graph.url=memory:temp
# Path to custom configuration file, in classpath or retalive to conf/ dir
# odb.config.file=/play/modules/orientdb/db.config
# Package prefix to scan entities
# odb.entities.package=models
# Control open session in view
# odb.open-in-view.documentdb=true
# odb.open-in-view.objectdb=true
# odb.open-in-view.graphdb=false

h2. Basic usage

h3. Object Database

The access to ODatabaseObjectTx is wrapped in Model, so if you don't need direct access simply create an entity that extends play.modules.orientdb.Model

bc.. public class Item extends Model {
    @SuppressWarnings("unused")
    @Id
    private Object id;

    @SuppressWarnings("unused")
    @Version
    private Object version;

    @Required
    public String name;

    public String description;
}

p. And use that entity on the controller:

bc.. public class MyController extends Controller {

    public static void index() {
        OObjectIteratorMultiCluster<Item> items = Item.all();
        render(items);
    }

    public static void detail(ORecordId id) {
        Item item = Item.findById(id);
        notFoundIfNull(item);
        render(item);
    }

    @Transactional
    public static void save(String name, String description) {
        Item item = new Item();
        item.name = name;
        item.description = description;
        item.save();
        index();
    }
    
    public static void search(String query) {
    	List<Item> result = Item.find("select * from Item where name like ?", "%"+query+"%");
    	render(result);
    }
}

p. Note: to obtain the ORID call the method @entity.getIdentity()@

h3. Document Database

p. Inject the session in the controller

bc.. public class MyController extends Controller {

    @Inject
    static ODatabaseDocumentTx docdb;

    ...

    @Transactional(db = DBTYPE.DOCUMENT)
    public static void good() {
        ODocument doc = new ODocument(docdb, "Account");
        doc.field("name", "good");
        doc.save();
        index();
    }

}

p. If you have an entity that maps the document you can obtain an object representation, because OrientDB ODatabaseObject is built on top of ODatabaseDocument

bc.. public class MyController extends Controller {
    @Inject
    static ODatabaseObjectTx db;

    public static void index() {
        OObjectIteratorMultiCluster<Account> accounts = db.browseClass(Account.class);
        render(accounts);
    }

}

h3. Graph Database

A simple test:

bc.. public class MyController extends Controller {
   @Inject static OGraphDatabase database;
	
   public static void someMethod() {
      OClass vehicleClass = database.createVertexType("GraphVehicle");
      database.createVertexType("GraphCar", vehicleClass);
      database.createVertexType("GraphMotocycle", "GraphVehicle");

      ODocument carNode = (ODocument) database.createVertex("GraphCar").field("brand", "Hyundai")
                    .field("model", "Coupe").field("year", 2003).save();
      ODocument motoNode = (ODocument) database.createVertex("GraphMotocycle").field("brand", "Yamaha")
                    .field("model", "X-City 250").field("year", 2009).save();

      database.createEdge(carNode, motoNode).save();
      ...
   }
   ...
}

h3. Direct access

If you need direct access to any ODatabase use play.modules.orientdb.ODB

@ODatabaseDocumentTx docdb = ODB.openDocumentDB();@ 

p. and so on

h3. Hooks and Listeners

To register RecordHooks or DatabaseListeners, implement the proper interface (ORecordHook or ODatabaseListener) and put the code under /app, the module will find and register these classes at startup.

h2. References

* <a href="http://www.orientechnologies.com/orient-db.htm">OrientDB</a>
* <a href="http://code.google.com/p/orient/wiki/Main">OrientDB documentation</a>

p. //
