Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
A Document Mapper based on CouchDB
PHP
branch: implement_mapp…

This branch is 219 commits behind master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
bin
lib
sandbox
tests
.gitignore
.gitmodules
LICENSE
README.markdown

README.markdown

CouchDB ODM

Current Status:

  • basic CRUD is implemented
  • metadata reading implemented
  • many2one and many2many with lazyloading mostly implemented
  • flexible ID generation implemented
  • plenty of TODO's noted through out the source code
  • please use the Doctrine Jira to log tickets: http://www.doctrine-project.org/jira/browse/CODM

Hackaton Discussions: CouchDB + Doctrine

Problem 1: Query API

  • Views
    • including ability to define limit, sort direction, include docs
  • CouchDB-Lucene hidden transparently in the Background
    • Allows a dynamic query language to be implemented
    • Depending on the search backend (query language translator)

Problem 2: Lazy Loading

How to implement object-graph traversal transparently?

  • two views required, because bi-directional relationships?
  • emit([doc.type, doc.field, doc._id], 0); (triple)

We need some matadata to be stored in doctrine couchdb odm documents: "type", "relations"

Problem 3: Joins

2 possibilities: embedded, with ids

"Foreign Keys":

  • one-to-many: save one key-reference in each "many"-document
  • many-to-many: save ids in the owning-side document
  • one-to-one: maybe good use-case for embedded documents

Problem 4: Embedded Documents Use-Case?

Value objects (Color example)

Problem 5: Computed Values from View

  • By default we dump everything that isnt mapped to a property into a "values" array
  • Optionally provide a way to map these values to a key so that we can provide an associative array

Problem 6: @DynamicFields

Just have mapping type "array".

class Address
{
    /** @var array
    public $additional = array();
}

Problem 7: "Eventual Migration" / Liberal Reads

MongoODM has solution for that http://www.doctrine-project.org/projects/mongodb_odm/1.0/docs/reference/migrating-schemas/en#migrating-schemas

Problem 8: Write/Flushing changes

  • Conflict Management throws an Exception into the users face :)

Problem 9: Attachments

Easily lazyloaded by resource handle or "transparent" proxy

Problem 10: HTTP Client

  • Should be interfaced
  • Different implementations: Socket, Stream Wrapper, pecl/http

Problem 11: Objects without "Doctrine Metadata"

  • Eventual migration possibilities for this case should be possible

Problem 12: ID Generation

  • Assigned IDs (Username for the User)
  • Unique Constraints
  • UUID (Generate IDs upfront possible)

Requirements

  1. type of the document in each couchdb "doc"
  2. Expose revision to the user!!!
  3. metadata field in each "doctrine handled" document

Struct

{
    "_id": "asbaklsjdfksjddf",
    "__doctrine": {
        "type": "foo",
        "relations" : {
            "bar": [ "id1", "id2" ], // M:N
         }
    },
    "fieldA": "foobar"
    "embeddedA": [{...}, {...}]
}

Views for relation retrieval

Related objects (works for 1:1, 1:n, n:1 and n:m)

function (doc)
{
    if (doc.doctrine_metadata &&
        doc.doctrine_metadata.relations)
    {
        var relations = doc.doctrine_metadata.relations;
        for ( type in relations )
        {
            for ( var i = 0; i < relations[type].length; ++i )
            {
                emit([doc._id, type, relations[type][i]], {"_id": relations[type][i]} );
            }
        }
    }
}

Reverse relations objects (works for 1:1, 1:n, n:1 and n:m)

function (doc)
{
    if (doc.doctrine_metadata &&
        doc.doctrine_metadata.relations)
    {
        var relations = doc.doctrine_metadata.relations;
        for ( type in relations )
        {
            for ( var i = 0; i < relations[type].length; ++i )
            {
                emit([relations[type][i], type, doc._id], {"_id": relations[type][i]} );
            }
        }
    }
}

Also Natural Key Support

class User
{
    /** @Id @Field */
    public $username;
}
Something went wrong with that request. Please try again.