linagirl / related Goto Github PK
View Code? Open in Web Editor NEWUnopinionated ORM for relational databases.
Home Page: https://www.npmjs.com/package/related
License: MIT License
Unopinionated ORM for relational databases.
Home Page: https://www.npmjs.com/package/related
License: MIT License
related sets must be reloaded if they're saved
ORM.not('2034');
SELECT "event".* FROM "eventbooster"."event" INNER JOIN "eventbooster"."eventdata" as "eventdata1" ON "event"."id"="eventdata1"."id_event" WHERE "eventdata1"."id_venue" is not '2034' LIMIT 10;
error:
syntax error at or near "'2034'"
It'll be nice to be able to use the concat
method on your collections.
Javascript does not recognize your relations as Array
and does therefore not provide the expected behavior (see Array.prototype.concat).
@tobiaskneubuehler is this the correct issue description?
this should work
query.getSub()...
query.getSub()...
query.find...
Consider the following query (sale_variant is a mapping table)
orm .shop(['*'], { id: 1})
.fetchAccount(['*'])
.getSale(['*'])
.fetchSale_variant(['*']);
I try to remove a variant from inside the sale object (sale is an extended model):
// Sale.js
removeVariant: function(index){
this.sale_variant.splice(index, 1);
}
Logging the sale_variant
shows me that the corresponding variant is gone. I save the sale object:
sale.save(cb);
The entries in the database show me that the removed relation was excluded from the updates (based on an updated
timestamp), but it is still there and not deleted as expected (as advertised by you ;))
currently the prepare method calls eventlisteners of the extensions which may throw errors. this needs to be converted to a promise based async process which allows to handle errors properly
Currently item loaded via transactions won't be saved using the same transaction.
works:
var query = this.root.user(['*']);
query.getAccessToken().getRequestToken({token: tokenValue});
query.getRole(['*']).getControllerAction(['*']).fetchControllerActionName(['*']).getController(['*']).getService(['*']).getApplication(['*']);
doesn`t work
var query = this.root.user(['*']).fetchUserProfile(['*']).fetchUserLoginEmail(['*']);
query.getAccessToken().getRequestToken({token: tokenValue});
query.getRole(['*']).getControllerAction(['*']).fetchControllerActionName(['*']).getController(['*']).getService(['*']).getApplication(['*']);
SELECT "user".* FROM "eventbooster"."user" INNER JOIN "eventbooster"."accessToken" as "accessToken" ON "user"."id"="accessToken"."id_user" INNER JOIN "eventbooster"."accessToken" as "accessToken3" ON "user"."id"="accessToken3"."id_user" INNER JOIN "eventbooster"."requestToken" as "requestToken4" ON "accessToken3"."id"="requestToken4"."id_accessToken" INNER JOIN "eventbooster"."requestToken" as "requestToken" ON "accessToken"."id"="requestToken"."id_accessToken" WHERE ( AND "requestToken4"."token" = 'xxx' AND ) LIMIT 1;
the querybuilder doesn't currently not evaluate Extension API events
fix the limit issue (postgres doesn't support limit on deletes).
instead of limiting the delete i need to create a select with an appropriate filter which then is used to select the records which shcould be deleted. the select can be limited.
the issue joinbox/eb-service-eventdata#1 is partially caused by this issue
value: ORM.in([]) results in query "entity"."value" false
this is a sql-error
sql is:
is 'NULL'
sql should:
is NULL
queries should support queries (subqueries) as their parameters
example:
orm.requestToken([''],{token: requestToken}).getAccessToken(['']).getUser(['*']);
output queries:
20 20:29:49.117 > nm:/ee-mysql-connection/lib/MySQLConnection.js 131:5, Object.module.exports.Class._query >>> SELECT `requestToken`.*, `requestToken`.`id_accessToken`, `requestToken`.`id` FROM `cce`.`requestToken` WHERE `requestToken`.`token` = 'fefb283a297327723d40927b6c7d9c68c7dca6887633a0548d5dddceae55d4049b96a33f1dfa394908dceb3f65bb8af926d455c1d2a7d7f8992c23a29f1dc2dd' LIMIT 1;
20 20:29:49.119 > nm:/ee-mysql-connection/lib/MySQLConnection.js 137:6, Query._callback >>> query took «1» msec ...
20 20:29:49.121 > nm:/ee-mysql-connection/lib/MySQLConnection.js 138:51, Query._callback >>> query returned «1» rows ...
20 20:29:49.122 > nm:/ee-mysql-connection/lib/MySQLConnection.js 140:6, Query._callback >>> null
20 20:29:49.126 > nm:/ee-mysql-connection/lib/MySQLConnection.js 131:5, Object.module.exports.Class._query >>> SELECT `accessToken`.*, `accessToken`.`id`, `accessToken`.`id`, `requestToken`.`id_accessToken` as ____id____, `accessToken`.`id_user` FROM `cce`.`accessToken` INNER JOIN `cce`.`requestToken` as `requestToken` ON `accessToken`.`id`=`requestToken`.`id_accessToken` WHERE (`requestToken`.`token` = 'fefb283a297327723d40927b6c7d9c68c7dca6887633a0548d5dddceae55d4049b96a33f1dfa394908dceb3f65bb8af926d455c1d2a7d7f8992c23a29f1dc2dd' AND `requestToken`.`id_accessToken` IN (2)) GROUP BY `accessToken`.`id`, `requestToken`.`id_accessToken`;
20 20:29:49.128 > nm:/ee-mysql-connection/lib/MySQLConnection.js 131:5, Object.module.exports.Class._query >>> SELECT `user`.*, `user`.`id`, `user`.`id`, `accessToken`.`id_user` as ____id____ FROM `cce`.`user` INNER JOIN `cce`.`accessToken` as `accessToken` ON `user`.`id`=`accessToken`.`id_user` INNER JOIN `cce`.`requestToken` as `requestToken` ON `accessToken`.`id`=`requestToken`.`id_accessToken` WHERE (`requestToken`.`token` = 'fefb283a297327723d40927b6c7d9c68c7dca6887633a0548d5dddceae55d4049b96a33f1dfa394908dceb3f65bb8af926d455c1d2a7d7f8992c23a29f1dc2dd' AND `requestToken`.`id_user` IN (NULL)) GROUP BY `user`.`id`, `requestToken`.`id_user`;
db.eventDataHierarchy([ORM.max('hierarchy')]).getEventDataConfig().getEventData().getEvent({id: ORM.reference('event', 'id')});
situation database:
add a product to a cart (cart has no products so far) works:
add one more product to cart don`t works:
there is probably a bug wen using transactions, connections are marked as unusable but not closed porperly
TypeError: Object # has no method 'setDeleteMode'
at Object.module.exports.Class [as delete](/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/ee-orm/lib/QueryCompiler.js:60:28)
at Object.module.exports.Class [as delete](/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/ee-orm/lib/QueryBuilder.js:630:22)
at Object.module.exports.Class [as delete](/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/eb-service-shopping/node_modules/ee-soa-service/lib/DefaultORMController.js:716:95)
at Object.module.exports.Class._deleteAction (/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/eb-service-shopping/node_modules/ee-soa-service/lib/Service.js:116:62)
at Object.module.exports.Class._request (/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/eb-service-shopping/node_modules/ee-soa-service/lib/DefaultService.js:151:47)
at Object. (/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/eb-service-shopping/node_modules/ee-soa-service/lib/DefaultService.js:102:34)
at Object.module.exports.Class.nextRequest (/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/eb-service-shopping/node_modules/ee-soa-service/lib/DefaultService.js:132:17)
at Object.module.exports.Class.request (/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/eb-service-shopping/node_modules/ee-soa-service/lib/DefaultService.js:136:22)
at Object.module.exports.Class.request (/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/ee-soa/node_modules/ee-soa-service-manager/lib/ServiceManager.js:41:54)
at Object.module.exports.Class._handleRequest (/Users/fabianjordi/Desktop/Eventbooster/Tenants/Cornèrcard Emotions - World of Entertainment/Web/Code/cornercard-frontend/node_modules/eb-soa/node_modules/ee-soa/lib/SOA.js:58:31)
this should filter the localeTable, but it doesn`t.
error: 'column eventDataLocale3.language does not exist'
var query = this.orm.eventbooster.event(['*'], {
startdate: this.ormObject.and(this.ormObject.gt(startdate), this.ormObject.lt(enddate))
}).limit(100).fetchEventType(['*']);
var edQuery = query.getEventData(['*'], {
id_venueFloor: this.ormObject.notNull()
});
edQuery.getEventDataLocale(['*'], {
language: this.orm.eventbooster.language(['id'], {code: 'de'})
});
edQuery.getCategory(['*']).getCategoryLocale(['*'], {
language: this.orm.eventbooster.language(['id'], {code: 'de'})
});
edQuery.getVenueFloor(['*']).getVenue(['*']).fetchCity({
zip: zip
}).getTag(['*']);
query.order('startdate');
query.find(function(err, list) {
if (err) return callback(err);
callback(null, list);
}.bind(this));
values are currently stored on a separate hiden objeect, this makes it impossible to log db models. fix that!
return this.db.venue('*', {reviewStatus: this.db.reviewStatus({identifier: 'readyForImport'})})
.getVenueFloor()
.getEventData({id: eventDataId})
.update({
id_reviewStatus : reviewStatus.id
});
results in:
UPDATE
"eventbooster"."personGroup"
SET
"id_reviewStatus" = '1'
WHERE
"personGroup"."id" IN(
SELECT
"personGroup"."id"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."name" IN(
SELECT
"personGroup"."name"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."websiteURL" IN(
SELECT
"personGroup"."websiteURL"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."created" IN(
SELECT
"personGroup"."created"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."updated" IN(
SELECT
"personGroup"."updated"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."deleted" IN(
SELECT
"personGroup"."deleted"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."twitter" IN(
SELECT
"personGroup"."twitter"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."facebook" IN(
SELECT
"personGroup"."facebook"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."id_country" IN(
SELECT
"personGroup"."id_country"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."founded" IN(
SELECT
"personGroup"."founded"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."splitup" IN(
SELECT
"personGroup"."splitup"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
AND "personGroup"."id_reviewStatus" IN(
SELECT
"personGroup"."id_reviewStatus"
FROM
"eventbooster"."personGroup"
LEFT JOIN
"eventbooster"."eventData_personGroup" as "eventData_personGroup1"
ON "personGroup"."id"="eventData_personGroup1"."id_personGroup"
LEFT JOIN
"eventbooster"."eventData" as "eventData1"
ON "eventData_personGroup1"."id_eventData"="eventData1"."id"
WHERE
(
"personGroup"."id_reviewStatus" = (
SELECT
"reviewStatus"."id"
FROM
"eventbooster"."reviewStatus"
WHERE
(
"reviewStatus"."identifier" = 'readyForImport'
AND "reviewStatus"."deleted" is null
)
)
AND "eventData1"."id" = '1095743'
)
)
How can I do a self join?
We need a type system with one level of sub-/supertypes, therefore we maintain a foreign key to the table itself. Consider the following example (same for getType
):
orm.type('*').fetchType('*').find(...);
Creates an error table name "type" specified more than once
caused by the following statement
SELECT "type".*, "type"."id_type" as ____id____
FROM "public"."type"
INNER JOIN "public"."type" ON "type"."id"="type"."id_type"
WHERE "type"."id" IN ('1', '2')
GROUP BY "type"."id", "type"."id";
Using the method joinType
seems to work, but does not resolve the supertype as expected (type is undefined
):
orm.type('*').joinType('*').find(function(err, types){
types.forEach(function(type){
log(type.type);
});
});
I tried to rename the foreign key and the referencing column without success.
working:
not working:
is:
var e = new orm.database.entity();
e.save(...);
INSERT INTO "database"."entity" () VALUES () RETURNING "id";
should:
INSERT INTO "database"."entity" RETURNING "id";
TypeError: undefined is not a function
on QueryBuilder.js line 550.
as example on:
this._db.service_role({
service: this._db.service({identifier: roleName})
, id_role: role.id
}).findOne()
It would be a great help to be able to log the queries for a certain transaction or query e.g.
orm.product('*').fetchVariant('*').enableQueryLog().find(...);
or be able to see the resulting SQL
statement e.g.
log(orm.product('*').fetchVariant('*').toSql());
Currently, if the before{event} aborts the process the after{event} is only called when the event equals «delete». Need to implement this on all other events
for example, a date strring should be converted to a date object.
ORM does:
UPDATE table SET field1 = value1 field2 = value2 ...
ORM should:
UPDATE table SET field1 = value1, field2 = value2 ...
It should be possible to insert null into a row that can be NULL.
Example:
new this.targetSchema.event({
id_parent: null
}).save();
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.