@@ -559,10 +559,35 @@ var eventEmitter = require('events').EventEmitter; | ||
if (constructor.getTableName() < model._joins[key].model.getTableName()) { | ||
newLink.id = self[model._joins[key].leftKey]+"_"+link; | ||
if ((constructor.getTableName() === model._joins[key].model.getTableName()) | ||
&& (model._joins[key].leftKey === model._joins[key].rightKey)) { | ||
// We link on the same model and same key | ||
// We don't want to save redundant field | ||
if (link < self[model._joins[key].leftKey]) { | ||
newLink.id = link+"_"+self[model._joins[key].leftKey]; | ||
} | ||
else { | ||
newLink.id = self[model._joins[key].leftKey]+"_"+link; | ||
} | ||
newLink[model._joins[key].leftKey+"_"+model._joins[key].leftKey] = [link, self[model._joins[key].leftKey]]; | ||
} | ||
else { | ||
newLink.id = link+"_"+self[model._joins[key].leftKey]; | ||
newLink[constructor.getTableName()+"_"+model._joins[key].leftKey] = self[model._joins[key].leftKey]; | ||
newLink[model._joins[key].model.getTableName()+"_"+model._joins[key].rightKey] = link; | ||
// Create the primary key | ||
if (constructor.getTableName() < model._joins[key].model.getTableName()) { | ||
newLink.id = self[model._joins[key].leftKey]+"_"+link; | ||
} | ||
else if (constructor.getTableName() > model._joins[key].model.getTableName()) { | ||
newLink.id = link+"_"+self[model._joins[key].leftKey]; | ||
} | ||
else { | ||
if (link < self[model._joins[key].leftKey]) { | ||
newLink.id = link+"_"+self[model._joins[key].leftKey]; | ||
} | ||
else { | ||
newLink.id = self[model._joins[key].leftKey]+"_"+link; | ||
} | ||
} | ||
} | ||
newLink[constructor.getTableName()+"_"+model._joins[key].leftKey] = self[model._joins[key].leftKey]; | ||
newLink[model._joins[key].model.getTableName()+"_"+model._joins[key].rightKey] = link; | ||
@@ -569,0 +594,0 @@ (function(key, link) { |
@@ -235,3 +235,3 @@ var util = require(__dirname+'/util.js'); | ||
Model.prototype.ensureIndex = function(name, fn) { | ||
Model.prototype.ensureIndex = function(name, fn, opts) { | ||
var self = this; | ||
@@ -254,3 +254,3 @@ var r = self._getModel()._thinky.r; | ||
r.table(tableName).indexWait(name), | ||
r.table(tableName).indexCreate(name, fn).do(function() { | ||
r.table(tableName).indexCreate(name, fn, opts || {}).do(function() { | ||
return r.table(tableName).indexWait(name) | ||
@@ -552,3 +552,3 @@ }) | ||
else { | ||
joinedModel.on('created', function() { | ||
joinedModel.once('created', function() { | ||
query.run().then(function() { | ||
@@ -586,3 +586,3 @@ joinedModel._indexWasCreated('local'); | ||
var self = this; | ||
var link; | ||
var link, query; | ||
var thinky = this._getModel()._thinky; | ||
@@ -632,2 +632,3 @@ | ||
// Create the two indexes on two models | ||
var queryIndex1 = r.branch( | ||
@@ -643,3 +644,5 @@ r.table(self.getTableName()).indexList().contains(leftKey), | ||
) | ||
) | ||
); | ||
// This could try to create the same index, but that's ok | ||
var queryIndex2 = r.branch( | ||
@@ -655,28 +658,4 @@ r.table(joinedModel.getTableName()).indexList().contains(rightKey), | ||
) | ||
) | ||
); | ||
var query = r.branch( | ||
r.table(link).indexList().contains(self.getTableName()+'_'+leftKey), | ||
r.table(link).indexWait(self.getTableName()+'_'+leftKey), | ||
r.table(link).indexCreate(self.getTableName()+'_'+leftKey).do(function() { | ||
return r.table(link).indexWait(self.getTableName()+'_'+leftKey) | ||
}) | ||
).do(function() { | ||
return r.branch( | ||
r.table(link).indexList().contains(self.getTableName()+'_'+leftKey), | ||
r.table(link).indexWait(self.getTableName()+'_'+leftKey), | ||
r.table(link).indexCreate(self.getTableName()+'_'+leftKey).do(function() { | ||
return r.table(link).indexWait(self.getTableName()+'_'+leftKey) | ||
}) | ||
) | ||
}).do(function() { | ||
return r.branch( | ||
r.table(link).indexList().contains(joinedModel.getTableName()+'_'+rightKey), | ||
r.table(link).indexWait(joinedModel.getTableName()+'_'+rightKey), | ||
r.table(link).indexCreate(joinedModel.getTableName()+'_'+rightKey).do(function() { | ||
return r.table(link).indexWait(joinedModel.getTableName()+'_'+rightKey) | ||
}) | ||
) | ||
}) | ||
self._getModel()._tableReady = false; | ||
@@ -686,3 +665,2 @@ joinedModel._getModel()._tableReady = false; | ||
joinedModel._getModel()._foreignIndexesToCreate++; | ||
if (self._getModel()._tableCreated === true) { | ||
@@ -704,3 +682,3 @@ queryIndex1.run().then(function(result) { | ||
else { | ||
self.on('created', function() { | ||
self.once('created', function() { | ||
queryIndex1.run().then(function() { | ||
@@ -721,3 +699,2 @@ self._indexWasCreated('local'); | ||
joinedModel._getModel()._tableReady = false; | ||
joinedModel._getModel()._indexesToCreate++; | ||
@@ -741,3 +718,3 @@ self._getModel()._foreignIndexesToCreate++; | ||
else { | ||
joinedModel.on('created', function() { | ||
joinedModel.once('created', function() { | ||
queryIndex2.run().then(function() { | ||
@@ -759,3 +736,35 @@ joinedModel._indexWasCreated('local'); | ||
if ((this.getTableName() === joinedModel.getTableName()) | ||
&& (leftKey === rightKey)) { | ||
// The relation is built for the same model, using the same key | ||
// Create a multi index | ||
query = r.branch( | ||
r.table(link).indexList().contains(leftKey+"_"+rightKey), | ||
r.table(link).indexWait(leftKey+"_"+rightKey), | ||
r.table(link).indexCreate(leftKey+"_"+rightKey, function(doc) { | ||
return doc(leftKey+"_"+rightKey) | ||
}, {multi: true}).do(function() { | ||
return r.table(link).indexWait(leftKey+"_"+rightKey) | ||
}) | ||
) | ||
} | ||
else { | ||
query = r.branch( | ||
r.table(link).indexList().contains(self.getTableName()+'_'+leftKey), | ||
r.table(link).indexWait(self.getTableName()+'_'+leftKey), | ||
r.table(link).indexCreate(self.getTableName()+'_'+leftKey).do(function() { | ||
return r.table(link).indexWait(self.getTableName()+'_'+leftKey) | ||
}) | ||
).do(function() { | ||
return r.branch( | ||
r.table(link).indexList().contains(joinedModel.getTableName()+'_'+rightKey), | ||
r.table(link).indexWait(joinedModel.getTableName()+'_'+rightKey), | ||
r.table(link).indexCreate(joinedModel.getTableName()+'_'+rightKey).do(function() { | ||
return r.table(link).indexWait(joinedModel.getTableName()+'_'+rightKey) | ||
}) | ||
) | ||
}) | ||
} | ||
return new Promise(function(resolve, reject) { | ||
@@ -793,3 +802,3 @@ var successCb = function() { | ||
else { | ||
linkModel.on('ready', function() { | ||
linkModel.once('ready', function() { | ||
query.run().then(successCb).error(errorCb) | ||
@@ -796,0 +805,0 @@ }); |
@@ -72,3 +72,3 @@ var Promise = require('bluebird'); | ||
p = new Promise(function(resolve, reject) { | ||
self._model.on('ready', function() { | ||
self._model.once('ready', function() { | ||
self._query.run(fullOptions).then(function(result) { | ||
@@ -130,2 +130,3 @@ if (parse === true) { | ||
} | ||
var innerQuery; | ||
@@ -203,11 +204,21 @@ gotModel = gotModel || {}; | ||
self._query = self._query.merge(function(doc) { | ||
if ((modelToGet[key] != null) && (modelToGet[key]._order != null)) { | ||
if ((model.getTableName() === joins[key].model.getTableName()) && (joins[key].leftKey === joins[key].rightKey)) { | ||
// In case the model is linked with itself on the same key | ||
innerQuery = r.table(joins[key].link).getAll(doc(joins[key].leftKey), {index: joins[key].leftKey+"_"+joins[key].leftKey}).concatMap(function(link) { | ||
return r.table(joins[key].model.getTableName()).getAll( | ||
r.branch( | ||
doc(joins[key].leftKey).eq(link(joins[key].leftKey+"_"+joins[key].leftKey).nth(0)), | ||
link(joins[key].leftKey+"_"+joins[key].leftKey).nth(1), | ||
link(joins[key].leftKey+"_"+joins[key].leftKey).nth(0) | ||
) | ||
, {index: joins[key].rightKey}) | ||
}).coerceTo("ARRAY") | ||
if ((modelToGet[key] != null) && (modelToGet[key]._order != null)) { | ||
innerQuery = innerQuery.orderBy(modelToGet[key]._order) | ||
} | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.object(key, | ||
new Query(joins[key].model, | ||
r.table(joins[key].link).getAll(doc(joins[key].leftKey), {index: model.getTableName()+"_"+joins[key].leftKey}).concatMap(function(link) { | ||
return r.table(joins[key].model.getTableName()).getAll(link(joins[key].model.getTableName()+"_"+joins[key].rightKey), {index: joins[key].rightKey}) | ||
}).coerceTo("ARRAY").orderBy(modelToGet[key]._order) | ||
)._query), | ||
r.object(key, new Query(joins[key].model, innerQuery).getJoin(modelToGet[key], getAll, gotModel)._query), | ||
{} | ||
@@ -217,10 +228,13 @@ ) | ||
else { | ||
innerQuery = r.table(joins[key].link).getAll(doc(joins[key].leftKey), {index: model.getTableName()+"_"+joins[key].leftKey}).concatMap(function(link) { | ||
return r.table(joins[key].model.getTableName()).getAll(link(joins[key].model.getTableName()+"_"+joins[key].rightKey), {index: joins[key].rightKey}) | ||
}).coerceTo("ARRAY") | ||
if ((modelToGet[key] != null) && (modelToGet[key]._order != null)) { | ||
innerQuery = innerQuery.orderBy(modelToGet[key]._order); | ||
} | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.object(key, | ||
new Query(joins[key].model, | ||
r.table(joins[key].link).getAll(doc(joins[key].leftKey), {index: model.getTableName()+"_"+joins[key].leftKey}).concatMap(function(link) { | ||
return r.table(joins[key].model.getTableName()).getAll(link(joins[key].model.getTableName()+"_"+joins[key].rightKey), {index: joins[key].rightKey}) | ||
}).coerceTo("ARRAY") | ||
)._query), | ||
new Query(joins[key].model, innerQuery).getJoin(modelToGet[key], getAll, gotModel)._query), | ||
{} | ||
@@ -227,0 +241,0 @@ ) |
{ | ||
"name": "thinky", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"description": "RethinkDB ORM for Node.js", | ||
@@ -27,3 +27,3 @@ "main": "lib/thinky.js", | ||
"dependencies":{ | ||
"rethinkdbdash": ">= 1.12.8", | ||
"rethinkdbdash": ">= 1.12.12", | ||
"bluebird": ">= 1.2.1" | ||
@@ -30,0 +30,0 @@ }, |
119154
2.55%2625
1.67%