Skip to content

Instantly share code, notes, and snippets.

@kommander
Created October 1, 2011 23:11
Show Gist options
  • Save kommander/1256787 to your computer and use it in GitHub Desktop.
Save kommander/1256787 to your computer and use it in GitHub Desktop.
A patch to add multi level prefetch to persistencejs, a javascript ORM.
From b6b903a3f6f9c1d5113bf98baab12bbfa009dadf Mon Sep 17 00:00:00 2001
From: Sebastian Herrlinger <sebastian@formzoo.com>
Date: Fri, 16 Sep 2011 13:36:58 -0700
Subject: [PATCH 1/3] Hack: Multi Level Prefetch
---
lib/persistence.store.sql.js | 34 +++++++++++++++++++++++++++++-----
1 files changed, 29 insertions(+), 5 deletions(-)
mode change 100644 => 100755 lib/persistence.store.sql.js
diff --git a/lib/persistence.store.sql.js b/lib/persistence.store.sql.js
old mode 100644
new mode 100755
index 70916cc..5d68b99
--- a/lib/persistence.store.sql.js
+++ b/lib/persistence.store.sql.js
@@ -644,15 +644,28 @@ function config(persistence, dialect) {
joinSql += this._additionalJoinSqls.join(' ');
for ( var i = 0; i < this._prefetchFields.length; i++) {
- var prefetchField = this._prefetchFields[i];
- var thisMeta = meta.hasOne[prefetchField].type.meta;
+ console.log(this._prefetchFields[i]);
+ var prefetchFieldParts = this._prefetchFields[i].split('.');
+ var prefetchField = prefetchFieldParts[0];
+ var eName = entityName;
+ //console.log(prefetchField, eName);
+ if(prefetchFieldParts.length > 1){
+ prefetchField = prefetchFieldParts[1];
+ eName = prefetchFieldParts[0];
+ }
+ var theMeta = persistence.getMeta(eName);
+ var thisMeta = theMeta.hasOne[prefetchField].type.meta;
if (thisMeta.isMixin)
throw new Error("cannot prefetch a mixin");
var tableAlias = thisMeta.name + '_' + prefetchField + "_tbl";
+ var PrefetchFrom = mainAlias;
+ if(prefetchFieldParts.length > 1){
+ PrefetchFrom = eName + '_' + eName + "_tbl";;
+ }
selectFields = selectFields.concat(selectAll(thisMeta, tableAlias,
prefetchField + "_"));
joinSql += "LEFT JOIN `" + thisMeta.name + "` AS `" + tableAlias
- + "` ON `" + tableAlias + "`.`id` = `" + mainAlias + '`.`' + prefetchField + "` ";
+ + "` ON `" + tableAlias + "`.`id` = `" + PrefetchFrom + '`.`' + prefetchField + "` ";
}
@@ -690,8 +703,19 @@ function config(persistence, dialect) {
var r = rows[i];
var e = rowToEntity(session, entityName, r, mainPrefix);
for ( var j = 0; j < that._prefetchFields.length; j++) {
- var prefetchField = that._prefetchFields[j];
- var thisMeta = meta.hasOne[prefetchField].type.meta;
+
+ console.log(that._prefetchFields[j]);
+ var prefetchFieldParts = that._prefetchFields[j].split('.');
+ var prefetchField = prefetchFieldParts[0];
+ var eName = entityName;
+ if(prefetchFieldParts.length > 1){
+ prefetchField = prefetchFieldParts[1];
+ eName = prefetchFieldParts[0];
+ }
+ var theMeta = persistence.getMeta(eName);
+ var thisMeta = theMeta.hasOne[prefetchField].type.meta;
+
+ console.log(thisMeta.name, prefetchField, eName);
e._data_obj[prefetchField] = rowToEntity(session, thisMeta.name, r, prefetchField + '_');
session.add(e._data_obj[prefetchField]);
}
--
1.7.0.4
From f33ca4f57e22b751ae5e49f230ece5fdd4adb5ee Mon Sep 17 00:00:00 2001
From: Sebastian Herrlinger <sebastian@formzoo.com>
Date: Fri, 16 Sep 2011 13:40:58 -0700
Subject: [PATCH 2/3] removed hack output
---
lib/persistence.store.sql.js | 4 ----
1 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/lib/persistence.store.sql.js b/lib/persistence.store.sql.js
index 5d68b99..6f0da49 100755
--- a/lib/persistence.store.sql.js
+++ b/lib/persistence.store.sql.js
@@ -644,11 +644,9 @@ function config(persistence, dialect) {
joinSql += this._additionalJoinSqls.join(' ');
for ( var i = 0; i < this._prefetchFields.length; i++) {
- console.log(this._prefetchFields[i]);
var prefetchFieldParts = this._prefetchFields[i].split('.');
var prefetchField = prefetchFieldParts[0];
var eName = entityName;
- //console.log(prefetchField, eName);
if(prefetchFieldParts.length > 1){
prefetchField = prefetchFieldParts[1];
eName = prefetchFieldParts[0];
@@ -704,7 +702,6 @@ function config(persistence, dialect) {
var e = rowToEntity(session, entityName, r, mainPrefix);
for ( var j = 0; j < that._prefetchFields.length; j++) {
- console.log(that._prefetchFields[j]);
var prefetchFieldParts = that._prefetchFields[j].split('.');
var prefetchField = prefetchFieldParts[0];
var eName = entityName;
@@ -715,7 +712,6 @@ function config(persistence, dialect) {
var theMeta = persistence.getMeta(eName);
var thisMeta = theMeta.hasOne[prefetchField].type.meta;
- console.log(thisMeta.name, prefetchField, eName);
e._data_obj[prefetchField] = rowToEntity(session, thisMeta.name, r, prefetchField + '_');
session.add(e._data_obj[prefetchField]);
}
--
1.7.0.4
From be9e2a5dac5018cac12f3da12c138e3435b8f68f Mon Sep 17 00:00:00 2001
From: Sebastian Herrlinger <sebastian@formzoo.com>
Date: Wed, 21 Sep 2011 16:42:10 -0700
Subject: [PATCH 3/3] Remove debug output
---
lib/persistence.js | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
mode change 100644 => 100755 lib/persistence.js
diff --git a/lib/persistence.js b/lib/persistence.js
old mode 100644
new mode 100755
index 217fe14..53daae8
--- a/lib/persistence.js
+++ b/lib/persistence.js
@@ -442,7 +442,6 @@ persistence.get = function(arg1, arg2) {
}
}
if(oldValueObj) {
- console.log("OldValue", oldValueObj);
var inverse = oldValueObj[meta.hasOne[ref].inverseProperty];
if(inverse.list && inverse._filter) {
inverse.triggerEvent('change', that, ref, val);
--
1.7.0.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment