(function(window)
{
var Gitana = window.Gitana;
Gitana.TraversalResults = Gitana.AbstractPersistable.extend(
/** @lends Gitana.TraversalResults.prototype */
{
/**
* @constructs
* @augments Gitana.AbstractPersistable
*
* @class Provides access to traversal results
*
* @param {Gitana.Branch} branch
* @param [Object] object
*/
constructor: function(branch, object)
{
if (!this._nodes)
{
this._nodes = {};
}
if (!this._associations)
{
this._associations = {};
}
if (!this._config)
{
this._config = {};
}
this.base(branch.getDriver(), object);
//////////////////////////////////////////////////////////////////////////////////////////////
//
// PRIVILEGED METHODS
//
//////////////////////////////////////////////////////////////////////////////////////////////
/**
* Gets the Gitana Repository object.
*
* @inner
*
* @returns {Gitana.Repository} The Gitana Repository object
*/
this.getRepository = function() { return branch.getRepository(); };
/**
* Gets the Gitana Repository id.
*
* @inner
*
* @returns {String} The Gitana Repository id
*/
this.getRepositoryId = function() { return branch.getRepository().getId(); };
/**
* Gets the Gitana Branch object.
*
* @inner
*
* @returns {Gitana.Branch} The Gitana Branch object
*/
this.getBranch = function() { return branch; };
/**
* Gets the Gitana Branch id.
*
* @inner
*
* @returns {String} The Gitana Branch id
*/
this.getBranchId = function() { return branch.getId(); };
},
clear: function()
{
// empty the nodes map
Gitana.deleteProperties(this._nodes, true);
// empty the associations map
Gitana.deleteProperties(this._associations, true);
// empty the config map
Gitana.deleteProperties(this._config, true);
},
/**
* @override
*
* @param response
*/
handleResponse: function(response)
{
this.clear();
this.handleSystemProperties(response);
// copy nodes and associations map values
Gitana.copyInto(this._nodes, response.nodes);
Gitana.copyInto(this._associations, response.associations);
// copy config
Gitana.copyInto(this._config, response.config);
// copy center node information
this._config["center"] = response.node;
},
/**
* Looks up the node around which this traversal is centered.
*/
center: function()
{
var chainable = this.getFactory().node(this.getBranch());
var result = this.subchain(chainable);
// push our logic to the front
result.subchain(this.getBranch()).readNode(this._config["center"]).then(function() {
result.handleResponse(this);
});
return result;
},
/**
* Counts the number of nodes in the traversal results
*
* @param callback
*/
nodeCount: function(callback)
{
return this.then(function() {
callback.call(this, Gitana.getNumberOfKeys(this._nodes));
});
},
/**
* Counts the number of associations in teh traversal results
*
* @param callback
*/
associationCount: function(callback)
{
return this.then(function() {
callback.call(this, Gitana.getNumberOfKeys(this._associations));
});
},
/**
* Hands back a map of all of the nodes in the traversal results
*
* @chained node map
*/
nodes: function()
{
var self = this;
// what we're handing back
var result = this.subchain(this.getFactory().nodeMap(this.getBranch()));
// preload some work and hand back
return result.then(function() {
var chain = this;
var response = {
"rows": self._nodes
};
chain.handleResponse(response);
});
},
/**
* Hands back a single node
*
* @chained node
*
* @param nodeId
*/
node: function(id)
{
var self = this;
// hand back a node but preload with work
var result = this.subchain(this.getFactory().node(this.getBranch()));
return result.then(function() {
var nodeObject = self._nodes[id];
if (!nodeObject) {
return self.missingNodeError(id);
}
this.handleResponse(nodeObject);
});
},
/**
* Hands back a map of all of the associations in the traversal results
*
* @chained node map
*/
associations: function()
{
var self = this;
// what we're handing back
var result = this.subchain(this.getFactory().nodeMap(this.getBranch()));
// preload some work and hand back
return result.then(function() {
var chain = this;
var response = {
"rows": self._associations
};
chain.handleResponse(response);
});
},
/**
* Hands back a single association.
*
* @chained association
*
* @param id
*/
association: function(id)
{
var self = this;
// hand back a node but preload with work
var result = this.subchain(this.getFactory().association(this.getBranch()));
return result.then(function() {
var associationObject = self._associations[id];
if (!associationObject) {
return self.missingNodeError(id);
}
this.handleResponse(associationObject);
});
}
});
})(window);