118 lines
4.1 KiB
JavaScript
118 lines
4.1 KiB
JavaScript
/*
|
|
Copyright (c) 2014, Oracle and/or its affiliates. All rights
|
|
reserved.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; version 2 of
|
|
the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
02110-1301 USA
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
var udebug = unified_debug.getLogger("Projection.js"),
|
|
path = require("path"),
|
|
doc = require(path.join(mynode.fs.api_doc_dir, "Projection"));
|
|
|
|
function Projection(domainObject) {
|
|
if (typeof domainObject === 'function') {
|
|
this.domainObject = domainObject;
|
|
this.name = 'no-name';
|
|
this.validated = false; // this projection has not been validated or has changed since validation
|
|
this.id = 0; // initial value for projection id; when validated it will be 1
|
|
this.fields = [];
|
|
this.relationships = {};
|
|
this.usedBy = [];
|
|
this.error = '';
|
|
} else {
|
|
this.error = 'The parameter of Projection constructor must be a domain object (constructor function).';
|
|
}
|
|
}
|
|
|
|
/** Invalidate this projection and all projections used by this projection.
|
|
* The function recursively adds projections used by this projection
|
|
* and invalidates them one by one. The parameter is modified by this function.
|
|
* @param toBeInvalidated an array of projections to be invalidated.
|
|
*/
|
|
function invalidateAll(toBeInvalidated) {
|
|
if (toBeInvalidated.length === 0) {
|
|
return;
|
|
}
|
|
var projection = toBeInvalidated.shift();
|
|
projection.validated = false;
|
|
projection.usedBy.forEach(function(used) {
|
|
toBeInvalidated.push(used);
|
|
});
|
|
invalidateAll(toBeInvalidated);
|
|
}
|
|
|
|
Projection.prototype.addFields = function() {
|
|
var projection = this;
|
|
var toBeInvalidated = [this];
|
|
invalidateAll(toBeInvalidated);
|
|
var i, j;
|
|
var argument;
|
|
var field;
|
|
// iterate the arguments of the function
|
|
for (i = 0; i < arguments.length; ++i) {
|
|
argument = arguments[i];
|
|
if (typeof argument === 'string') {
|
|
projection.fields.push(argument);
|
|
} else if (Array.isArray(argument)) {
|
|
for (j = 0; j < argument.length; ++j) {
|
|
field = argument[j];
|
|
if (typeof field === 'string') {
|
|
projection.fields.push(field);
|
|
} else {
|
|
projection.error += '\nError in addFields for ' + projection.domainObject.prototype.constructor.name +
|
|
' Field names must be strings or arrays of strings ' + field;
|
|
}
|
|
}
|
|
} else {
|
|
projection.error += '\nError in addFields for ' + projection.domainObject.prototype.constructor.name +
|
|
' Field names must be strings or arrays of strings ' + argument;
|
|
}
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
/** addField is an alias for addFields for usability */
|
|
Projection.prototype.addField = Projection.prototype.addFields;
|
|
|
|
Projection.prototype.addRelationship = function(fieldName, relationshipProjection) {
|
|
var projection = this;
|
|
var toBeInvalidated = [this];
|
|
invalidateAll(toBeInvalidated);
|
|
var errors = '';
|
|
if (typeof fieldName !== 'string') {
|
|
projection.error += '\nError in addRelationship for ' + projection.domainObject.prototype.constructor.name +
|
|
'fieldName must be a string ' + fieldName;
|
|
}
|
|
if (typeof relationshipProjection !== 'object' ||
|
|
relationshipProjection.constructor.name !== 'Projection') {
|
|
projection.error += '\nError in addRelationship for ' + projection.domainObject.prototype.constructor.name +
|
|
' parameter relationshipProjection must be a projection for field ' + fieldName;
|
|
}
|
|
if (!projection.error) {
|
|
projection.relationships[fieldName] = relationshipProjection;
|
|
// establish the used-by relationship
|
|
relationshipProjection.usedBy.push(this);
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
/* Public exports of this module: */
|
|
exports.Projection = Projection;
|