All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prompto.intrinsic.RemoteStore.js Maven / Gradle / Ivy

There is a newer version: 0.1.57
Show newest version
function StoredDocument(categories) {
	this.category = categories;
    return this;
}


StoredDocument.prototype.getData = function(name) {
    return this.hasOwnProperty(name) ? this[name] : null;
};

StoredDocument.prototype.matches = function(predicate) {
    if(predicate==null)
        return true;
    else
        return predicate.matches(this);
};

function StorableDocument(categories, dbIdFactory) {
    if(!categories)
        throw new Error("!!!");
    this.category = categories;
    this.dbIdFactory = dbIdFactory;
    this.document = null;
    return this;
}


StorableDocument.prototype.isDirty = function() {
    return this.document!=null;
};

StorableDocument.prototype.clear = function() {
    this.document = null;
};

StorableDocument.prototype.getDbId = function() {
	return this.document ? (this.document.dbId || null) : null;
};


StorableDocument.prototype.getOrCreateDbId = function() {
	var dbId = this.getDbId();
	if(dbId==null) {
		if(this.dbIdFactory)
			dbId = this.dbIdFactory.provider();
       	if(dbId!=null) 
			this.setDbId(dbId);
		else {
			dbId = $DataStore.instance.nextDbId();
	        if(this.dbIdFactory)
	        	this.dbIdFactory.listener(dbId);
			this.setData("dbId", dbId, dbId);
        }
		
    }
    return dbId;
};


StorableDocument.prototype.setDbId = function(dbId) {
	if(this.document)
		this.document.dbId  = writeJSONValue(dbId, true);
};


StorableDocument.prototype.setData = function(name, value, dbId) {
    if(!this.document) {
        this.document = new StoredDocument(this.category);
        this.document.dbId = dbId || this.getOrCreateDbId();
    }
    this.document[name] = writeJSONValue(value, true);
};

StorableDocument.prototype.updateDbIds = function(dbIds) {
	Object.getOwnPropertyNames(this.document)
		.forEach(function(name) { this.updateDbId(dbIds, name); }, this);
};

StorableDocument.prototype.updateDbId = function(dbIds, name) {
	var value = this.document[name]; 
	if(value) {
		values = Array.isArray(value) ? value : [value]; };
		values.filter(function(value) { return value.tempDbId; }, this)
		.forEach(function(value) { 
			var dbId = dbIds[value.tempDbId];
			if(dbId) {
				this.document[name] = dbId;
				if(name==="dbId" && this.dbIdFactory)
					this.dbIdFactory.listener(dbId);
			} 
		}, this);
};


function recordToStored(record) {
	if(record==null)
		return null;
	else {
		var stored = new StoredDocument([record.type]);
		Object.getOwnPropertyNames(record.value)
			.forEach(function(name) {
				var value = record.value[name];
				stored[name] = readJSONValue(value);
			});
		return stored;
	}
};

function StoredIterable(records) {
	this.count = function() { return records.count; };
	this.totalCount = function() { return records.totalCount; };
	this.iterator = function() {
		var index = 0;
		return {
			hasNext: function() { return index < records.count; },
			next: function() { 
				var record = records.value[index++];
				return recordToStored(record);
			}
		};
	}
	return this;
}

function RemoteStore() {
	this.lastDbId = 0;
	this.nextDbId = function() {
		tempDbId = --this.lastDbId;
		return { tempDbId: tempDbId, getText: function() { return "" + tempDbId; } };
	};
	this.newStorableDocument = function(categories, dbIdFactory) {
		return new StorableDocument(categories, dbIdFactory);
	};
	this.newQueryBuilder = function() {
		return new RemoteQueryBuilder();
	};
	this.fetchSync = function(url, body) {
		var response = null;
		var request  = new XMLHttpRequest();
		request.open("POST", url, false); // must be synchronous
		if(!(body instanceof FormData))
			request.setRequestHeader("Content-type", "application/json; charset=utf-8");
		request.onload = function() { 
			if (this.status == 200)
				response = JSON.parse(this.responseText); 
			else
				throw new Error(this.statusText);
		};
		request.onerror = function() {
			throw this.error;
		};
		request.send(body);
		return response;
	};
	this.fetchAsync = function(url, body, onLoad) {
		var request  = new XMLHttpRequest();
		request.open("POST", url, true);
		if(!(body instanceof FormData))
			request.setRequestHeader("Content-type", "application/json; charset=utf-8");
		request.onload = function() { 
			if (this.status == 200) {
				response = JSON.parse(this.responseText); 
				onLoad(response);
			}
			else
				throw new Error(this.statusText);
		};
		request.onerror = function() {
			throw this.error;
		};
		request.send(body);
	};
	this.convertStorables = function(toStore, formData) {
		return Array.from(toStore).map(function(storable) { return this.convertStorable(storable, formData); }, this);
	};
	this.convertStorable = function(storable, formData) {
		var doc = storable.document; 
	 	if(typeof(doc.dbId) === "object" && !doc.dbId.tempDbId && (!doc.dbId.type || !doc.dbId.value)) {
	 		doc.dbId = doc.dbId.toString();
	 	}
		Object.getOwnPropertyNames(doc).map(function(key) {
			var data = doc[key];
			if(data && (data.type==="Image" || data.type==="Blob")) {
				value = data.value;
				if(value) {
					if (value.binaryFile) {
						value.partName = '@' + value.binaryFile.name;
						formData.append(value.partName, value.binaryFile);
					} else if (value.url)
						delete doc[key]; // the binary was not modified
				}
			}
		});
	 	return doc;
	};
	this.cleanupStorable = function(storable) {
		var doc = storable.document; 
		Object.getOwnPropertyNames(doc).forEach(function(key) {
			var data = doc[key];
			if(data && (data.type==="Image" || data.type==="Blob")) {
				if(data.value && data.value.binaryFile)
					delete data.value.binaryFile;
			}
		});
	}
	this.prepareStore = function(toDel, toStore, withMeta) {
		var formData = new FormData();
		if(toDel)
			formData.append("toDelete", JSON.stringify(toDel));
		if(toStore) {
			toStore = this.convertStorables(toStore, formData);
			formData.append("toStore", JSON.stringify(toStore));
		}
		if(withMeta) {
			var json = writeJSONValue(withMeta, false, formData);
			formData.append("withMeta", JSON.stringify(json));
		}
			
		return formData;
	};
	this.deleteAndStore = function(toDel, toStore, withMeta) {
		var formData = this.prepareStore(toDel, toStore, withMeta);
		var response = this.fetchSync("/ws/store/deleteAndStore", formData);
		if(toStore)
			toStore.forEach(function(storable) { 
				this.cleanupStorable(storable);
				storable.updateDbIds(response.data); 
			}, this);
	};
	this.deleteAndStoreAsync = function(toDel, toStore, withMeta, andThen) {
		var formData = this.prepareStore(toDel, toStore, withMeta);
		this.fetchAsync("/ws/store/deleteAndStore", formData, function(response) {
			if(toStore)
				toStore.forEach(function(storable) { 
					this.cleanupStorable(storable);
					storable.updateDbIds(response.data); 
				}, this);
			andThen();
		}.bind(this));
	};
	this.fetchOne = function(query) {
		var response = this.fetchSync("/ws/store/fetchOne", JSON.stringify(query));
		return recordToStored(response.data);
	};
	this.fetchOneAsync = function(query, andThen) {
		this.fetchAsync("/ws/store/fetchOne", JSON.stringify(query), function(response) {
			record = recordToStored(response.data);
			andThen(record);
		});

	};
	this.fetchMany = function(query, mutable) {
		var response = this.fetchSync("/ws/store/fetchMany", JSON.stringify(query));
		var iterable = new StoredIterable(response.data);
		return new Cursor(mutable, iterable);
	};
	this.fetchManyAsync = function(query, mutable, andThen) {
		this.fetchAsync("/ws/store/fetchMany", JSON.stringify(query), function(response) {
			var iterable = new StoredIterable(response.data);
			var cursor = new Cursor(mutable, iterable);
			andThen(cursor);
		});
	};
	this.nextSequenceValue = function(name) {
		return RemoteRunner.runSync("nextSequenceValue", [{type: "Text", name: "name", value: name}]);
	};
	this.isAuditEnabled = function() {
		return RemoteRunner.runSync("isAuditEnabled", []);
	};
	this.fetchLatestAuditMetadataId = function(dbId) {
		return RemoteRunner.runSync("fetchLatestAuditMetadataId", [{type: "DbId", name: "dbId", value: dbId}]);
	};
	this.fetchAllAuditMetadataIds = function(dbId) {
		return RemoteRunner.runSync("fetchAllAuditMetadataIds", [{type: "DbId", name: "dbId", value: dbId}]);
	};
	this.fetchAuditMetadataAsDocument = function(dbId) {
		return RemoteRunner.runSync("fetchAuditMetadata", [{type: "DbId", name: "dbId", value: dbId}]);
	};
	this.fetchDbIdsAffectedByAuditMetadataId = function(dbId) {
		return RemoteRunner.runSync("fetchDbIdsAffectedByAuditMetadataId", [{type: "DbId", name: "dbId", value: dbId}]);
	};
	this.fetchLatestAuditRecordAsDocument = function(dbId) {
		return RemoteRunner.runSync("fetchLatestAuditRecord", [{type: "DbId", name: "dbId", value: dbId}]);
	};
	this.fetchAllAuditRecordsAsDocuments = function(dbId) {
		return RemoteRunner.runSync("fetchAllAuditRecords", [{type: "DbId", name: "dbId", value: dbId}]);
	};
	this.deleteAuditRecord = function(dbId) {
		return RemoteRunner.runSync("deleteAuditRecord", [{type: "DbId", name: "dbId", value: dbId}]);
	};
	this.deleteAuditMetadata = function(dbId) {
		return RemoteRunner.runSync("deleteAuditMetadata", [{type: "DbId", name: "dbId", value: dbId}]);
	};
	this.fetchAuditRecordsMatchingAsDocuments = function(auditPredicates, instancePredicates) {
		return RemoteRunner.runSync("fetchAuditRecordsMatching", [{type: "Document", name: "auditPredicates", value: auditPredicates},
			{type: "Document", name: "instancePredicates", value: instancePredicates}]);
	};
	
}

function RemoteQueryBuilder() {
    this.predicates = null;
    this.first = null;
    this.last = null;
    this.projection = null;
    this.orderBys = null;
	return this;
}

RemoteQueryBuilder.prototype.verify = function(fieldInfo, matchOp, value) {
    if(this.predicates==null)
        this.predicates = [];
    this.predicates.push(new MatchPredicate(fieldInfo, matchOp, value));
};

RemoteQueryBuilder.prototype.and = function() {
    var right = this.predicates.pop();
    var left = this.predicates.pop();
    this.predicates.push(new AndPredicate(left, right));
};

RemoteQueryBuilder.prototype.or = function() {
    var right = this.predicates.pop();
    var left = this.predicates.pop();
    this.predicates.push(new OrPredicate(left, right));
};

RemoteQueryBuilder.prototype.not = function() {
    var top = this.predicates.pop();
    this.predicates.push(new NotPredicate(top));
};


RemoteQueryBuilder.prototype.setFirst = function(value) {
    this.first = value;
};

RemoteQueryBuilder.prototype.setLast = function(value) {
    this.last = value;
};


RemoteQueryBuilder.prototype.build = function() {
    return {
        predicate: this.predicates==null ? null : this.predicates.pop(),
        first: this.first,
        last: this.last,
        projection : this.projection,
        orderBys : this.orderBys
    };
};

RemoteQueryBuilder.prototype.project = function(projection) {
    this.projection = projection;
};

RemoteQueryBuilder.prototype.addOrderByClause = function(info, descending) {
    if (this.orderBys == null)
        this.orderBys = [];
    this.orderBys.push({info: info, descending: descending});
};

function AndPredicate(left, right) {
	this.type = "AndPredicate";
    this.left = left;
    this.right = right;
    return this;
}

function OrPredicate(left, right) {
	this.type = "OrPredicate";
    this.left = left;
    this.right = right;
    return this;
}

function NotPredicate(predicate) {
	this.type = "NotPredicate";
    this.predicate = predicate;
    return this;
}

function MatchPredicate(info, matchOp, value) {
	this.type = "MatchPredicate";
    this.info = info;
    this.matchOp = MatchOp[matchOp.name];
    this.value = writeJSONValue(value, true);
    return this;
}



$DataStore.instance = new RemoteStore();




© 2015 - 2024 Weber Informatics LLC | Privacy Policy