Created
August 10, 2011 17:26
-
-
Save aseemk/1137523 to your computer and use it in GitHub Desktop.
Streamline bug: more duplicate executions?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var __global = typeof global !== 'undefined' ? global : window; | |
function __cb(_, fn){ var ctx = __global.__context; return function(err, result){ __global.__context = ctx; if (err) return _(err); try { return fn(null, result); } catch (ex) { return __propagate(_, ex); } } } | |
function __future(fn, args, i){ var done, err, result; var cb = function(e, r){ done = true; err = e, result = r; }; args = Array.prototype.slice.call(args); args[i] = function(e, r){ cb(e, r); }; fn.apply(this, args); return function(_){ if (done) _.call(this, err, result); else cb = _.bind(this); } .bind(this); } | |
function __nt(_, fn){ var i = 0; var cb = __cb(_, fn); var safeCb = function(){ try { cb(); } catch (ex) { __propagate(cb, ex); } }; if (typeof process != "undefined" && typeof process.nextTick == "function") return function(){ if (++i % 20 == 0) process.nextTick(safeCb); else cb(); }; else return function(){ if (++i % 20 == 0) setTimeout(safeCb); else cb(); }; } | |
function __propagate(_, err){ try { _(err); } catch (ex) { __trap(ex); } } | |
function __trap(err){ if (err) { if (__global.__context && __global.__context.errorHandler) __global.__context.errorHandler(err); else console.error("UNCAUGHT EXCEPTION: " + err.message + "\n" + err.stack); } } | |
/* 1 */ var FollowEvent; | |
/* 2 */ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { | |
/* 3 */ for (var key in parent) { | |
/* 3 */ if (__hasProp.call(parent, key)) { | |
/* 3 */ child[key] = parent[key]; | |
}; | |
}; | |
/* 4 */ function ctor() { | |
/* 4 */ this.constructor = child; | |
}; | |
/* 5 */ ctor.prototype = parent.prototype; | |
/* 6 */ child.prototype = new ctor; | |
/* 7 */ child.__super__ = parent.prototype; | |
/* 8 */ return child; | |
/* 9 */ }, __bind = function(fn, me) { | |
/* 9 */ return function() { | |
/* 9 */ return fn.apply(me, arguments); | |
}; | |
}; | |
/* 10 */ module.exports = FollowEvent = (function() { | |
/* 11 */ __extends(FollowEvent, Event); | |
/* 12 */ function FollowEvent() { | |
/* 13 */ FollowEvent.__super__.constructor.apply(this, arguments); | |
}; | |
/* 15 */ FollowEvent.prototype["delete"] = function __1(_, force) { | |
if (!_) { | |
return __future.call(this, __1, arguments, 0); | |
} | |
; | |
var deleteRel, __this = this, __arguments = arguments; | |
/* 17 */ if ((force == null)) { | |
/* 18 */ force = false; | |
} | |
; | |
/* 20 */ console.log((("about to delete follow " + __this) + "...")); | |
/* 21 */ deleteRel = __bind(function __1(rel, _) { | |
if (!_) { | |
return __future.call(this, __1, arguments, 1); | |
} | |
; | |
var rels, _i, _len, _results, __this = this; | |
/* 23 */ return __this._getRelationships(rel, __cb(_, function(__0, __1) { | |
/* 23 */ rels = __1; | |
/* 24 */ _results = []; | |
/* 25 */ _i = 0; | |
/* 25 */ _len = rels.length; | |
var __5 = false; | |
return (function(__break) { | |
var __loop = __nt(_, function() { | |
if (__5) { | |
/* 25 */ _i++; | |
} | |
else { | |
__5 = true; | |
} | |
; | |
/* 25 */ var __4 = (_i < _len); | |
if (__4) { | |
/* 26 */ rel = rels[_i]; | |
/* 27 */ return rel["delete"](__cb(_, function(__0, __2) { | |
/* 27 */ _results.push(__2); | |
__loop(); | |
})); | |
} | |
else { | |
__break(); | |
} | |
; | |
}); | |
__loop(); | |
})(function() { | |
/* 29 */ return _(null, _results); | |
}); | |
})); | |
}, __this); | |
/* 31 */ return deleteRel(FollowEvent.REL_SOURCE, __cb(_, function() { | |
/* 32 */ return deleteRel(FollowEvent.REL_TARGET, __cb(_, function() { | |
/* 33 */ Event.prototype["delete"].apply(__this, __arguments); | |
/* 34 */ return _(null, console.log((("finished deleting follow " + __this) + "."))); | |
})); | |
})); | |
}; | |
/* 36 */ return FollowEvent; | |
/* 37 */ })(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module.exports = class FollowEvent extends Event | |
# Overrides | |
delete: (_, force=false) -> | |
console.log "about to delete follow #{@}..." | |
# Manually and explicitly delete the source and target relationships | |
# first. TODO eventually parallelize, but not a big deal. | |
deleteRel = (rel, _) => | |
rels = @_getRelationships rel, _ | |
rel.delete _ for rel in rels | |
deleteRel FollowEvent.REL_SOURCE, _ | |
deleteRel FollowEvent.REL_TARGET, _ | |
# Then delete this node: | |
# XXX can't use super here; streamline makes this func anonymous... | |
Event::delete.apply this, arguments | |
console.log "finished deleting follow #{@}." |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var FollowEvent; | |
var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { | |
for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } | |
function ctor() { this.constructor = child; } | |
ctor.prototype = parent.prototype; | |
child.prototype = new ctor; | |
child.__super__ = parent.prototype; | |
return child; | |
}, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; | |
module.exports = FollowEvent = (function() { | |
__extends(FollowEvent, Event); | |
function FollowEvent() { | |
FollowEvent.__super__.constructor.apply(this, arguments); | |
} | |
FollowEvent.prototype["delete"] = function(_, force) { | |
var deleteRel; | |
if (force == null) { | |
force = false; | |
} | |
console.log("about to delete follow " + this + "..."); | |
deleteRel = __bind(function(rel, _) { | |
var rels, _i, _len, _results; | |
rels = this._getRelationships(rel, _); | |
_results = []; | |
for (_i = 0, _len = rels.length; _i < _len; _i++) { | |
rel = rels[_i]; | |
_results.push(rel["delete"](_)); | |
} | |
return _results; | |
}, this); | |
deleteRel(FollowEvent.REL_SOURCE, _); | |
deleteRel(FollowEvent.REL_TARGET, _); | |
Event.prototype["delete"].apply(this, arguments); | |
return console.log("finished deleting follow " + this + "."); | |
}; | |
return FollowEvent; | |
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var __global = typeof global !== 'undefined' ? global : window; | |
function __cb(_, fn){ var ctx = __global.__context; return function(err, result){ __global.__context = ctx; if (err) return _(err); try { return fn(null, result); } catch (ex) { return __propagate(_, ex); } } } | |
function __future(fn, args, i){ var done, err, result; var cb = function(e, r){ done = true; err = e, result = r; }; args = Array.prototype.slice.call(args); args[i] = function(e, r){ cb(e, r); }; fn.apply(this, args); return function(_){ if (done) _.call(this, err, result); else cb = _.bind(this); } .bind(this); } | |
function __nt(_, fn){ var i = 0; var cb = __cb(_, fn); var safeCb = function(){ try { cb(); } catch (ex) { __propagate(cb, ex); } }; if (typeof process != "undefined" && typeof process.nextTick == "function") return function(){ if (++i % 20 == 0) process.nextTick(safeCb); else cb(); }; else return function(){ if (++i % 20 == 0) setTimeout(safeCb); else cb(); }; } | |
function __propagate(_, err){ try { _(err); } catch (ex) { __trap(ex); } } | |
function __trap(err){ if (err) { if (__global.__context && __global.__context.errorHandler) __global.__context.errorHandler(err); else console.error("UNCAUGHT EXCEPTION: " + err.message + "\n" + err.stack); } } | |
function __tryCatch(_, fn){ try { fn(); } catch (e) { try { _(e); } catch (ex) { __trap(ex); } } } | |
/* 1 */ var Node; | |
/* 2 */ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { | |
/* 3 */ for (var key in parent) { | |
/* 3 */ if (__hasProp.call(parent, key)) { | |
/* 3 */ child[key] = parent[key]; | |
}; | |
}; | |
/* 4 */ function ctor() { | |
/* 4 */ this.constructor = child; | |
}; | |
/* 5 */ ctor.prototype = parent.prototype; | |
/* 6 */ child.prototype = new ctor; | |
/* 7 */ child.__super__ = parent.prototype; | |
/* 8 */ return child; | |
}; | |
/* 10 */ module.exports = Node = (function() { | |
/* 11 */ __extends(Node, PropertyContainer); | |
/* 12 */ function Node() { | |
/* 13 */ Node.__super__.constructor.apply(this, arguments); | |
}; | |
/* 15 */ Node.prototype["delete"] = function __1(_, force) { | |
if (!_) { | |
return __future.call(this, __1, arguments, 0); | |
} | |
; | |
var message, relationship, relationships, response, _i, _len, __this = this; | |
/* 17 */ if ((force == null)) { | |
/* 18 */ force = false; | |
} | |
; | |
/* 20 */ if (!__this.exists) { | |
return _(null); | |
} | |
; | |
/* 23 */ console.log((("about to delete " + __this) + "...")); | |
return (function(__then) { | |
(function(_) { | |
__tryCatch(_, function() { | |
/* 25 */ return __this.all(null, __cb(_, function(__0, __1) { | |
/* 25 */ relationships = __1; | |
/* 26 */ if ((relationships.length && !force)) { | |
/* 27 */ return _(new Error((("Could not delete " + __this) + "; still has relationships."))); | |
} | |
; | |
/* 29 */ _i = 0; | |
/* 29 */ _len = relationships.length; | |
var __5 = false; | |
return (function(__break) { | |
var __loop = __nt(_, function() { | |
if (__5) { | |
/* 29 */ _i++; | |
} | |
else { | |
__5 = true; | |
} | |
; | |
/* 29 */ var __4 = (_i < _len); | |
if (__4) { | |
/* 30 */ relationship = relationships[_i]; | |
/* 31 */ return relationship["delete"](__cb(_, __loop)); | |
} | |
else { | |
__break(); | |
} | |
; | |
}); | |
__loop(); | |
})(function() { | |
/* 33 */ return request.del(__this.self, __cb(_, function(__0, __2) { | |
/* 33 */ response = __2; | |
/* 34 */ if ((response.statusCode !== status.NO_CONTENT)) { | |
/* 35 */ message = ""; | |
/* 36 */ switch (response.statusCode) { | |
/* 37 */ case status.NOT_FOUND: | |
/* 37 */ message = "Node not found"; | |
/* 38 */ break; | |
/* 39 */ case status.CONFLICT: | |
message = "Node could not be deleted (still has relationships?)"; | |
/* 40 */ }; | |
/* 40 */ return _(new Error(message)); | |
/* 41 */ } | |
; | |
console.log((("finished deleting " + __this) + ".")); | |
/* 43 */ __then(); | |
})); | |
}); | |
/* 45 */ })); | |
}); | |
})(function(error, __result) { | |
__tryCatch(_, function() { | |
if (error) { | |
return _(adjustError(error)); | |
} | |
else { | |
_(null, __result); | |
/* 47 */ } | |
; | |
}); | |
}); | |
})(function() { | |
__tryCatch(_, _); | |
}); | |
}; | |
return Node; | |
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module.exports = class Node extends PropertyContainer | |
# throws an error if this node has any relationships on it, unless force | |
# is true, in which case the relationships are also deleted. | |
delete: (_, force=false) -> | |
if not @exists | |
return | |
console.log "about to delete #{@}..." | |
try | |
# Does this node have any relationships on it? | |
relationships = @all null, _ | |
# If so, and it's not expected, prevent mistakes! | |
if relationships.length and not force | |
throw new Error "Could not delete #{@}; still has relationships." | |
# Otherwise, if there are any, delete the relationships | |
# TODO parallelize using Streamline | |
for relationship in relationships | |
relationship.delete _ | |
# Delete node | |
response = request.del @self, _ | |
if response.statusCode isnt status.NO_CONTENT | |
# database error | |
message = '' | |
switch response.statusCode | |
when status.NOT_FOUND | |
message = 'Node not found' | |
when status.CONFLICT | |
message = 'Node could not be deleted (still has relationships?)' | |
throw new Error message | |
# success | |
console.log "finished deleting #{@}." | |
return | |
catch error | |
throw adjustError error |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Node; | |
var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { | |
for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } | |
function ctor() { this.constructor = child; } | |
ctor.prototype = parent.prototype; | |
child.prototype = new ctor; | |
child.__super__ = parent.prototype; | |
return child; | |
}; | |
module.exports = Node = (function() { | |
__extends(Node, PropertyContainer); | |
function Node() { | |
Node.__super__.constructor.apply(this, arguments); | |
} | |
Node.prototype["delete"] = function(_, force) { | |
var message, relationship, relationships, response, _i, _len; | |
if (force == null) { | |
force = false; | |
} | |
if (!this.exists) { | |
return; | |
} | |
console.log("about to delete " + this + "..."); | |
try { | |
relationships = this.all(null, _); | |
if (relationships.length && !force) { | |
throw new Error("Could not delete " + this + "; still has relationships."); | |
} | |
for (_i = 0, _len = relationships.length; _i < _len; _i++) { | |
relationship = relationships[_i]; | |
relationship["delete"](_); | |
} | |
response = request.del(this.self, _); | |
if (response.statusCode !== status.NO_CONTENT) { | |
message = ''; | |
switch (response.statusCode) { | |
case status.NOT_FOUND: | |
message = 'Node not found'; | |
break; | |
case status.CONFLICT: | |
message = 'Node could not be deleted (still has relationships?)'; | |
} | |
throw new Error(message); | |
} | |
console.log("finished deleting " + this + "."); | |
} catch (error) { | |
throw adjustError(error); | |
} | |
}; | |
return Node; | |
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*** Generated by streamline 0.1.35 - DO NOT EDIT ***/ | |
var __global = typeof global !== 'undefined' ? global : window; | |
function __cb(_, fn){ var ctx = __global.__context; return function(err, result){ __global.__context = ctx; if (err) return _(err); try { return fn(null, result); } catch (ex) { return __propagate(_, ex); } } } | |
function __nt(_, fn){ var i = 0; var cb = __cb(_, fn); var safeCb = function(){ try { cb(); } catch (ex) { __propagate(cb, ex); } }; if (typeof process != "undefined" && typeof process.nextTick == "function") return function(){ if (++i % 20 == 0) process.nextTick(safeCb); else cb(); }; else return function(){ if (++i % 20 == 0) setTimeout(safeCb); else cb(); }; } | |
function __propagate(_, err){ try { _(err); } catch (ex) { __trap(ex); } } | |
function __trap(err){ if (err) { if (__global.__context && __global.__context.errorHandler) __global.__context.errorHandler(err); else console.error("UNCAUGHT EXCEPTION: " + err.message + "\n" + err.stack); } } | |
(function __main(_) { | |
var FollowEvent, Model, User, assert, count, event, events, follow, follows, future, futures, i, models, neo4j, user, users, _i, _j, _k, _len, _len2, _len3, _len4; | |
/* 2 */ assert = require("assert"); | |
/* 3 */ models = require("thingdom-models"); | |
/* 4 */ neo4j = require("neo4j"); | |
/* 5 */ Model = models.Model; | |
/* 6 */ User = models.User; | |
/* 7 */ FollowEvent = models.FollowEvent; | |
/* 8 */ console.log("Fetching users..."); | |
/* 9 */ return User.all(__cb(_, function(__0, __5) { | |
/* 9 */ users = __5; | |
/* 10 */ console.log((("Found " + users.length) + " users; fetching follows...")); | |
/* 22 */ return (function __1(_) { | |
var _i, _len, _results; | |
/* 13 */ _results = []; | |
/* 14 */ for (_i = 0, _len = users.length; (_i < _len); _i++) { | |
/* 15 */ user = users[_i]; | |
/* 16 */ _results.push(user._getRelationships({ | |
/* 17 */ type: User.REL_FOLLOWS, | |
/* 18 */ direction: Model.DIR_OUT | |
})); | |
}; | |
/* 21 */ return _(null, _results); | |
/* 22 */ })(__cb(_, function(__0, __6) { | |
/* 11 */ futures = __6; | |
/* 23 */ follows = []; | |
/* 24 */ _i = 0; | |
/* 24 */ _len = futures.length; | |
var __16 = false; | |
return (function(__break) { | |
var __loop = __nt(_, function() { | |
if (__16) { | |
/* 24 */ _i++; | |
} | |
else { | |
__16 = true; | |
} | |
; | |
/* 24 */ var __15 = (_i < _len); | |
if (__15) { | |
/* 25 */ future = futures[_i]; | |
/* 26 */ return future(__cb(_, function(__0, __7) { | |
/* 26 */ follows = follows.concat(__7); | |
__loop(); | |
})); | |
} | |
else { | |
__break(); | |
} | |
; | |
}); | |
__loop(); | |
})(function() { | |
/* 28 */ console.log((("Found " + follows.length) + " follows; deleting...")); | |
/* 37 */ return (function __2(_) { | |
var _j, _len2, _results; | |
/* 31 */ _results = []; | |
/* 32 */ for (_j = 0, _len2 = follows.length; (_j < _len2); _j++) { | |
/* 33 */ follow = follows[_j]; | |
/* 34 */ _results.push(follow["delete"]()); | |
}; | |
/* 36 */ return _(null, _results); | |
/* 37 */ })(__cb(_, function(__0, __8) { | |
/* 29 */ futures = __8; | |
/* 38 */ _j = 0; | |
/* 38 */ _len2 = futures.length; | |
var __20 = false; | |
return (function(__break) { | |
var __loop = __nt(_, function() { | |
if (__20) { | |
/* 38 */ _j++; | |
} | |
else { | |
__20 = true; | |
} | |
; | |
/* 38 */ var __19 = (_j < _len2); | |
if (__19) { | |
/* 39 */ future = futures[_j]; | |
/* 40 */ return future(__cb(_, __loop)); | |
} | |
else { | |
__break(); | |
} | |
; | |
}); | |
__loop(); | |
})(function() { | |
/* 42 */ console.log("Fetching follow events..."); | |
/* 43 */ return FollowEvent.all(__cb(_, function(__0, __9) { | |
/* 43 */ events = __9; | |
/* 44 */ return Model.getAll("kind", "followChange", __cb(_, function(__0, __10) { | |
/* 44 */ events = events.concat(__10); | |
/* 45 */ console.log((("Found " + events.length) + " events; deleting...")); | |
/* 54 */ return (function __3(_) { | |
var _k, _len3, _results; | |
/* 48 */ _results = []; | |
/* 49 */ for (_k = 0, _len3 = events.length; (_k < _len3); _k++) { | |
/* 50 */ event = events[_k]; | |
/* 51 */ _results.push(event["delete"]()); | |
}; | |
/* 53 */ return _(null, _results); | |
/* 54 */ })(__cb(_, function(__0, __11) { | |
/* 46 */ futures = __11; | |
/* 55 */ console.log("entering second delete loop"); | |
/* 56 */ i = 0; | |
/* 56 */ _len3 = futures.length; | |
var __26 = false; | |
return (function(__break) { | |
var __loop = __nt(_, function() { | |
console.log("INSIDE, i=" + i + ", _len3=" + _len3); | |
if (__26) { | |
/* 56 */ i++; | |
} | |
else { | |
__26 = true; | |
} | |
; | |
/* 56 */ var __25 = (i < _len3); | |
if (__25) { | |
/* 57 */ future = futures[i]; | |
/* 58 */ console.log(("about to delete " + i)); | |
/* 59 */ return future(__cb(_, function() { | |
/* 60 */ console.log(("finished deleting " + i)); | |
__loop(); | |
})); | |
} | |
else { | |
__break(); | |
} | |
; | |
}); | |
__loop(); | |
})(function() { | |
/* 62 */ console.log("Resetting user followers/following stats..."); | |
/* 63 */ count = 0; | |
/* 77 */ return (function __4(_) { | |
var _k, _len4, _results; | |
/* 66 */ _results = []; | |
/* 67 */ for (_k = 0, _len4 = users.length; (_k < _len4); _k++) { | |
/* 68 */ user = users[_k]; | |
/* 69 */ if ((user.stats.numFollowers || user.stats.numFollowing)) { | |
/* 70 */ count++; | |
/* 71 */ user.stats.numFollowers = 0; | |
/* 72 */ user.stats.numFollowing = 0; | |
} | |
; | |
/* 74 */ _results.push(user.save()); | |
}; | |
/* 76 */ return _(null, _results); | |
/* 77 */ })(__cb(_, function(__0, __12) { | |
/* 64 */ futures = __12; | |
/* 78 */ _k = 0; | |
/* 78 */ _len4 = futures.length; | |
var __30 = false; | |
return (function(__break) { | |
var __loop = __nt(_, function() { | |
if (__30) { | |
/* 78 */ _k++; | |
} | |
else { | |
__30 = true; | |
} | |
; | |
/* 78 */ var __29 = (_k < _len4); | |
if (__29) { | |
/* 79 */ future = futures[_k]; | |
/* 80 */ return future(__cb(_, __loop)); | |
} | |
else { | |
__break(); | |
} | |
; | |
}); | |
__loop(); | |
})(function() { | |
/* 82 */ console.log((("Done! " + count) + " users' stats reset.")); | |
_(); | |
}); | |
})); | |
}); | |
})); | |
})); | |
})); | |
}); | |
})); | |
}); | |
})); | |
})); | |
}).call(this, __trap); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env coffee-streamline | |
# | |
# unfollow_.coffee | |
# Removes all existing follow connections and follow/unfollow events. | |
assert = require 'assert' | |
models = require './models_' | |
neo4j = require 'neo4j' | |
Model = models.Model | |
User = models.User | |
FollowEvent = models.FollowEvent | |
# first fetch all users: | |
console.log "Fetching users..." | |
users = User.all _ | |
# then get each user's follows relationships in parallel: | |
console.log "Found #{users.length} users; fetching follows..." | |
futures = for user in users | |
user.getFollows() | |
follows = [] | |
for future in futures | |
follows = follows.concat future _ | |
# then delete each follows relationship in parallel: | |
console.log "Found #{follows.length} follows; deleting..." | |
futures = for follow in follows | |
follow.delete() | |
future _ for future in futures | |
# then fetch all follow events... | |
console.log "Fetching follow events..." | |
events = FollowEvent.all _ | |
# then delete these events in parallel: | |
console.log "Found #{events.length} events; deleting..." | |
futures = for event in events | |
event.delete() | |
console.log 'entering second delete loop' | |
for future, i in futures | |
console.log "about to delete #{i}" | |
future _ | |
console.log "finished deleting #{i}" | |
# finally, reset user stats: | |
console.log "Resetting user followers/following stats..." | |
count = 0 | |
futures = for user in users | |
if user.stats.numFollowers or user.stats.numFollowing | |
count++ | |
user.stats.numFollowers = 0 | |
user.stats.numFollowing = 0 | |
user.save() | |
future _ for future in futures | |
console.log "Done! #{count} users' stats reset." |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var FollowEvent, Model, User, assert, count, event, events, follow, follows, future, futures, i, models, neo4j, user, users, _i, _j, _k, _len, _len2, _len3, _len4; | |
assert = require('assert'); | |
models = require('./models_'); | |
neo4j = require('neo4j'); | |
Model = models.Model; | |
User = models.User; | |
FollowEvent = models.FollowEvent; | |
console.log("Fetching users..."); | |
users = User.all(_); | |
console.log("Found " + users.length + " users; fetching follows..."); | |
futures = (function() { | |
var _i, _len, _results; | |
_results = []; | |
for (_i = 0, _len = users.length; _i < _len; _i++) { | |
user = users[_i]; | |
_results.push(user.getFollows()); | |
} | |
return _results; | |
})(); | |
follows = []; | |
for (_i = 0, _len = futures.length; _i < _len; _i++) { | |
future = futures[_i]; | |
follows = follows.concat(future(_)); | |
} | |
console.log("Found " + follows.length + " follows; deleting..."); | |
futures = (function() { | |
var _j, _len2, _results; | |
_results = []; | |
for (_j = 0, _len2 = follows.length; _j < _len2; _j++) { | |
follow = follows[_j]; | |
_results.push(follow["delete"]()); | |
} | |
return _results; | |
})(); | |
for (_j = 0, _len2 = futures.length; _j < _len2; _j++) { | |
future = futures[_j]; | |
future(_); | |
} | |
console.log("Fetching follow events..."); | |
events = FollowEvent.all(_); | |
console.log("Found " + events.length + " events; deleting..."); | |
futures = (function() { | |
var _k, _len3, _results; | |
_results = []; | |
for (_k = 0, _len3 = events.length; _k < _len3; _k++) { | |
event = events[_k]; | |
_results.push(event["delete"]()); | |
} | |
return _results; | |
})(); | |
console.log('entering second delete loop'); | |
for (i = 0, _len3 = futures.length; i < _len3; i++) { | |
future = futures[i]; | |
console.log("about to delete " + i); | |
future(_); | |
console.log("finished deleting " + i); | |
} | |
console.log("Resetting user followers/following stats..."); | |
count = 0; | |
futures = (function() { | |
var _k, _len4, _results; | |
_results = []; | |
for (_k = 0, _len4 = users.length; _k < _len4; _k++) { | |
user = users[_k]; | |
if (user.stats.numFollowers || user.stats.numFollowing) { | |
count++; | |
user.stats.numFollowers = 0; | |
user.stats.numFollowing = 0; | |
} | |
_results.push(user.save()); | |
} | |
return _results; | |
})(); | |
for (_k = 0, _len4 = futures.length; _k < _len4; _k++) { | |
future = futures[_k]; | |
future(_); | |
} | |
console.log("Done! " + count + " users' stats reset."); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Fetching users... | |
Found 68 users; fetching follows... | |
Found 44 follows; deleting... | |
Fetching follow events... | |
Found 46 events; deleting... | |
about to delete follow event @1880... | |
about to delete follow event @1939... | |
about to delete follow event @1940... | |
about to delete follow event @1938... | |
about to delete follow event @1937... | |
about to delete follow event @1936... | |
about to delete follow event @1935... | |
about to delete follow event @1934... | |
about to delete follow event @1933... | |
about to delete follow event @1932... | |
about to delete follow event @1929... | |
about to delete follow event @1928... | |
about to delete follow event @1930... | |
about to delete follow event @1931... | |
about to delete follow event @1927... | |
about to delete follow event @1896... | |
about to delete follow event @1873... | |
about to delete follow event @1874... | |
about to delete follow event @1922... | |
about to delete follow event @1872... | |
about to delete follow event @1871... | |
about to delete follow event @1870... | |
about to delete follow event @1869... | |
about to delete follow event @1868... | |
about to delete follow event @1867... | |
about to delete follow event @1866... | |
about to delete follow event @1864... | |
about to delete follow event @1863... | |
about to delete follow event @1865... | |
about to delete follow event @1862... | |
about to delete follow event @1861... | |
about to delete follow event @1860... | |
about to delete follow event @1858... | |
about to delete follow event @1859... | |
about to delete follow event @1857... | |
about to delete follow event @1851... | |
about to delete follow event @1854... | |
about to delete follow event @1855... | |
about to delete follow event @1856... | |
about to delete follow event @1850... | |
about to delete follow event @1849... | |
about to delete follow event @1846... | |
about to delete follow event @1845... | |
about to delete follow event @1848... | |
about to delete follow event @1847... | |
about to delete follow event @1844... | |
entering second delete loop | |
INSIDE, i=0, _len3=46 | |
about to delete 0 | |
finished deleting follow event @1940. | |
finished deleting follow event @1880. | |
finished deleting 0 | |
INSIDE, i=0, _len3=46 | |
about to delete 1 | |
finished deleting follow event @1937. | |
finished deleting follow event @1939. | |
finished deleting 1 | |
INSIDE, i=1, _len3=46 | |
about to delete 2 | |
finished deleting 2 | |
INSIDE, i=2, _len3=46 | |
about to delete 3 | |
finished deleting follow event @1938. | |
finished deleting 3 | |
INSIDE, i=3, _len3=46 | |
about to delete 4 | |
finished deleting 4 | |
INSIDE, i=4, _len3=46 | |
about to delete 5 | |
finished deleting follow event @1936. | |
finished deleting 5 | |
INSIDE, i=5, _len3=46 | |
about to delete 6 | |
finished deleting follow event @1933. | |
finished deleting follow event @1935. | |
finished deleting 6 | |
INSIDE, i=6, _len3=46 | |
about to delete 7 | |
finished deleting follow event @1929. | |
finished deleting follow event @1928. | |
finished deleting follow event @1934. | |
finished deleting 7 | |
INSIDE, i=7, _len3=46 | |
about to delete 8 | |
finished deleting 8 | |
INSIDE, i=8, _len3=46 | |
about to delete 9 | |
finished deleting follow event @1932. | |
finished deleting 9 | |
INSIDE, i=9, _len3=46 | |
about to delete 10 | |
finished deleting 10 | |
INSIDE, i=10, _len3=46 | |
about to delete 11 | |
finished deleting 11 | |
INSIDE, i=11, _len3=46 | |
about to delete 12 | |
finished deleting follow event @1931. | |
finished deleting follow event @1930. | |
finished deleting 12 | |
INSIDE, i=12, _len3=46 | |
about to delete 13 | |
finished deleting 13 | |
INSIDE, i=13, _len3=46 | |
about to delete 14 | |
finished deleting follow event @1927. | |
finished deleting 14 | |
INSIDE, i=14, _len3=46 | |
about to delete 15 | |
finished deleting follow event @1873. | |
finished deleting follow event @1874. | |
finished deleting follow event @1872. | |
finished deleting follow event @1896. | |
finished deleting 15 | |
INSIDE, i=15, _len3=46 | |
about to delete 16 | |
finished deleting 16 | |
INSIDE, i=16, _len3=46 | |
about to delete 17 | |
finished deleting 17 | |
INSIDE, i=17, _len3=46 | |
about to delete 18 | |
finished deleting follow event @1922. | |
finished deleting 18 | |
INSIDE, i=18, _len3=46 | |
about to delete 19 | |
finished deleting 19 | |
INSIDE, i=19, _len3=46 | |
about to delete 20 | |
finished deleting follow event @1870. | |
finished deleting follow event @1868. | |
finished deleting follow event @1871. | |
finished deleting 20 | |
INSIDE, i=20, _len3=46 | |
about to delete 21 | |
finished deleting 21 | |
INSIDE, i=21, _len3=46 | |
about to delete 22 | |
finished deleting follow event @1869. | |
finished deleting 22 | |
INSIDE, i=22, _len3=46 | |
about to delete 23 | |
finished deleting 23 | |
INSIDE, i=23, _len3=46 | |
about to delete 24 | |
finished deleting follow event @1863. | |
finished deleting follow event @1866. | |
finished deleting follow event @1867. | |
finished deleting 24 | |
INSIDE, i=24, _len3=46 | |
about to delete 25 | |
finished deleting 25 | |
INSIDE, i=25, _len3=46 | |
about to delete 26 | |
finished deleting follow event @1864. | |
finished deleting 26 | |
INSIDE, i=26, _len3=46 | |
about to delete 27 | |
finished deleting 27 | |
INSIDE, i=27, _len3=46 | |
about to delete 28 | |
finished deleting follow event @1865. | |
finished deleting 28 | |
INSIDE, i=28, _len3=46 | |
about to delete 29 | |
finished deleting follow event @1862. | |
finished deleting 29 | |
INSIDE, i=29, _len3=46 | |
about to delete 30 | |
finished deleting follow event @1861. | |
finished deleting 30 | |
INSIDE, i=30, _len3=46 | |
about to delete 31 | |
finished deleting follow event @1860. | |
finished deleting 31 | |
INSIDE, i=31, _len3=46 | |
about to delete 32 | |
finished deleting follow event @1857. | |
finished deleting follow event @1859. | |
finished deleting follow event @1858. | |
finished deleting 32 | |
INSIDE, i=32, _len3=46 | |
about to delete 33 | |
finished deleting 33 | |
INSIDE, i=33, _len3=46 | |
about to delete 34 | |
finished deleting 34 | |
INSIDE, i=34, _len3=46 | |
about to delete 35 | |
finished deleting follow event @1851. | |
finished deleting 35 | |
INSIDE, i=35, _len3=46 | |
about to delete 36 | |
finished deleting follow event @1855. | |
finished deleting follow event @1854. | |
finished deleting 36 | |
INSIDE, i=36, _len3=46 | |
about to delete 37 | |
finished deleting 37 | |
INSIDE, i=37, _len3=46 | |
about to delete 38 | |
finished deleting follow event @1850. | |
finished deleting follow event @1849. | |
finished deleting follow event @1856. | |
finished deleting 38 | |
INSIDE, i=38, _len3=46 | |
about to delete 39 | |
finished deleting 39 | |
INSIDE, i=39, _len3=46 | |
about to delete 40 | |
finished deleting 40 | |
INSIDE, i=40, _len3=46 | |
about to delete 41 | |
finished deleting follow event @1845. | |
about to delete node @1940... | |
finished deleting follow event @1848. | |
finished deleting follow event @1846. | |
finished deleting 41 | |
INSIDE, i=41, _len3=46 | |
about to delete 42 | |
finished deleting 42 | |
INSIDE, i=42, _len3=46 | |
about to delete 43 | |
finished deleting 43 | |
INSIDE, i=43, _len3=46 | |
about to delete 44 | |
about to delete node @1937... | |
about to delete node @1880... | |
finished deleting follow event @1847. | |
finished deleting 44 | |
INSIDE, i=44, _len3=46 | |
about to delete 45 | |
about to delete node @1936... | |
about to delete node @1938... | |
about to delete node @1939... | |
about to delete node @1933... | |
finished deleting follow event @1844. | |
finished deleting 45 | |
INSIDE, i=45, _len3=46 | |
Resetting user followers/following stats... | |
about to delete node @1935... | |
about to delete node @1928... | |
about to delete node @1929... | |
about to delete node @1931... | |
about to delete node @1932... | |
about to delete node @1934... | |
about to delete node @1930... | |
about to delete node @1927... | |
about to delete node @1874... | |
about to delete node @1922... | |
about to delete node @1896... | |
about to delete node @1872... | |
about to delete node @1873... | |
about to delete node @1870... | |
about to delete node @1868... | |
about to delete node @1871... | |
about to delete node @1869... | |
about to delete node @1866... | |
about to delete node @1863... | |
about to delete node @1867... | |
about to delete node @1864... | |
about to delete node @1865... | |
about to delete node @1861... | |
about to delete node @1862... | |
about to delete node @1860... | |
about to delete node @1857... | |
about to delete node @1859... | |
about to delete node @1858... | |
about to delete node @1851... | |
about to delete node @1855... | |
about to delete node @1854... | |
about to delete node @1850... | |
about to delete node @1849... | |
about to delete node @1856... | |
about to delete node @1845... | |
about to delete node @1848... | |
about to delete node @1846... | |
finished deleting node @1940. | |
about to delete node @1847... | |
finished deleting node @1937. | |
finished deleting node @1936. | |
finished deleting 46 | |
INSIDE, i=46, _len3=46 | |
Resetting user followers/following stats... | |
finished deleting node @1933. | |
finished deleting node @1939. | |
finished deleting 47 | |
INSIDE, i=47, _len3=46 | |
Resetting user followers/following stats... | |
finished deleting node @1938. | |
finished deleting 48 | |
INSIDE, i=48, _len3=46 | |
Resetting user followers/following stats... | |
finished deleting node @1880. | |
finished deleting 49 | |
INSIDE, i=49, _len3=46 | |
Resetting user followers/following stats... | |
about to delete node @1844... | |
finished deleting node @1935. | |
finished deleting 50 | |
INSIDE, i=50, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1932. | |
finished deleting 51 | |
INSIDE, i=51, _len3=46 | |
Resetting user followers/following stats... | |
finished deleting node @1928. | |
Done! 0 users' stats reset. | |
finished deleting node @1931. | |
finished deleting node @1929. | |
finished deleting node @1934. | |
finished deleting 52 | |
INSIDE, i=52, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1930. | |
finished deleting 53 | |
INSIDE, i=53, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1927. | |
finished deleting 54 | |
INSIDE, i=54, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1874. | |
finished deleting node @1896. | |
finished deleting 55 | |
INSIDE, i=55, _len3=46 | |
Resetting user followers/following stats... | |
finished deleting node @1922. | |
finished deleting 56 | |
INSIDE, i=56, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
Done! 0 users' stats reset. | |
finished deleting node @1870. | |
finished deleting node @1873. | |
finished deleting node @1872. | |
finished deleting node @1868. | |
finished deleting node @1866. | |
finished deleting node @1869. | |
finished deleting 57 | |
INSIDE, i=57, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1863. | |
finished deleting node @1871. | |
finished deleting 58 | |
INSIDE, i=58, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1867. | |
finished deleting 59 | |
INSIDE, i=59, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1864. | |
finished deleting 60 | |
INSIDE, i=60, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1865. | |
finished deleting 61 | |
INSIDE, i=61, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1861. | |
finished deleting 62 | |
INSIDE, i=62, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1862. | |
finished deleting 63 | |
INSIDE, i=63, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1860. | |
finished deleting 64 | |
INSIDE, i=64, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1857. | |
finished deleting node @1859. | |
finished deleting node @1858. | |
finished deleting 65 | |
INSIDE, i=65, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1851. | |
finished deleting 66 | |
INSIDE, i=66, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1855. | |
finished deleting node @1854. | |
finished deleting 67 | |
INSIDE, i=67, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1850. | |
finished deleting node @1849. | |
finished deleting node @1856. | |
finished deleting 68 | |
INSIDE, i=68, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1845. | |
finished deleting node @1848. | |
finished deleting node @1846. | |
finished deleting 69 | |
INSIDE, i=69, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
finished deleting node @1847. | |
finished deleting 70 | |
INSIDE, i=70, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. | |
Done! 0 users' stats reset. | |
Done! 0 users' stats reset. | |
Done! 0 users' stats reset. | |
Done! 0 users' stats reset. | |
Done! 0 users' stats reset. | |
finished deleting node @1844. | |
finished deleting 71 | |
INSIDE, i=71, _len3=46 | |
Resetting user followers/following stats... | |
Done! 0 users' stats reset. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment