Reputation: 11
Hello,
I have an issue with saving data in my database, I can’t find the problem. TheQueryBuilder
forAnd-, Or- and OrAnd-Select
are the same. . I wrote theQueryBuilder
in code consecutively forAnd-select
,Or-select
andOrAnd-Select
in this exact order. Saving data inNosqlDb
works only forAnd- and OR-select
.But
OrAnd-select
fails to save. In the picture shown, you can see that the data in database doesn’t save. Data in databaseUser_DataDb
saves successfully. I would appreciate any help!Thank you in advance.
I get this error:
EXCEPTION: Uncaught (in promise): Error: Current operation has not been finished.
withLock@http://localhost:3000/main.bundle.js:21238:31 [angular]
_save@http://localhost:3000/main.bundle.js:11260:12 [angular]
update@http://localhost:3000/main.bundle.js:11097:12 [angular]
update@http://localhost:3000/main.bundle.js:12956:14 [angular]
ac_main</NoSqlComponent.prototype.submit/promise</</<@http://localhost:3000/main.bundle.js:29457:21 [angular]
onInvoke@http://localhost:3000/vendor.dll.js:30326:28 [angular]
polyfills_lib</</</Zone.prototype.run@http://localhost:3000/polyfills.dll.js:4133:24 [angular => angular]
scheduleResolveOrReject/<@http://localhost:3000/polyfills.dll.js:4720:52 [angular]
onInvokeTask@http://localhost:3000/vendor.dll.js:30317:28 [angular]
polyfills_lib</</</ZoneDelegate.prototype.invokeTask@http://localhost:3000/polyfills.dll.js:4373:17 [angular]
polyfills_lib</</</Zone.prototype.runTask@http://localhost:3000/polyfills.dll.js:4173:28 [<root> => angular]
drainMicroTaskQueue@http://localhost:3000/polyfills.dll.js:4553:25 [<root>]
ZoneTask/this.invoke@http://localhost:3000/polyfills.dll.js:4431:25 [<root>]
My code
/////////////// queryBuilder for And-Select
var queryBuilderAnd = db.NoSqlDB.find();
var techniques = queryBuilderAnd
.in('techniques', this.arrStrTchn);
var functional = queryBuilderAnd
.in('functional', this.arrStrFn);
var nonFunctional = queryBuilderAnd
.in('nonFunctional', this.arrStrNFn);
var promiseAnd = queryBuilderAnd.and(techniques, functional, nonFunctional)
.resultList()
.then((nosqlDbAnd) => {
console.log(nosqlDbAnd);
this.nosqlDbsAnd = nosqlDbAnd;
console.log("this.nosqlDbsAnd ", this.nosqlDbsAnd);
this.nosqlDbsAnd.forEach(
(and) => {
console.log("and: " + and.id);
db.NoSqlDB.find()
.equal('id', and.id)
.resultList((result) => {
result.forEach((todo) => {
and.select_and = JSON.parse(JSON.stringify(this.andselected));
if (and.users_and === null) {
and.users_and = new Set();
}
and.users_and.add(db.User.me);
return and.update();
});
});
new db.User_DataDb(
{
functional_select: this.functionalCatObj, nonfunctional_select: this.nfunctionalCatObj,
techniques_select: this.techniquesCatObj, functional_unselect: this.functionalUnsCatObj,
nonfunctional_unselect: this.nfunctionalCatObj, techniques_unselect: this.techniquesUnsCatObj,
ref_NosqlDbAnd: [and.id]
}).insert()
.then((todo1) => {
console.log("todo1.id: ", todo1.id);
db.User_DataDb.find()
.where({
'ref_NosqlDbAnd': and.id,
'id': todo1.id
})
.resultList((result) => {
result.forEach(
(todo2) => {
if (todo2.user_and === null) {
todo2.user_and = new Set();
}
todo2.user_and.add(db.User.me);
return todo2.save({ refresh: true });
});
});
});
});
});
/////////////// queryBuilder for OR-Select
var queryBuilderOr = db.NoSqlDB.find();
var techniques = queryBuilderOr
.in('techniques', this.arrStrTchn);
var functional = queryBuilderOr
.in('functional', this.arrStrFn);
var nonFunctional = queryBuilderOr
.in('nonFunctional', this.arrStrNFn);
var promiseOr = queryBuilderOr.or(techniques, functional, nonFunctional)
.resultList()
.then((nosqlDbOr) => {
console.log(nosqlDbOr);
this.nosqlDbsOr = nosqlDbOr;
console.log("this.nosqlDbsOr ", this.nosqlDbsOr);
this.nosqlDbsOr.forEach(
(or) => {
db.NoSqlDB.find()
.equal('id', or.id)
.resultList((result) => {
result.forEach((todo) => {
or.select_or = JSON.parse(JSON.stringify(this.orselected));
if (or.users_or === null) {
or.users_or = new Set();
}
or.users_or.add(db.User.me);
return or.update();
});
});
new db.User_DataDb(
{
functional_select: this.functionalCatObj, nonfunctional_select: this.nfunctionalCatObj,
techniques_select: this.techniquesCatObj, functional_unselect: this.functionalUnsCatObj,
nonfunctional_unselect: this.nfunctionalCatObj, techniques_unselect: this.techniquesUnsCatObj,
ref_NosqlDbOr: [or.id]
}).insert()
.then((todo1) => {
console.log("todo1.id: ", todo1.id);
db.User_DataDb.find()
.where({
'ref_NosqlDbOr': or.id,
'id': todo1.id
})
.resultList((result) => {
result.forEach(
(todo2) => {
if (todo2.user_or === null) {
todo2.user_or = new Set();
}
todo2.user_or.add(db.User.me);
return todo2.save({ refresh: true });
});
});
});
});
});
Upvotes: 0
Views: 128
Reputation: 176
I think your problem here is, that you try modifying an object wich you are saving at the same time. You should ensure that you modify and save the same object only once a time.
In addition, you should not load already loaded objects:
var promiseOr = queryBuilderOr.or(techniques, functional, nonFunctional)
.resultList()
.then((nosqlDbOr) => {
console.log(nosqlDbOr);
this.nosqlDbsOr = nosqlDbOr;
console.log("this.nosqlDbsOr ", this.nosqlDbsOr);
this.nosqlDbsOr.forEach((or) => {
//you do not need a db.NoSqlDB.find() here the object is already loaded
if (and.users_or === null) {
and.users_or = new Set();
}
or.users_or.add(db.User.me);
//You are selecting the same object in the different queries multiple times.
//Therfore do not update the objects in each of the resultList() callbacks
return or.update();
});
});
Upvotes: 0